春雨日記 about me tags

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が存在します。

https://gitea.com/gitea/tea

恐らく機能的には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が発生して立てられませんでした。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
::group::Pushing pull request branch to 'origin/pr-defconfig-16'
[command]/usr/bin/git push --force-with-lease origin pr-defconfig-16:refs/heads/pr-defconfig-16
remote: 
remote: Create a new pull request for 'pr-defconfig-16':        
remote:   https://git.haru3.me/haru/linux-test/compare/master...pr-defconfig-16        
remote: 
remote: . Processing 1 references        
remote: Processed 1 references in total        
To https://git.haru3.me/haru/linux-test
 * [new branch]          pr-defconfig-16 -> pr-defconfig-16
::endgroup::
::group::Create or update the pull request
Attempting creation of pull request
::error::GetForkedRepo
::group::Restore git configuration

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タブに動作中の様子も公開されています。

これらの機能のおかげで、数クリックでテストからリリースまでできるようになりました。

カーネルバージョンの追従を半年サボる事態が改善すれば良いのですが…