こんにちはga-です。
今回はじめてgithub Actionsで作ったものを紹介します。
背景
version1,version2,version3と後ろになればなるほど機能が多いプロジェクトがあるとします。
version1はメイン機能,version2は検索機能を追加、version3はそれにさらに履歴機能を追加しているとします。
version1,2,3はそれぞれrelease時期は違いますが現在同時に開発が進んでいます。
version1開発時に重大なバグを発見したとき、後続するversion2,3はそれの影響を受けるので
version1が修正されたらその内容をmergeしたいと思います。
その作業手作業だと面倒ですよね?
じゃあ自動化しましょう。
あとmergeにはconflictはつきものですよね?
じゃあ通知してもらいましょう。
材料
自動マージ用
- GithubActions
- Githubのブランチ
- main(一番最初にリリースされるやつ)
- develop(一番最初にリリースされるやつの開発ブランチ)
- develop_v2(二番目にリリースされるやつの開発ブランチ)
- develop_v3(三番目にリリースされるやつの開発ブランチ)
ミスったら通知もらう用
- slack
- アカウント
- 好きにいじってもいいチャネル
- webhook
- GithubActions
作り方(自動マージ編)
それでは早速ですがMerge branchの処理は以下です。
(といってもほぼmerge branchのREADMEですが。。。。)
やりたいことは
main
-> develop
-> develop_v2
-> develop_v3
と変更をmergeさせていきたいので
例えばdevelop_v2
で変更があったときにはdevelop_v3
にだけmergeをするように制御をかけておきます。
name: Sync multiple branches
on:
push:
jobs:
sync-branch:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Merge main -> develop
# ここでpush(pullrequest merge)されたブランチがmainかどうかみる
if: github.ref == 'refs/heads/main'
uses: devmasx/merge-branch@v1.3.1
with:
type: now
from_branch: main
target_branch: develop
github_token: ${{ github.token }}
- name: Merge develop -> develop_v2
# ここでpush(pullrequest merge)されたブランチが`main`または`develop`かどうかみる
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
uses: devmasx/merge-branch@v1.3.1
with:
type: now
from_branch: develop
target_branch: develop_v2
github_token: ${{ github.token }}
- name: Merge develop_v2 -> develop_v3
# ここでpush(pullrequest merge)されたブランチが`main`か`develop`または`develop_v2`かどうかみる
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/develop_v2'
uses: devmasx/merge-branch@v1.3.1
with:
type: now
from_branch: develop_v2
target_branch: develop_v3
github_token: ${{ github.token }}
READMEとほぼ同じです。
違いはmergeパターンを3つしているのとpushされたブランチによってmerge先を制御しているぐらいです。
ブランチを用意しておいて、これをmain(master)ブランチにpushするとGithubActionsが動きます。
(後半に書く予定の通知の処理も入っちゃっていますがとりあえずdevelop3にまで変更が反映されていました。)
mergeに失敗する
上の実装を行うと確かにmain
の変更がdevelop_v3
まで反映されますが、
例えばdevelop_v2
のreadme.mdを変更してpushしたとしましょう。
その後main
のreadme.mdを変更してpushすると当たり前ですがconflictします。
次はそのconflictが起きたときにslackに通知を送ってもらう方法を実装します。
作り方(通知準備編)
webhookの追加
まずはwebhookをslackに入れましょう
slackのチャンネルの上にあるBrowse Slack
の隣にある三点リーダーをクリックして、出てきたメニューの中のAppをクリックします。
次にwebhookで検索
slackに追加
送りたいチャンネルを選択して、Incoming Webhookインテグレーションの追加
その後に出てくる画面のインテグレーションの設定
のWebhook URLをコピーします。
Githubにsecret.SLACK_WEBHOOK
の追加
actionを追加したいrepositoryのSettings
のNew repository secret
をクリック
先ほどWebhookでコピーしたURLをオレンジの部分にペースト
以下は完了の図
作り方(通知を飛ばす)
それでは先ほど作ったauto_merge.yml
をいじっていきます。
- name: Merge main -> develop
と- name: Merge develop -> develop_v2
の間に以下を追加していきます。
- name: Merge main -> develop
# ~~~省略~~~
- name: main -> develop try catch
# この記述は上の処理のstatusがfailureの時のみ動く処理
if: ${{ failure() }}
uses: rtCamp/action-slack-notify@v2
env:
SLACK_TITLE: main to v1 merge failed
SLACK_COLOR: '#3278BD'
SLACK_USERNAME: Merge Failed
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
- name: Merge develop -> develop_v2
# ~~~省略~~~
これだけです。(これもまたreadmeとほぼ変わらない)
これを繰り返すandenv
の冗長な記述をまとめた結果が以下になります。
name: Sync multiple branches
on:
push:
jobs:
sync-branch:
runs-on: ubuntu-latest
# まとめたenv
env:
SLACK_COLOR: '#3278BD'
SLACK_USERNAME: Merge Failed
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
steps:
- uses: actions/checkout@v2
- name: Merge main -> develop
if: github.ref == 'refs/heads/main'
uses: devmasx/merge-branch@v1.3.1
with:
type: now
from_branch: main
target_branch: develop
github_token: ${{ github.token }}
- name: main -> develop try catch
if: ${{ failure() }}
uses: rtCamp/action-slack-notify@v2
env:
SLACK_TITLE: main to v1 merge failed
- name: Merge develop -> develop_v2
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
uses: devmasx/merge-branch@v1.3.1
with:
type: now
from_branch: develop
target_branch: develop_v2
github_token: ${{ github.token }}
- name: develop -> develop_v2 try catch
if: ${{ failure() }}
uses: rtCamp/action-slack-notify@v2
env:
SLACK_TITLE: develop to develop_v2 merge failed
- name: Merge develop_v2 -> develop_v3
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/develop_v2'
uses: devmasx/merge-branch@v1.3.1
with:
type: now
from_branch: develop_v2
target_branch: develop_v3
github_token: ${{ github.token }}
- name: develop_v2 -> develop_v3 try catch
if: ${{ failure() }}
uses: rtCamp/action-slack-notify@v2
env:
SLACK_TITLE: develop_v2 to develop_v3 merge failed
はい完成!!じゃあ早速さっきのconflictしている状態のmainに対してpushしてみましょう
develop -> develop_v2
がconflictでfailureなった結果したのdevelop -> develop_v2 try catch
が動いていますね。
するとmergeに失敗したdevelop -> develop_v2
とdevelop_v2 -> develop_v3
の通知がslackに飛んできましたー
完成です!
messageなどは任意でいじることできるんで好きにいじってみてもいいかもです。party parrotとかめっちゃ出してアラート感とか出してもいいかもですね。
あとはmentionとかつけることもできるんでアレンジ色々できます。
感想
今回はreleaseタイミングが違うversion違いのアプリをmergeしたいときのGithubActions作ってみました。
GithubActionsっていろんな人がライブラリ作ってmarketplaceにあげてくれているんで簡単に自動化とかできていいですね。
エンジニアっぽいことしたい方は一度readmeだけ作ってガンガンやっちゃってみましょう!
上にも書いたけどparty parrotをメッセージに埋め尽くして目をチカチカさせたい。。。
引用
https://github.com/marketplace/actions/slack-notify
https://github.com/marketplace/actions/merge-branch
https://docs.github.com/ja/actions/reference/workflow-syntax-for-github-actions