はじめに
最近私の中でGitHubについて理解を深めようキャンペーンが開催されています。
というわけで今回はGitHubのRelease機能について触ってみることにしました。
前回のGitHubの記事はこちら
この記事はTDCソフト株式会社Advent Calendarの8日目です。
GitHub Releaseってなんだ?
GitHub上でライブラリやソフトウェアのリリースを管理できる機能のこと。
Gitのタグに紐づいて管理・作成されます。
リリースのリンクを押下すると、リリースノートが表示されるほか、ソースコードやリリースされたソフトウェアといったアセットのダウンロードが出来たりします。
リリースを作ってみよう
適当なリポジトリを開き、Create a new release
を押下してみます。
既存のタグor新規タグに紐づけてリリースを作成できます。
リリースノートやソースコード以外に紐づけたいアセットなんかを指定してあげるだけっぽいですね。
Publish release
を押したらリリースの作成が完了です。
とっても簡単ですね。
リリースノートのカスタマイズ
さて、リリースを作成するまではできましたがこのままでは味気ないのでリリースノートをカスタマイズしてみましょう。
リポジトリに.github/release.yml
ファイルを追加することでリリースノートを自動生成することが出来ます。
↓公式docからコピペしてきたrelease.yml
changelog:
exclude:
labels:
- ignore-for-release
authors:
- octocat
categories:
- title: Breaking Changes 🛠
labels:
- Semver-Major
- breaking-change
- title: Exciting New Features 🎉
labels:
- Semver-Minor
- enhancement
- title: Other Changes
labels:
- "*"
exclude
リリースノートから排除したいラベルやユーザを指定します。
今回はignore-for-release
というラベルの付いたPRやoctocat
ユーザのPRをリリースノートに載せる情報から除外しています。
categories
リリースノートに載せる変更情報のカテゴリを指定します。
今回はメジャーリリース、マイナーリリース、その他のリリースの3つのカテゴリを設定しています。
どんな感じ?
release.yml
を追加し、適当にいくつかPRをマージした後にリリースを作成してみました。
PRのラベルに紐づいて変更内容を自動で記載してくれていますね。
自動化してみたい
ここで終わってもつまらないのでGitHubActionsを使って自動リリースを試してみましょう。
ワークフロー
必要最低限の要件として以下2点を満たすようとりあえず動かしたワークフローがこちらです。
- タグが追加されたらリリースを作成する
- アセットにビルドしたアーティファクトを追加する
※プロジェクトは前回用意したものを流用しています。
name: Release
run-name: release
# タグがプッシュされたら実行する
on:
push:
tags:
- "v*"
jobs:
release:
runs-on: ubuntu-latest
steps:
# リポジトリをチェックアウトする
- name: Checkout repository
uses: actions/checkout@v4
# Node.jsを使用する
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20.x'
# 依存関係をインストール
- name: Install dependencies
run: npm install -D
# ビルドを実行
- name: Run build
run: npm run build
# 1つ前のタグを取得
- name: Get Previous Tag
id: get_pre_tag
run: |
PRE_TAG=$(git tag --sort=creatordate | tail -n 2 | head -n 1)
echo "pre_tag=$PRE_TAG" >> $GITHUB_OUTPUT
echo "previous_tag: $PRE_TAG"
# 前回リリースからの差分をもとに、変更点を取得する
- name: Generate Release Note
id: generate_release_note
run: |
echo "$(
curl -X POST \
-H 'Accept: application/vnd.github.v3+json' \
-H 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' \
https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
-d '{
"tag_name": "${{ github.ref_name }}",
"previous_tag_name": "${{ steps.get_pre_tag.outputs.pre_tag }}",
"target_commitish": "main"
}' | jq .body | sed 's/\\"//g' | sed 's/["“]//g' | sed 's/\\n/\n/g'
)" >> RELEASE_NOTE
# リリースを作成
- name: Create GitHub Release
id: create_release
uses: actions/create-release@v1.1.4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref_name }}
release_name: Release ${{ github.ref_name }}
body_path: ./RELEASE_NOTE
draft: false
prerelease: false
# 出力ファイルを圧縮
- name: Compress bundle
run: |
mkdir -p artifacts
zip -r artifacts/build.zip dist/
# アセットをアップロード
- name: Upload release Asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./artifacts/build.zip
asset_name: build.zip
asset_content_type: application/zip
リリースノート作成
# 前回リリースからの差分をもとに、変更点を取得する
- name: Generate Release Note
id: generate_release_note
run: |
echo "$(
curl -X POST \
-H 'Accept: application/vnd.github.v3+json' \
-H 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' \
https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
-d '{
"tag_name": "${{ github.ref_name }}",
"previous_tag_name": "${{ steps.get_pre_tag.outputs.pre_tag }}",
"target_commitish": "main"
}' | jq .body | sed 's/\\"//g' | sed 's/["“]//g' | sed 's/\\n/\n/g'
)" >> RELEASE_NOTE
GitHub APIを利用して1つ前のタグとの差分リリースノートを生成・出力しています。
リリースの作成
# リリースを作成
- name: Create GitHub Release
id: create_release
uses: actions/create-release@v1.1.4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref_name }}
release_name: Release ${{ github.ref_name }}
body_path: ./RELEASE_NOTE
draft: false
prerelease: false
actions/create-release
というアクションを使用し、リリースの作成を行っています。
タグ名・リリース名はシンプルにpushされたタグ名をそのまま使用しています。
アセットの配置
# 出力ファイルを圧縮
- name: Compress bundle
run: |
mkdir -p artifacts
zip -r artifacts/build.zip dist/
# アセットをアップロード
- name: Upload release Asset
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./artifacts/build.zip
asset_name: build.zip
asset_content_type: application/zip
actions/upload-release-asset
アクションを利用しリリースに紐づくアセットを配置しています。
upload_url
にはリリースの作成時に出力されたアセットのアップロード用URLを指定しています。
actions/create-release
・actions/upload-release-asset
は共に廃止が予定されているset-output
コマンドを使用しているため、実行時にアラートが出ます。
今回はお試しなので簡易なものを使用しましたが、実際に運用するには別のアクションを利用するなりした方がよさそうです。
↓アラートの様子
動かしてみよう
ワークフローを作ったところで適当にいくつかPRをマージし、タグを追加してみます。
git tag v2.0.0
git push origin v2.0.0
ワークフローが動きだしました。(ワークフローの数に試行回数が現れている)
リリースが作成され、前バージョンとの差分も記載されているほか、アセットにもbuild.zipが配置されています。
これでタグの追加に応じて自動でリリースを作成するワークフローができました。
おわりに
今回はGitHub Releaseとは何ぞやというところから実際にどうやって使うんだろう?の入門編という形でやってきましたが、前回学んだGitHubActionsと合わせてそれっぽい学びができたのではないかと思います。
まだまだ私の知らないGitHubの機能はたくさんあるので今後もGitHubについて理解を深めようキャンペーンを継続していきたいですね。
参考