📝

Github Actionsを活用してrelaseブランチ作成、GitHubリリースとタグ作成を自動化する

2024/03/12に公開

この記事の概要

こんにちは。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を使わせてもらっています。

https://github.com/x-motemen/git-pr-release

この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作成、リリース作成を行うことが可能です。

https://github.com/mathieudutour/github-tag-action
https://github.com/ncipollo/release-action

このactionsは、「release ブランチが mainブランチにマージされた時のみ」実行したいため、次のように制御しています。

if: startsWith(github.head_ref, 'release/') && github.event.pull_request.merged == true

終わりに

以上、PharmaXでのgithub actionsを使ったリリースの運用について、一例を紹介させていただきました。

PharmaX では、様々なバックグラウンドを持つエンジニアの採用をお待ちしております。
もし、興味をお持ちの場合は、私の X アカウント(@hakoten)や記事のコメントにお気軽にメッセージいただけますと幸いです。まずはカジュアルにお話できれば嬉しいです!

PharmaXテックブログ

Discussion