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
    - [Merge branch](https://github.com/marketplace/actions/merge-branch)
- Githubのブランチ
    - main(一番最初にリリースされるやつ)
    - develop(一番最初にリリースされるやつの開発ブランチ)
    - develop_v2(二番目にリリースされるやつの開発ブランチ)
    - develop_v3(三番目にリリースされるやつの開発ブランチ)

### ミスったら通知もらう用
- slack
    - アカウント
    - 好きにいじってもいいチャネル
    - webhook
- GithubActions
    - [Slack Notify](https://github.com/marketplace/actions/slack-notify)


## 作り方(自動マージ編)
それでは早速ですがMerge branchの処理は以下です。
(といってもほぼ[merge branchのREADME](https://github.com/marketplace/actions/merge-branch)ですが。。。。)

やりたいことは
`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/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](https://github.com/marketplace/actions/merge-branch)とほぼ同じです。
違いはmergeパターンを3つしているのとpushされたブランチによってmerge先を制御しているぐらいです。

ブランチを用意しておいて、これをmain(master)ブランチにpushするとGithubActionsが動きます。
(後半に書く予定の通知の処理も入っちゃっていますがとりあえずdevelop3にまで変更が反映されていました。)
![スクリーンショット 2021-02-13 20.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/1a11459f-936d-8bfb-63ba-764b542b39ca.png)


### mergeに失敗する
上の実装を行うと確かに`main`の変更が`develop_v3`まで反映されますが、
例えば`develop_v2`のreadme.mdを変更してpushしたとしましょう。
その後`main`のreadme.mdを変更してpushすると当たり前ですがconflictします。
次はそのconflictが起きたときにslackに通知を送ってもらう方法を実装します。

### 作り方(通知準備編)
#### webhookの追加
まずはwebhookをslackに入れましょう
slackのチャンネルの上にある`Browse Slack`の隣にある三点リーダーをクリックして、出てきたメニューの中のAppをクリックします。
![スクリーンショット 2021-02-13 19.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/202daef2-e0ee-1b69-3118-a58233868c48.png)
次にwebhookで検索
![スクリーンショット 2021-02-13 19.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/1fc770e6-4a9c-4686-a738-3e380aeb9825.png)
slackに追加
![スクリーンショット 2021-02-13 19.25.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/9f7c3b2c-bcfe-296d-e51c-85dc22521636.png)
送りたいチャンネルを選択して、`Incoming Webhookインテグレーションの追加`
![スクリーンショット 2021-02-13 19.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/a44e5adc-99ee-15bd-87f7-2c518fe2461a.png)

その後に出てくる画面の`インテグレーションの設定`のWebhook URLをコピーします。
![スクリーンショット 2021-02-13 19.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/0a430e58-d585-e5c0-abfd-6bd6d2744699.png)


#### Githubに`secret.SLACK_WEBHOOK`の追加
actionを追加したいrepositoryの`Settings`の`New repository secret`をクリック

![スクリーンショット 2021-02-13 19.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/9426f22c-4f8a-6b8c-2d21-ec8655661690.png)
先ほどWebhookでコピーしたURLをオレンジの部分にペースト
![スクリーンショット 2021-02-13 19.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/52a8ca4a-9f1b-9e0e-bb54-4800a9ea0741.png)
以下は完了の図
![スクリーンショット 2021-02-13 19.28.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/33ea1b55-3609-7546-c7ca-26dec1b066fd.png)

 
### 作り方(通知を飛ばす)
それでは先ほど作った`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](https://github.com/marketplace/actions/slack-notify)とほぼ変わらない)
これを繰り返すand`env`の冗長な記述をまとめた結果が以下になります。

```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/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`が動いていますね。
![スクリーンショット 2021-02-13 19.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/53f28c45-7500-ea19-3952-52e29b6905db.png)
するとmergeに失敗した`develop -> develop_v2`と`develop_v2 -> develop_v3`の通知がslackに飛んできましたー
![スクリーンショット 2021-02-13 19.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864761/b0b419c5-dbb4-8e85-82c6-cf8af3cd6045.png)


完成です！
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