Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

check merged branch #10

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.env
test
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/[email protected]
with:
type: 'merged-label'
label_name: merged-in-staging
github_token: ${{ github.token }}
```
5 changes: 5 additions & 0 deletions lib/constans.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Constans
TYPE_LABELED = "labeled".freeze
TYPE_NOW = "now".freeze
TYPE_MERGED_LABEL = "merged-label".freeze
end
30 changes: 21 additions & 9 deletions lib/index.rb
Original file line number Diff line number Diff line change
@@ -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 == ""
Expand All @@ -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
66 changes: 66 additions & 0 deletions lib/services/check_merged_branch_service.rb
Original file line number Diff line number Diff line change
@@ -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
7 changes: 4 additions & 3 deletions lib/services/merge_branch_service.rb
Original file line number Diff line number Diff line change
@@ -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)
Expand Down