diff --git a/.gitignore b/.gitignore index 4c49bd7..64fed38 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .env +test diff --git a/README.md b/README.md index 0531574..be0e9d6 100644 --- a/README.md +++ b/README.md @@ -84,3 +84,29 @@ jobs: target_branch: 'develop' github_token: ${{ github.token }} ``` + +### Check merged branch + +Assign label to pull request merged in another branch. + +Run workflow on staging branch, this workflow check if the `GITHUB_SHA` have a pull request, and assign the label 'merged-in-staging' and create a check-run in the merged commit. + +```yaml +name: Set label on merged branch +on: + push: + branches: + - 'staging' +jobs: + merge-branch: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + + - name: check merge in staging + uses: devmasx/merge-branch@v1.3.1 + with: + type: 'merged-label' + label_name: merged-in-staging + github_token: ${{ github.token }} +``` diff --git a/lib/constans.rb b/lib/constans.rb new file mode 100644 index 0000000..3a738d6 --- /dev/null +++ b/lib/constans.rb @@ -0,0 +1,5 @@ +module Constans + TYPE_LABELED = "labeled".freeze + TYPE_NOW = "now".freeze + TYPE_MERGED_LABEL = "merged-label".freeze +end diff --git a/lib/index.rb b/lib/index.rb index ab8d379..117321e 100644 --- a/lib/index.rb +++ b/lib/index.rb @@ -1,6 +1,10 @@ +# frozen_string_literal: true + require 'json' require 'octokit' +require_relative './constans' require_relative './services/merge_branch_service' +require_relative './services/check_merged_branch_service' def presence(value) return nil if value == "" @@ -13,18 +17,26 @@ def presence(value) @github_token = presence(ENV['INPUT_GITHUB_TOKEN']) || presence(ENV['GITHUB_TOKEN']) inputs = { - type: presence(ENV['INPUT_TYPE']) || MergeBrachService::TYPE_LABELED, # labeled | comment | now + type: presence(ENV['INPUT_TYPE']) || Constans::TYPE_LABELED, label_name: ENV['INPUT_LABEL_NAME'], target_branch: ENV['INPUT_TARGET_BRANCH'] } -MergeBrachService.validate_inputs!(inputs) -service = MergeBrachService.new(inputs, @event) - -if service.valid? - @client = Octokit::Client.new(access_token: @github_token) - @client.merge(@repository, inputs[:target_branch], @head_to_merge) - puts "Finish merge branch to #{inputs[:target_branch]}" +@client = Octokit::Client.new(access_token: @github_token) +if inputs[:type] == Constans::TYPE_MERGED_LABEL + LabelMergedBranchService.new(@client, { + sha: @head_to_merge, + label_name: inputs[:label_name], + repo: @repository + }).run else - puts 'Skip' + MergeBrachService.validate_inputs!(inputs) + service = MergeBrachService.new(inputs, @event) + + if service.valid? + @client.merge(@repository, inputs[:target_branch], @head_to_merge) + puts "Finish merge branch to #{inputs[:target_branch]}" + else + puts 'Skip' + end end diff --git a/lib/services/check_merged_branch_service.rb b/lib/services/check_merged_branch_service.rb new file mode 100644 index 0000000..8666196 --- /dev/null +++ b/lib/services/check_merged_branch_service.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +class CheckMergedBranchService + CHECK_BASE_NAME = "merge-branch" + + def initialize(client, sha:, label_name:, repo:) + @client = client + @sha = sha + @label_name = label_name + @repo = repo + end + + def run + if pull_request + create_label + else + puts "Not Pull request found" + end + create_check_run + end + + def commit_sha + return @commit_sha if @commit_sha + + all_commits = @client.commits(@repo, @sha) + if is_merged_commit?(all_commits.first) + @commit_sha = all_commits[1].sha + # puts "Commit sha (no merge) #{@commit_sha}" + else + @commit_sha = @sha + end + end + + def pull_request + return @pull_request if @pull_request + + all_commits = @client.commits(@repo, @sha) + pull_requests = @client.pull_requests(@repo, :state => 'open') + @pull_request = pull_requests&.find{ |item| commit_sha == item.head.sha } + end + + def create_label + puts "Create label #{@label_name} on #{pull_request.number}" + @client.add_labels_to_an_issue(@repo, pull_request.number, [@label_name]) + end + + def create_check_run + url = "/repos/#{@repo}/check-runs" + @client.post(url, { + name: "#{CHECK_BASE_NAME}: #{@label_name}", + head_sha: commit_sha, + status: 'completed', + started_at: Time.now.iso8601, + conclusion: "success", + output: { + title: "#{CHECK_BASE_NAME}: #{@label_name}", + summary: "#{CHECK_BASE_NAME}: #{@label_name}", + annotations: [] + } + }) + end + + def is_merged_commit?(commit) + commit.parents.count >= 2 + end +end diff --git a/lib/services/merge_branch_service.rb b/lib/services/merge_branch_service.rb index cfe7b41..7b83256 100644 --- a/lib/services/merge_branch_service.rb +++ b/lib/services/merge_branch_service.rb @@ -1,8 +1,9 @@ +# frozen_string_literal: true +require_relative '../constans' + class MergeBrachService attr_reader :inputs, :event - - TYPE_LABELED = "labeled".freeze - TYPE_NOW = "now".freeze + include Constans def self.validate_inputs!(target_branch:, type:, label_name:) raise "Invalid type" unless [TYPE_LABELED, TYPE_NOW].include?(type)