画像のように、リポジトリに変更をpushしたときにバージョン情報を自動で更新するワークフローを記述することについて考えます。
workflowファイルについて
GitHub Actionsでは、.github/workflows以下にyml形式で振る舞いを定義することができます。
プロジェクトに変更があったときはもちろんのこと、cronのように定刻に指定したアクションを実行させることもできます。
今回は要件に沿って、developブランチにmerge or pushがあった場合に、後述のLinuxコマンドを実行する というようにしました。
name: version update
on:
push:
branches:
- develop
permissions:
contents: write
jobs:
version-update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: |
VERSION="4.0.$GITHUB_RUN_NUMBER"
echo "current version: $VERSION"
find . -name "*.csproj" | while read CSPROJ; do
sed -i "s|<Version>.*</Version>|<Version>$VERSION</Version>|" "$CSPROJ"
git add $CSPROJ
done
git config --global user.name "$GITHUB_ACTOR"
git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com"
git commit -m "バージョン情報更新: $VERSION"
git push
順を追って説明していきます。
ワークフローにラベルをつける
name: version update
※単にActionsの画面で開発者が識別するためだけのラベルであることに注意してください。(1敗)
ワークフロー自体の名称を設定したい場合、ymlのファイル名自体を変更します。
これは後のgithub.run_numberの部分でまた説明します。
プロジェクト上のmainブランチにpush or mergeがあった場合にjobsを実行する
on:
push:
branches:
- main
単にpushを指定すればmerge時にも走ります。
ランタイムに書き込み権限を与える
permissions:
contents: write
これに気づかず多くの時間を浪費しました。 😭
jobがリポジトリに何らかの書き込みを伴うアクションの場合、明示的に書き込み権限を与えなければならないようです。
実際にバージョン情報を書き換える
- run: |
VERSION="4.0.$GITHUB_RUN_NUMBER"
echo "current version: $VERSION"
find . -name "*.csproj" | while read CSPROJ; do
sed -i "s|<Version>.*</Version>|<Version>$VERSION</Version>|" "$CSPROJ"
git add $CSPROJ
done
git config --global user.name "$GITHUB_ACTOR"
git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com"
git commit -m "バージョン情報更新: $VERSION"
git push
今回ワークフローを追加するプロジェクトはC#.NETで記述されています。
C#のバージョンは、プロジェクト内にある.csprojファイル内にタグとして書かれています。
これを書き換えることを目指します。
GITHUB_RUN_NUMBER
今までにワークフローが回った回数を持つ定数です。
色々調べましたが、リセット等の動作はできないようです。
ただこのカウントはファイル名依存なので、ワークフローの名前を変更すれば1からカウントできます。
(つまり、ブランチごとにワークフローを用意してそれぞれ異なるナンバリングをするというようなことも可能です)
参考:
$GITHUB_ACTOR
Authorのユーザー名が入ります。
GITHUB_ACTOR@users.noreply.github.com
あまり知られていません(?)が、GitのAuthorメールアドレスは隠すことができます。
これを実現するためにGitHubの全てのアカウントに割り当てられているアドレスを利用します。特に設定なしで用いることができます。