Zenn
Closed13

GitHub Actionsでbuildとpushのstepを分けるには

ida.ida.

以下をstepから分けたい。
理由はイメージビルドとインフラの構築を同時にやって起動時間を短縮するため

- name: Build
        env:
          REPO: xxxxxxxxxxx
        run: docker build -t $(eval echo $REPO):latest
- name: push
        env:
          REPO: xxxxxxxxxxx
        run: docker push $(eval echo $REPO):latest
ida.ida.

Download後すぐに削除するactionを追加するともっとストレージをを圧縮できる
https://github.com/c-hive/gha-remove-artifacts

オープンソースなので、ストレージが無料枠を超えそうなら検討する。
(今回は導入を見送る)

ida.ida.

やっぱり削除したくなってきてAPIで対応しようという気になってきた。
以下で行けるか確認

- name: Delete Artifact
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: |
    ARTIFACT_ID=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
      https://api.github.com/repos/${{ github.repository }}/actions/artifacts \
      | jq -r '.artifacts[] | select(.name=="pre-build-image.tar") | .id')
    if [ -n "$ARTIFACT_ID" ]; then
      echo "Deleting existing artifact with ID $ARTIFACT_ID"
      curl -X DELETE -H "Authorization: token $GITHUB_TOKEN" \
        https://api.github.com/repos/${{ github.repository }}/actions/artifacts/$ARTIFACT_ID
    else
      echo "No existing artifact found."
    fi
ida.ida.

buildからartifactアップロードまで

以下で検証

- name: Build
  run: docker build -t test:latest --output type=tar,dest=build-image.tar
- name: Upload Artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-image.tar
    path: ./build-image.tar
    retention-days: 1
ida.ida.

アップロードまでは上手くいったけど容量が少ない。
サーバ起動で普通にエラーになった。save方式に変更してみる

- name: Build
  run: |
    docker build -t test:latest
    docker save -o build-image.tar test:latest
- name: Upload Artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-image.tar
    path: ./build-image.tar
    retention-days: 1
ida.ida.

Downloadについて

- name: Load Docker Image
   run: docker load -i pre-build-image.tar
ida.ida.

エラーになった。
調べるとimportでやるらしい?

- name: Load Docker Image
  env:
    REPO: xxxxxxxxxxx
  run: cat build-image.tar | docker import - $(eval echo $REPO):latest
ida.ida.

importだとサーバ起動時にエラー。
結果、docker loadでよかったがbuild時の出力形式がtar形式ではダメだった。
--output type=dockerでも良さそうだが、docker saveで対応する

- name: Build
   env:
     REPO: xxxxxxxxxxx
   run: |
     docker build -t $(eval echo $REPO):latest 
     docker save -o build-image.tar $(eval echo $REPO):latest
~~~~~
- name: Load Docker Image
   run: docker load -i build-image.tar
ida.ida.

どうして --output type=tar が問題になる場合があるのか?

  • --output type=tar は Docker イメージではなく OCI イメージを保存します。
  • この形式は docker load に対応していないため、通常のイメージ操作には向きません。

GPTによると、とのことでした

ida.ida.

別の要因でbuild時に$REPOが取得できなかったので、暫定的にタグ付けしてpush前に再度タグ付けをするように変更

- name: Build Docker Image
  run: |
  docker build -t build-image:latest
  docker save -o build-image.tar build-image:latest
~~~~
- name: push
  env:
    ECR_REPO: xxxxxxxxxxx
  run: |
    docker tag build-image:latest $(eval echo $REPO):latest
    docker push $(eval echo $REPO):latest

evalやめたいんだけど、変数展開できない。。泣

このスクラップは3ヶ月前にクローズされました
ログインするとコメントできます