GitHub Actions로 재현 가능한 빌드하기

GitHub Actions로 재현 가능한 빌드하기 (Reproducible builds with GitHub Actions)

SOURCE_DATE_EPOCH는 빌드 도구가 재현 가능한 출력을 만들도록 지시하는 표준화된 환경 변수예요. 빌드에 이 환경 변수를 설정하면 이미지 인덱스, 구성, 파일 메타데이터의 타임스탬프가 지정된 Unix 시간을 반영하게 돼요.

출처: 문서

본문

env 속성으로 빌드 단계에 SOURCE_DATE_EPOCH를 설정할 수 있어요.

Unix epoch 타임스탬프 (Unix epoch timestamps)

SOURCE_DATE_EPOCH0(Unix epoch)으로 설정해요:

name: ci

on:
  push:

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

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

bake를 쓸 때도 env로 설정할 수 있어요:

name: ci

on:
  push:

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

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

Git 커밋 타임스탬프 (Git commit timestamps)

재현 가능한 빌드를 위해 Git 커밋 타임스탬프를 사용할 수도 있어요. SOURCE_DATE_EPOCH를 Git 커밋 시간에 맞추면 같은 커밋에서 빌드하면 항상 같은 결과가 나와요:

name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: ...

이렇게 하면 동일한 소스·커밋에서 빌드할 때마다 바이트까지 같은 이미지가 재현돼요.

더 알아보기 (Learn more)