Github Actionsを活用してrelaseブランチ作成、GitHubリリースとタグ作成を自動化する
この記事の概要
こんにちは。PharmaX でエンジニアをしている諸岡(@hakoten)です。
本記事では、PharmaXのYOJO事業部においてリリース時に活用しているGitHub Actionsの運用方法について紹介します。
YOJO事業部では、リリース時のフローとしてreleaseブランチの作成を行います。これは、いわゆるgit-flowの運用に則ったものです。
リリース作業をできるだけ簡素化し、リリースサイクルを迅速化するために、ブランチの作成やマージ後のタグ作成処理をGitHub Actionsを通じて自動化しています。この記事では、その具体的なフローについてご紹介します。
リリースフローの簡単な説明
まず、YOJO事業部における現在のリリースフローについて簡単にご説明します。現在はgit-flowを基本にブランチコントロールをしており、リリースのタイミングで最初に行うのはrelease
ブランチの作成になります。このreleaseブランチのテストが問題ない場合は、main
ブランチへとマージされます。
main
ブランチは本番環境へのデプロイのトリガーとして機能しており、main
ブランチにマージされることで、自動的に本番環境へのデプロイプロセスが開始されます。
また、main
ブランチへマージされたタイミングでgitのTag作成とgithubのリリース作成を行います。
本記事で紹介するのは、上述のフローの中の①、②の部分です。(Google Cloudへのデプロイに関する詳細は本記事の範囲外となります)
①releaseブランチを作成し、mainブランチへのPull Requestを作成
- releaseブランチを作成し、mainブランチへのPull Requestを作成します
- Pull Requestには、リリースに含まれる実装内容の概要や検証項目を記載します
②mainブランチへマージ時に、Tagを作成し、githubへリリースを作成
- mainブランチへマージされたタイミングで、リリースバージョンのgitのTagを作成します
- 作成されたTagに対して、githubのリリース機能にリリースを作成します
github actionsの紹介
前述の①、②の工程について、実際運用しているgithub actionsを紹介します。
①releaseブランチを作成し、mainブランチへのPull Requestを作成
リリース担当者は、githubコンソールから、対象のactionsを選択して、作成したいバージョンを入力します。
actionsが実行されると、次のようなPull Requstが自動で作成されます。
actions yaml
github actionsのyamlファイルは次のとおりです。
name: Create Release Branch and PR
on:
workflow_dispatch:
inputs:
version:
description: '作成するバージョンを入力してください'
required: true
jobs:
create_pr:
runs-on: ubuntu-latest
env:
# githubのコンソールから入力したリリース名を環境変数へ保存
RELEASE_BRANCH_NAME: release/${{ github.event.inputs.version }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
- uses: actions/setup-ruby@v1
with:
ruby-version: 3.1
# releasブランチを作成
- name: Create and push release branch
run: |
git checkout -b ${{ env.RELEASE_BRANCH_NAME }}
git push origin ${{ env.RELEASE_BRANCH_NAME }}
- run: gem install --no-document git-pr-release
# releasブランチ -> mainブランチへのPull Requestを作成
- name: Create PR for release
run: git-pr-release --squash
env:
GIT_PR_RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GIT_PR_RELEASE_BRANCH_PRODUCTION: main
GIT_PR_RELEASE_BRANCH_STAGING: ${{ env.RELEASE_BRANCH_NAME }}
GIT_PR_RELEASE_LABELS: release
GIT_PR_RELEASE_TEMPLATE: pr-release.template.erb
TZ: Asia/Tokyo
Pull Requestの作成には git-pr-release
という便利なactionsを使わせてもらっています。
このactionsを使い、マージされた修正をPull Requestに自動で転記して、リリース前のチェックに使用しています。
git-pr-release
は、Pull Requestのテンプレートをカスタマイズすることができます。大したカスタマイズはしていませんが、Pull Requestのタイトルに設定したバージョンを入れたかったため、YOJO事業部では次のようにカスタマイズしています。
Release: <%= release_pull_request[:head][:ref].match(/release\/(.+)/)[1] %>
<% pull_requests.each do |pr| -%>
<%= pr.to_checklist_item %>
<% end -%>
② mainブランチへマージ時に、Tagを作成し、githubへリリースを作成
releaseブランチが無事mainブランチにマージされたら、そのバージョンのTagを作成し、githubにリリースを作成します。
作成されたリリース例
actions yaml
github actionsのyamlファイルは次のとおりです。
name: Create Tag and Release
on:
pull_request:
types:
- closed
jobs:
create:
# releaseブランチをマージされたときのみ実行
if: startsWith(github.head_ref, 'release/') && github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Create a tag string
id: extract_tag
# Pull Requstのタイトルからバージョンを抽出する
run: echo "::set-output name=custom_tag::$(echo '${{ github.event.pull_request.head.ref }}' | sed 's/release\///')"
shell: bash
- name: Create a tag
id: tag_version
uses: mathieudutour/github-tag-action@v6.1
with:
custom_tag: ${{ steps.extract_tag.outputs.custom_tag }}
tag_prefix:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Create a GitHub release
uses: ncipollo/release-action@v1
with:
tag: ${{ steps.tag_version.outputs.new_tag }}
name: ${{ steps.tag_version.outputs.new_tag }}
body: ${{ github.event.pull_request.body }}
ここでもタグを作るのに github-tag-action
、 リリースを作成するのにrelease-action
という便利なactionsを使っていて、これだけの記述でTag作成、リリース作成を行うことが可能です。
このactionsは、「release ブランチが mainブランチにマージされた時のみ
」実行したいため、次のように制御しています。
if: startsWith(github.head_ref, 'release/') && github.event.pull_request.merged == true
終わりに
以上、PharmaXでのgithub actionsを使ったリリースの運用について、一例を紹介させていただきました。
PharmaX では、様々なバックグラウンドを持つエンジニアの採用をお待ちしております。
もし、興味をお持ちの場合は、私の X アカウント(@hakoten)や記事のコメントにお気軽にメッセージいただけますと幸いです。まずはカジュアルにお話できれば嬉しいです!
PharmaXエンジニアチームのテックブログです。エンジニアメンバーが、PharmaXの事業を通じて得た技術的な知見や、チームマネジメントについての知見を共有します。 PharmaXエンジニアチームやメンバーの雰囲気が分かるような記事は、note(note.com/pharmax)もご覧ください。
Discussion