SPEC CPU2006のSimPoint解析までをGitHub Actionsで自動化する必要があった。 セルフホステッドランナーとDockerを使って実装したので、その作業ログを残しておく。
まずは、GitHub Actionsのワークフローファイルを作成した。最初は以下のような構成にした。
jobs: simpoint: runs-on: self-hosted container: image: simpoint-runner:latest steps: - name: Run analysis run: make run_simpoint
しかし、これだとcontainer:キーワードがDockerHubからイメージをプルしようとしてしまう。
セルフホステッドランナー上でローカルにビルドしたイメージを使いたいので、この方法は使えない。
Dockerイメージのビルド
リポジトリのDockerfileからイメージをビルドするジョブを追加した。
build-docker: runs-on: self-hosted steps: - name: Checkout repository uses: actions/checkout@v4 - name: Build Docker image run: | docker build -t simpoint-runner:latest \ --build-arg RISCV_ARG=/riscv-linux \ -f Dockerfile .
これで、セルフホステッドランナー上で直接Dockerイメージをビルドできるようになった。DockerHubにプッシュする必要はない。
Dockerコンテナでの実行
container:キーワードが使えないので、docker runコマンドで明示的にコンテナを実行するようにした。
simpoint: runs-on: self-hosted needs: build-docker steps: - name: Checkout repository uses: actions/checkout@v4 - name: Run analysis run: | docker run --rm \ -v ${{ github.workspace }}:/workspace \ -w /workspace/spec2006_work \ simpoint-runner:latest bash -c "make run_simpoint"
これで、ローカルでビルドしたイメージを使って実行できるようになった。
ISOファイルのマウント
SPEC CPU2006のISOファイルがサーバー上の/home/msyksphinz/spec_bechmarks/SPECCPU_2006_v1.1.isoにある。
これをコンテナ内で読み込めるようにする必要があった。
最初は、ISOファイルをワークスペースにコピーしようとしたが、数GBあるので時間がかかりすぎる。 代わりに、Dockerのボリュームマウントを使うことにした。
docker run --rm \
-v ${{ github.workspace }}:/workspace \
-v /home/kimura/spec_bechmarks:/home/msyksphinz/spec_bechmarks:ro \
-w /workspace/spec2006_work \
simpoint-runner:latest bash -c "..."
:roオプションで読み取り専用にしている。
これで、コンテナ内から/home/msyksphinz/spec_bechmarks/SPECCPU_2006_v1.1.isoにアクセスできるようになった。
QEMUとRISC-Vツールチェーンを使うために、環境変数を設定する必要があった。
-e RISCV=/riscv-linux -e PATH=/workspace/qemu-9.2.4/build:/riscv-linux/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RISCVはRISC-Vツールチェーンのルートパスを指定する。PATHには、QEMUとRISC-Vツールチェーンを優先的に使用するように設定した。
最初は、並列ジョブ数を固定で-j8にしていた。しかし、実行サーバのCPU数に応じて調整したいと思った。
NPROC=$((nproc / 2))
make build -j${NPROC}
nprocコマンドでCPU数を取得し、その半分を使用するようにした。