method

define

v8.0.0 - Show latest stable - Class: Releaser
define()
public

No documentation available.

# File tools/releaser/lib/releaser.rb, line 34
  def define
    directory "#{root}/pkg"

    (FRAMEWORKS + ["rails"]).each do |framework|
      namespace framework do
        task :clean do
          Dir.chdir(root) do
            rm_f gem_path(framework)
          end
        end

        task :update_versions do
          update_versions(framework)
        end

        task gem_path(framework) => [:update_versions, "#{root}/pkg"] do
          dir = if framework == "rails"
            root
          else
            root + framework
          end

          Dir.chdir(dir) do
            sh "gem build #{gemspec(framework)} && mv #{gem_file(framework)} #{root}/pkg/"
          end
        end

        task build: [:clean, gem_path(framework)]
        task install: :build do
          Dir.chdir(root) do
            sh "gem install --pre #{gem_path(framework)}"
          end
        end

        task push: :build do
          Dir.chdir(root) do
            sh "gem push #{gem_path(framework)}#{gem_otp}"

            if File.exist?("#{framework}/package.json")
              Dir.chdir("#{framework}") do
                sh "npm publish --tag #{npm_tag}#{npm_otp}"
              end
            end
          end
        end
      end
    end

    desc "Install gems for all projects."
    task install: FRAMEWORKS.map { |f| "#{f}:install" } + ["rails:install"]

    task :ensure_clean_state do
      if tree_dirty?
        abort "[ABORTING] `git status` reports a dirty tree. Make sure all changes are committed"
      end

      unless ENV["SKIP_TAG"] || inexistent_tag?
        abort "[ABORTING] `git tag` shows that #{tag} already exists. Has this version already\n"               "           been released? Git tagging can be skipped by setting SKIP_TAG=1"
      end
    end

    namespace :changelog do
      task :header do
        require "date"

        (FRAMEWORKS + ["guides"]).each do |fw|
          fname = File.join root, fw, "CHANGELOG.md"
          current_contents = File.read(fname)

          header = "## Rails #{version} (#{Date.today.strftime('%B %d, %Y')}) ##\n\n"
          header += "*   No changes.\n\n\n" if current_contents.start_with?("##")
          contents = header + current_contents
          File.write(fname, contents)
        end
      end
    end

    desc "Build gem files for all projects"
    task build: FRAMEWORKS.map { |f| "#{f}:build" } + ["rails:build"]

    task checksums: :build do
      Dir.chdir(root) do
        puts
        [*FRAMEWORKS, "rails"].each do |fw|
          path = gem_path(fw)
          sha = ::Digest::SHA256.file(path)
          puts "#{sha}  #{path}"
        end
        puts
      end
    end

    task :bundle do
      sh "bundle check"
    end

    desc "Prepare the release"
    task prep_release: %(ensure_clean_state changelog:header build bundle)

    task :check_gh_client do
      sh "gh auth status" do |ok, res|
        unless ok
          raise "GitHub CLI is not logged in. Please run `gh auth login` to log in."
        end
      end
      default_repo = `git config --local --get-regexp '\.gh-resolved$'`.strip
      if !$?.success? || default_repo.empty?
        raise "GitHub CLI does not have a default repo configured. Please run `gh repo set-default rails/rails`"
      end
    end

    task :commit do
      Dir.chdir(root) do
        unless `git status -s`.strip.empty?
          File.open("pkg/commit_message.txt", "w") do |f|
            f.puts "# Preparing for #{version} release\n"
            f.puts
            f.puts "# UNCOMMENT THE LINE ABOVE TO APPROVE THIS COMMIT"
          end

          sh "git add . && git commit --verbose --template=pkg/commit_message.txt"
          rm_f "pkg/commit_message.txt"
        end
      end
    end

    task :tag do
      sh "git push"
      sh "git tag -s -m '#{tag} release' #{tag}"
      sh "git push --tags"
    end

    desc "Create GitHub release"
    task create_release: :check_gh_client do
      Dir.chdir(root) do
        File.write("pkg/#{version}.md", release_notes)

        sh "gh release create --verify-tag #{tag} -t #{version} -F pkg/#{version}.md --draft#{pre_release? ? " --prerelease" : ""}"
      end
    end

    desc "Release all gems and create a tag"
    task release: %(check_gh_client prep_release commit tag create_release)

    task pre_push: [:build, :checksums]

    desc "Push the gem to rubygems.org and the npm package to npmjs.com"
    task push: [:pre_push] + FRAMEWORKS.map { |f| "#{f}:push" } + ["rails:push"]
  end