GitHub Actions を使った再現可能なビルド

SOURCE_DATE_EPOCH標準化された環境変数 (standardized environment variable) であり、ビルドツールに対して再現可能なビルドを生成することを指示します。 ビルドの際にこの環境変数を設定しておくと、イメージインデックス、設定情報、ファイルメタデータの中にあるタイムスタンプを、指定された Unix 時間にすることができます。

GitHub Actions 内にて環境変数を設定するには、ビルドステップにおいてビルトインの env プロパティを利用します。

Unix エポックのタイムスタンプ

以下の例では SOURCE_DATE_EPOCH を Unix エポック時間の値 0 に設定します。


name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build
        uses: docker/build-push-action@v6
        with:
          tags: user/app:latest
        env:
          SOURCE_DATE_EPOCH: 0
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build
        uses: docker/bake-action@v5
        env:
          SOURCE_DATE_EPOCH: 0

Git コミットのタイムスタンプ

以下の例では SOURCE_DATE_EPOCH を Git コミットのタイムスタンプに設定します。


name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Get Git commit timestamps
        run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV

      - name: Build
        uses: docker/build-push-action@v6
        with:
          tags: user/app:latest
        env:
          SOURCE_DATE_EPOCH: ${{ env.TIMESTAMP }}
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Get Git commit timestamps
        run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV

      - name: Build
        uses: docker/bake-action@v5
        env:
          SOURCE_DATE_EPOCH: ${{ env.TIMESTAMP }}

さらなる情報

BuildKit における SOURCE_DATE_EPOCH サポートの詳細は BuildKit ドキュメント を参照してください。