GitHub Actionsでビルドしたファイルをリリースノートに格納する
GitHub Actionsでビルドしたファイルをリリースノートに格納する方法を解説します。非エンジニアの友人でも簡単に拡張機能をアップデートできる仕組みを実装します。
目次
背景
最近、友人と自分用に Google Chrome の拡張機能を開発しています。
大々的に公開するわけではないので、manifest.json を含めたファイルをそれぞれの PC に手動で配置して動かしています。
しかし、友人たちはエンジニアではないので、アップデート作業ができるだけ簡単に行えるようにしたいと考えました。
拡張機能自体は、Vite + TypeScript で構築しています。前に記事で紹介したように、非エンジニア向けに手間をかけず、更新後は簡単に拡張機能をアップデートできる仕組みが必要でした。
Viteで始めるGoogleChrome拡張機能開発
実装の流れ
自動化のフローは以下のような感じです。
mainブランチに変更をマージ- GitHub Actions で自動的にファイルをビルドし、Zip 圧縮
- リリースノートに圧縮されたファイルをアップロード
- 利用者がリリースノートからダウンロードし解凍
- 解凍したファイルを既存の拡張機能に上書きする
利用者はファイルをダウンロードしてコピペするだけで、最新の拡張機能にアップデートできます。
GitHub Actionsでの自動化設定
次に、GitHub Actions を使って自動化する際の設定を紹介します。
GitHub Actions では、pull request が main ブランチにマージされたタイミングでビルドと圧縮が自動で行われ、リリースノートにアップロードされる仕組みにしました。
以下はその例です。
name: Create Release Note
on:
pull_request:
# PRが閉じたタイミングで実行
types:
- closed
# mainブランチのみを対象とする
branches:
- main
jobs:
build-and-release:
permissions:
contents: write
pull-requests: write
# リリースブランチからマージのみ実施
if: github.event.pull_request.merged == true && startsWith(github.head_ref, 'release')
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- uses: pnpm/action-setup@v4
with:
version: 9
- name: install dependencies
run: pnpm install --frozen-lockfile
- name: build dependencies
run: pnpm build
- name: Zip the dist directory
run: zip -r dist.zip dist
- name: Create Release and Upload Assets
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# PRのタイトルと内容をRELEASE_TAGに設定する
RELEASE_TAG: ${{ github.event.pull_request.title }}
uses: softprops/action-gh-release@v2
with:
files: dist.zip
tag_name: ${{ env.RELEASE_TAG }}
name: Release ${{ env.RELEASE_TAG }}
draft: false
prerelease: false
課題と改善点
実装はうまくいったものの、問題もありました。
リリースノートにアップロードした dist.zip をダウンロードしようとすると、ウイルスとして検出されてしまい、ダウンロードができないという状況に直面しました😭
セキュリティを落とさずに対応できる方法を調べ、zip-release というアクションを使うことで改善しました。
GitHub - TheDoctor0/zip-release: GitHub action that can be used to create release zip archive.
GitHub action that can be used to create release zip archive. - TheDoctor0/zip-release
修正したところ、無事 Release Note にファイルを添付できました。
Release Release 0.0.3 · Suntory-Y-Water/flea-assist-plus
フリマアシストを使った再出品処理をサポートするChrome拡張機能. Contribute to Suntory-Y-Water/flea-assist-plus development by creating an account on GitHub.
name: Create Release Note
on:
pull_request:
# PRが閉じたタイミングで実行
types:
- closed
# mainブランチのみを対象とする
branches:
- main
jobs:
build-and-release:
permissions:
contents: write
pull-requests: write
# リリースブランチからマージのみ実施
if: github.event.pull_request.merged == true && startsWith(github.head_ref, 'release')
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- uses: pnpm/action-setup@v4
with:
version: 9
- name: install dependencies
run: pnpm install --frozen-lockfile
- name: build dependencies
run: pnpm build
# ZIPファイルを作成する(distディレクトリを対象)
- name: Archive Release
uses: thedoctor0/zip-release@main
with:
type: 'zip'
filename: extensions.zip
# distディレクトリにZIPファイルを作成
directory: dist
# リリースを作成し、生成されたZIPファイルをアップロードする
- name: Create Release and Upload Assets
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# PRのタイトルと内容をRELEASE_TAGに設定する
RELEASE_TAG: ${{ github.event.pull_request.title }}
uses: softprops/action-gh-release@v2
with:
# dist内のZIPファイルを指定
files: dist/extensions.zip
tag_name: ${{ env.RELEASE_TAG }}
name: ${{ env.RELEASE_TAG }}
draft: false
prerelease: false最後に
最終的には、GitHub Actions を活用した自動更新フローを構築できました。
これで、エンジニアでない友人たちも手軽に最新バージョンを使い続けることができるようになり、非常に便利になったと感じています。
技術的な部分も少しずつ改善しながら、今後もさらに使いやすい形にしていきたいと思います。
参考
データパックをGithub Actionsで自動zipリリース - Qiita
Minecraft Command Advent Calendar 2023 シリーズ3 21日目の記事です。 はじめに データパックやリソースパックをGithub上で管理している方は多いでしょう。 Github Actionsを使うとメインのブランチにpushした...