Gitea ActionsにてLinuxカーネルの自動ビルド環境を作った際のノウハウ集
はじめに
G-clusterのカーネルはkernel.orgのミラーからフォークする形で作成しています。1
そのため、プルリクエスト一発で最新ver.に追従する事ができるのですが、正常にビルドが通るかはわからないためマージ前に(手動で)チェックする必要がありました。
Gitea Actionsを用いてこの操作を自動化したのでノウハウをまとめます。
(私が知っている)そのまま使えるGitHub用action
actions/checkout@v3
actions/setup-go@v4
peter-evans/create-pull-request@v5
- 一部問題あり?(後述)
teaコマンド
Giteaには、tea
コマンドというCLIが存在します。
恐らく機能的にはghコマンドに近い感じで、PRを立てたりコメントしたり等色々できます。
Actionで利用すれば大変便利なのですが、パッケージ等で入ってくれないので手動で設定する必要があります。
- teaコマンドをインストール
1 2 3 4 5 6 7
- name: install tea run: curl https://dl.gitea.com/tea/0.9.2/tea-0.9.2-linux-amd64 | dd of=/usr/bin/tea && chmod +x /usr/bin/tea - name: login gitea run: tea login add -n actions env: GITEA_SERVER_URL: https://gitea.example/ GITEA_SERVER_TOKEN: ${{ secrets.GITEA_TOKEN }}
-n actions
にてログイン名を設定していますが、何かしらオプションを入れていないとインタラクティブモードとなってしまう事に対処しています。
コマンドライン引数でURLとトークンを入れることで回避できるのですが、ログに残る危険を考慮してこのようにしています。
自動でプルリクエストを立てる
peter-evans/create-pull-request@v5
を利用する方法と、tea
コマンドを利用する方法があります。
peter-evans/create-pull-request@v5
ブランチの作成やpushなどを自動で行ってくれるため非常に便利ですが、一部のケースでエラーが出て正常に動作しないようです。
具体的にはプルリクエスト経由でワークフローがトリガされた等で実行中のブランチがmaster
でない場合において、master
をheadとしてPRを立てようとした際GetForkedRepo
が発生して立てられませんでした。
|
|
GetForkedRepo
はフォークされたレポジトリに対してフォーク元からPRを立てようとした場合などに発生するエラー2で、バグじゃないかと疑っています。
teaコマンド
こちらはブランチの作成からcommit、pushまでを手動で行い、Pull Requestのオープンのみをtea経由で行います。
- teaコマンドでPRを立てる例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
- name: checkout for defconfig PR uses: actions/checkout@v3 with: ref: linux-rolling-lts-dsm232 path: clean fetch-depth: 0 - name: update defconfig run: | cd clean git branch "$DEFCONFIG_BRANCH" git checkout "$DEFCONFIG_BRANCH" # cp ../.config arch/arm/configs/cnc1800l_defconfig git add arch/arm/configs/cnc1800l_defconfig # git commit -m "update defconfig #${{ github.event.number }}" - name: create PR run: | cd clean git push -u origin "$DEFCONFIG_BRANCH" tea pr c --repo ${{ github.repository }} \ --base linux-rolling-lts-dsm232 \ --head "$DEFCONFIG_BRANCH" \ --title "update defconfig #${{ github.event.number }}"
なお、DEFCONFIG_BRANCH
は環境変数でセットされています。
auto-defconfig-16
のような感じで展開されます。
linux-rolling-lts-dsm232
はこのレポジトリのmaster
です。
自動でコメントする
teaコマンドを使って簡単にコメントできます。
必要なのはIssue/Pull Requestの番号で、おそらく${{ github.event.number }}
に入っています。
-
PRにレポートを追加する例
1 2 3 4 5 6 7 8 9 10 11 12
- name: report result run: | echo "### configure output" >> report.md echo "\`\`\`" >> report.md cat output_config.txt >> report.md echo "\`\`\`" >> report.md echo "### difference report" >> report.md echo "\`\`\`diff" >> report.md cat defconfig.diff >> report.md echo "\`\`\`" >> report.md echo "*This comment is generated by Gitea Actions*" >> report.md cat report.md | tea c --repo ${{ github.repository }} ${{ github.event.number }}
-
実際の動作
Markdownが使えます。
自動でリリースする
タグを切って自動でリリースするなど、GitHubでよく見かける場面ですが、Giteaでもできます。
- リリースする例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
- uses: actions/setup-go@v4 with: go-version: 'stable' - name: prepare release run: | mkdir out cat arch/arm/boot/zImage arch/arm/boot/dts/celestial-cnc1800l.dtb > zImage_comb.bin mkimage -a 0x8000 -A arm -O linux -T kernel -C none -e 0x8000 -n kernel -d zImage_comb.bin out/uImage cp arch/arm/boot/zImage arch/arm/boot/dts/celestial-cnc1800l.dtb out/ tar cvzf out/kmods.tar.gz kmods tar cvzf out/kheaders.tar.gz kheaders - name: release id: use-go-action uses: https://gitea.com/actions/release-action@main with: files: |- out/** api_key: '${{secrets.GITEA_TOKEN}}'
setup-goは必須なので注意してください。
- 実際の動作
おわりに
内容から察せられるかもしれませんが、これらの例は実際にG-clusterのカーネルで動作させているworkflowをペタペタ貼り付けただけの物です。
トリガなどの詳細な所は実際のworkflowsをご覧ください。
Actionsタブに動作中の様子も公開されています。
これらの機能のおかげで、数クリックでテストからリリースまでできるようになりました。
カーネルバージョンの追従を半年サボる事態が改善すれば良いのですが…