Github ActionsでMerge branchと slack Notify を使ってみた


こんにちは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をするように制御をかけておきます。

testGithubActions/.github/workflow/auto_merge.yml
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/[email protected]
        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/[email protected]
        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/[email protected]
        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のSettingsNew repository secretをクリック


先ほどWebhookでコピーしたURLをオレンジの部分にペースト

以下は完了の図

作り方(通知を飛ばす)

それでは先ほど作ったauto_merge.ymlをいじっていきます。
- name: Merge main -> develop- name: Merge develop -> develop_v2の間に以下を追加していきます。

testGithubActions/.github/workflow/auto_merge.yml
      - 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の冗長な記述をまとめた結果が以下になります。

testGithubActions/.github/workflow/auto_merge.yml
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/[email protected]
        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/[email protected]
        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/[email protected]
        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_v2develop_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