This page looks best with JavaScript enabled

GitHub Actions で自動デプロイ&リリース通知まで

 ·  ☕ 3 分で読めます
✏️

流れ

  • 普段の開発はfeatureブランチで行う
  • featureブランチからdevelopにマージすると、developからmainへのPRが自動作成される
    • PRには、どのfeature PRが今回のリリースに含まれるかを記載する
  • 上記のdevelop→mainのPRをマージすると、それをトリガーにしてデプロイが行われる
  • また、同時にGitHub releaseが行われて、タグが付けられる
    • リリース内容をSlackに通知する
flowchart TB
  subgraph branch
    feature --> |"PR merge"| develop --> |"PR merge"| main
  end

  action["GitHub Action"] .-> |"auto created PR"| develop
  action .-> |"deploy"| heroku
  action .-> |"publish"| release[GitHub release]
  action .-> |"notification"| slack[Slack]

  subgraph release flow
    heroku
    release
    slack
  end

使用した GitHub Actions

git-pr-release-action

リリース用の PR を作成します。
マージ元とマージ先との差分の PR の情報を随時アップデートします。
git-pr-release を実行する GitHub Action をつくってみた - BAKUNOTE

release-drafter

前リリースとの差分 PR 情報を body に自動入力して release として公開します。
デフォルトではDraft PRを作成しますが、master push 時にしか使わないので、設定で公開するようにしています。
また、PRにラベルを追加することもできますが、今回は使っていません。

actions/checkout

指定のリポジトリやブランチに checkout します。
今回はmainブランチから heroku デプロイするために使いました。

heroku-deploy

heroku のデプロイに使っています。

slack-github-action

Slack 通知に使っています。

heroku-deployslack-github-actionでは、アクセストークンが必要なので、リポジトリの Setting → サイドバーの Secrets → Actions から登録しておく必要があります。

image image

実際の挙動

image image image image

実際の yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
name: Create PR to main

on:
  push:
    branches:
      - develop

jobs:
  git-pr-release:
    name: git-pr-release
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: git-pr-release
        uses: bakunyo/git-pr-release-action@v1.4
        env:
          TZ: "Asia/Tokyo" # タイトルの日時を +9 にするため
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GIT_PR_RELEASE_BRANCH_PRODUCTION: main
          GIT_PR_RELEASE_BRANCH_STAGING: develop
          GIT_PR_RELEASE_LABELS: release
          GIT_PR_RELEASE_TEMPLATE: .github/RELEASE_PULL_REQUEST_TEMPLATE.md
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
name: Release

on:
  push:
    branches:
      - main
  workflow_dispatch:

permissions:
  contents: read

jobs:
  release:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: write # for release-drafter/release-drafter to create a github release
    steps:
      - uses: actions/checkout@v3
        with:
          ref: main

      - name: heroku_deploy
        uses: akhileshns/heroku-deploy@v3.12.12
        with:
          heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
          heroku_app_name: hashlog # Must be unique in Heroku
          heroku_email: aiandrox7@gmail.com

      - name: Create Release
        id: create_release
        uses: release-drafter/release-drafter@v5
        with:
          config-name: release-drafter.yml
          disable-autolabeler: true
          publish: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: echo release note
        id: get_release_note
        run: |
          # 改行コードをエスケープする
          release_body='${{ steps.create_release.outputs.body }}'
          release_body=${release_body//$'\r\n'/\\n}
          release_body=${release_body//$'\n'/\\n}
          echo "::set-output name=body::$release_body"          

      - name: Send Release Note
        uses: slackapi/slack-github-action@v1.19.0
        with:
          payload: |
            {
              "text": "🚀 ${{ steps.create_release.outputs.published_at }} ${{ steps.create_release.outputs.name }} Released!\n${{ steps.create_release.outputs.html_url }}\n```${{ steps.get_release_note.outputs.body }}```",
              "unfurl_links": false
            }            
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

  # 失敗時の Slack 通知
  failure-notify:
    runs-on: ubuntu-latest
    needs: [release]
    if: failure()
    timeout-minutes: 5
    steps:
      - name: Send Failure
        uses: slackapi/slack-github-action@v1.19.0
        with:
          payload: |
            {
              "text": "😢 Release Job Failure...\n${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
            }            
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
exclude-labels:
  - "release"
categories:
  - title: "🚀 Features"
    labels:
      - "feature"
      - "enhancement"
  - title: "🐛 Bug Fixes"
    labels:
      - "fix"
      - "bugfix"
      - "bug"
  - title: "🧰 Maintenance"
    labels:
      - "chore"
  - title: "⚡ Improvements"
    labels:
      - "refactoring"
  - title: "📦 Dependencies"
    labels:
      - "dependencies"
change-template: "- $TITLE @$AUTHOR (#$NUMBER)"
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
version-resolver:
  major:
    labels:
      - "major"
  minor:
    labels:
      - "minor"
  patch:
    labels:
      - "patch"
  default: patch
template: |
  ## Changes

  $CHANGES  

参考

Share on

END
END
@aiandrox

目次