tagprとカスタムGitHub Actions
kichijojipm 33
Jun 16th, 2023
Profile
Profile
- id: Songmu (ソンムー)
- ♥
- OSS
- Blog / Twitter
- Agile
- Full Cycle Development
代表的なOSS
- ghq (メンテナ)
- ecschedule
- gocredits
- prompter
- etc.
わたしがL(の作者)です
% perl -ML -E 'say String::Random->new->randregex("[0-9a-zA-Z]{12}")'
tagpr (新作)
どういうものか?
- リリースに伴うファイル変更をおこない、pull request化してくれる
- 変更は仮変更でその後開発者側で調整可能
- 全くファイル変更がないケースも対応可能
- それがマージされるとsemverタグが打たれる
これらがGitHub Actionsで自動で行われる
作った動機
- 案外複雑になりがちなリリース作業を楽にしたい
- pull request化したい
- レビュー・承認可能にしたい
- リリースの民主化
- マージボタンを押すだけでリリースフローが進む
- 手元リリースをやめたい
- Go以外のOSSにも使える汎用的なものにしたい
効果
- 新しい手順を覚える必要なく、慣れたpull requestのフローでリリース作業ができる
- リリースに伴うファイルの変更や次のバージョン番号なども議論できる
- マージ権限を持っていれば誰もがリリースできる
- リリースフローを揃えれば別にOSSじゃなくて社内システムでも使える
GitHub Actions設定
# .github/workflows/tagpr.yml
name: tagpr
on:
push:
branches: ["main"]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: Songmu/tagpr@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
tagprのフロー
mainが進む
branch
pull requestのマージとリリース
ブランチの更新による調整
mainの更新に追随
pull requestの内容
- リリース予定項目の一覧
- リリース後にわかるのではなく、リリース前にわかる大事さ
- これがマージされるとリリースされるんだなと外部の人にも分かる
カスタムGitHub Actionsの公開
Songmu/tagpr@v1
みたいなやつ
作る方法
- リポジトリルート直下に
action.yml
を配置して定義を書く。
これだけ。これで $owner/$repo@main
とかで参照できるようになる
Actionの種類
- composite
- Docker
- JavaScript
compositeがお手軽で個人的にはオススメ。
compositeをおすすめする理由
- JavaScript
- Good: JSで書ける
- Good: GitHub公式が提供している actions/toolkit が便利
- Bad: ランタイムのアップデートが定期的に必要になる
- Docker
- Good: 任意のベースイメージを指定できるので再利用性が高い
- Bad: 隔離されて実行されるため後続のタスクへの情報の受け渡しが難しい
- Bad: compositeが進化した結果お手軽さも減った
- Bad: Windowsで動かない
- composite
- Good: 既存のGitHub Actions設定と同じようにカスタムアクションを定義できる
- Good: お手軽にシェルスクリプトでも書ける
- Good: Windowsでも動く
- 過去に制約があったがその辺りも解消された
Dockerを使う意味はあまりなくなった印象。JavaScript好きな人はJavaScriptで書いても良いと思うがランタイムのアップデートが定期的に必要になることを受け入れる必要がある。
僕がやっている方法
- Goでメインロジックを書いて環境ごとにバイナリビルド
- composite Action内でそれをダウンロードしてきてbashで実行
action.yml抜粋
runs:
using: "composite"
steps:
- name: tagpr
id: tagpr
run: |
cd "${GITHUB_WORKSPACE}" || exit 1
TEMP_PATH="$(mktemp -d)"
PATH="${TEMP_PATH}:$PATH"
curl -sfL https://raw.githubusercontent.com/Songmu/tagpr/main/install.sh | sh -s -- -b "$TEMP_PATH" "${{ inputs.version }}" 2>&1
tagpr
shell: bash
これだけ。簡単です
余談: $owner/$repo@v1
指定のv1部分
- 単純に
$owner/$repo@$gitref
のフォーマット
Songmu/tagpr@main
Songmu/tagpr@v1.2.3
みたいな指定も可能
- 逆に v1.2.3 みたいなsemverタグを打ったからと言っても v1 で指定できるようになるわけではない
つまり v1
部分はブランチかタグ
- ブランチの場合:
- mainブランチをメインラインにしてリリース時にv1ブランチにマージ
- mainブランチをメインラインにしてリリース時にv1ブランチにforce push
- メインラインをv1ブランチにしてしまう
- タグの場合: リリース時に v1 タグを打ち直す (force push)
僕はタグでやってます。
haya14busa/action-update-semver が便利
- uses: haya14busa/action-update-semver@v1
with:
major_version_tag_only: true
v1.2.3 のタグが打たれたときに、 v1タグもforce pushしてくれる
この辺のやり方色々ありそうなので他のやり方あったら教えてください。
以上
宣伝2
OSS活動を支援してくれると嬉しいです。
- GitHub Sponsor
- ghq handbook