ci: add container image attestation (#10478)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
		@ -29,9 +29,15 @@ outputs:
 | 
				
			|||||||
  imageTags:
 | 
					  imageTags:
 | 
				
			||||||
    description: "Docker image tags"
 | 
					    description: "Docker image tags"
 | 
				
			||||||
    value: ${{ steps.ev.outputs.imageTags }}
 | 
					    value: ${{ steps.ev.outputs.imageTags }}
 | 
				
			||||||
 | 
					  imageNames:
 | 
				
			||||||
 | 
					    description: "Docker image names"
 | 
				
			||||||
 | 
					    value: ${{ steps.ev.outputs.imageNames }}
 | 
				
			||||||
  imageMainTag:
 | 
					  imageMainTag:
 | 
				
			||||||
    description: "Docker image main tag"
 | 
					    description: "Docker image main tag"
 | 
				
			||||||
    value: ${{ steps.ev.outputs.imageMainTag }}
 | 
					    value: ${{ steps.ev.outputs.imageMainTag }}
 | 
				
			||||||
 | 
					  imageMainName:
 | 
				
			||||||
 | 
					    description: "Docker image main name"
 | 
				
			||||||
 | 
					    value: ${{ steps.ev.outputs.imageMainName }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
runs:
 | 
					runs:
 | 
				
			||||||
  using: "composite"
 | 
					  using: "composite"
 | 
				
			||||||
 | 
				
			|||||||
@ -50,8 +50,9 @@ else:
 | 
				
			|||||||
            f"{name}:gh-{safe_branch_name}-{int(time())}-{sha[:7]}{suffix}",  # Use by FluxCD
 | 
					            f"{name}:gh-{safe_branch_name}-{int(time())}-{sha[:7]}{suffix}",  # Use by FluxCD
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
image_main_tag = image_tags[0]
 | 
					image_main_tag = image_tags[0].split(":")[-1]
 | 
				
			||||||
image_tags_rendered = ",".join(image_tags)
 | 
					image_tags_rendered = ",".join(image_tags)
 | 
				
			||||||
 | 
					image_names_rendered = ",".join(set(name.split(":")[0] for name in image_tags))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
with open(os.environ["GITHUB_OUTPUT"], "a+", encoding="utf-8") as _output:
 | 
					with open(os.environ["GITHUB_OUTPUT"], "a+", encoding="utf-8") as _output:
 | 
				
			||||||
    print(f"shouldBuild={should_build}", file=_output)
 | 
					    print(f"shouldBuild={should_build}", file=_output)
 | 
				
			||||||
@ -59,4 +60,6 @@ with open(os.environ["GITHUB_OUTPUT"], "a+", encoding="utf-8") as _output:
 | 
				
			|||||||
    print(f"version={version}", file=_output)
 | 
					    print(f"version={version}", file=_output)
 | 
				
			||||||
    print(f"prerelease={prerelease}", file=_output)
 | 
					    print(f"prerelease={prerelease}", file=_output)
 | 
				
			||||||
    print(f"imageTags={image_tags_rendered}", file=_output)
 | 
					    print(f"imageTags={image_tags_rendered}", file=_output)
 | 
				
			||||||
 | 
					    print(f"imageNames={image_names_rendered}", file=_output)
 | 
				
			||||||
    print(f"imageMainTag={image_main_tag}", file=_output)
 | 
					    print(f"imageMainTag={image_main_tag}", file=_output)
 | 
				
			||||||
 | 
					    print(f"imageMainName={image_tags[0]}", file=_output)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								.github/workflows/ci-main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/ci-main.yml
									
									
									
									
										vendored
									
									
								
							@ -213,6 +213,9 @@ jobs:
 | 
				
			|||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      # Needed to upload contianer images to ghcr.io
 | 
					      # Needed to upload contianer images to ghcr.io
 | 
				
			||||||
      packages: write
 | 
					      packages: write
 | 
				
			||||||
 | 
					      # Needed for attestation
 | 
				
			||||||
 | 
					      id-token: write
 | 
				
			||||||
 | 
					      attestations: write
 | 
				
			||||||
    timeout-minutes: 120
 | 
					    timeout-minutes: 120
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v4
 | 
					      - uses: actions/checkout@v4
 | 
				
			||||||
@ -241,6 +244,7 @@ jobs:
 | 
				
			|||||||
        run: make gen-client-ts
 | 
					        run: make gen-client-ts
 | 
				
			||||||
      - name: Build Docker Image
 | 
					      - name: Build Docker Image
 | 
				
			||||||
        uses: docker/build-push-action@v6
 | 
					        uses: docker/build-push-action@v6
 | 
				
			||||||
 | 
					        id: push
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          context: .
 | 
					          context: .
 | 
				
			||||||
          secrets: |
 | 
					          secrets: |
 | 
				
			||||||
@ -253,6 +257,12 @@ jobs:
 | 
				
			|||||||
          cache-from: type=registry,ref=ghcr.io/goauthentik/dev-server:buildcache
 | 
					          cache-from: type=registry,ref=ghcr.io/goauthentik/dev-server:buildcache
 | 
				
			||||||
          cache-to: type=registry,ref=ghcr.io/goauthentik/dev-server:buildcache,mode=max
 | 
					          cache-to: type=registry,ref=ghcr.io/goauthentik/dev-server:buildcache,mode=max
 | 
				
			||||||
          platforms: linux/${{ matrix.arch }}
 | 
					          platforms: linux/${{ matrix.arch }}
 | 
				
			||||||
 | 
					      - uses: actions/attest-build-provenance@v1
 | 
				
			||||||
 | 
					        id: attest
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          subject-name: ${{ steps.ev.outputs.imageNames }}
 | 
				
			||||||
 | 
					          subject-digest: ${{ steps.push.outputs.digest }}
 | 
				
			||||||
 | 
					          push-to-registry: ${{ steps.ev.outputs.shouldBuild == 'true' }}
 | 
				
			||||||
  pr-comment:
 | 
					  pr-comment:
 | 
				
			||||||
    needs:
 | 
					    needs:
 | 
				
			||||||
      - build
 | 
					      - build
 | 
				
			||||||
@ -276,4 +286,4 @@ jobs:
 | 
				
			|||||||
      - name: Comment on PR
 | 
					      - name: Comment on PR
 | 
				
			||||||
        uses: ./.github/actions/comment-pr-instructions
 | 
					        uses: ./.github/actions/comment-pr-instructions
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          tag: gh-${{ steps.ev.outputs.imageMainTag }}
 | 
					          tag: ${{ steps.ev.outputs.imageMainTag }}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								.github/workflows/ci-outpost.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/ci-outpost.yml
									
									
									
									
										vendored
									
									
								
							@ -71,6 +71,9 @@ jobs:
 | 
				
			|||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      # Needed to upload contianer images to ghcr.io
 | 
					      # Needed to upload contianer images to ghcr.io
 | 
				
			||||||
      packages: write
 | 
					      packages: write
 | 
				
			||||||
 | 
					      # Needed for attestation
 | 
				
			||||||
 | 
					      id-token: write
 | 
				
			||||||
 | 
					      attestations: write
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v4
 | 
					      - uses: actions/checkout@v4
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
@ -96,6 +99,7 @@ jobs:
 | 
				
			|||||||
      - name: Generate API
 | 
					      - name: Generate API
 | 
				
			||||||
        run: make gen-client-go
 | 
					        run: make gen-client-go
 | 
				
			||||||
      - name: Build Docker Image
 | 
					      - name: Build Docker Image
 | 
				
			||||||
 | 
					        id: push
 | 
				
			||||||
        uses: docker/build-push-action@v6
 | 
					        uses: docker/build-push-action@v6
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          tags: ${{ steps.ev.outputs.imageTags }}
 | 
					          tags: ${{ steps.ev.outputs.imageTags }}
 | 
				
			||||||
@ -107,6 +111,12 @@ jobs:
 | 
				
			|||||||
          context: .
 | 
					          context: .
 | 
				
			||||||
          cache-from: type=registry,ref=ghcr.io/goauthentik/dev-${{ matrix.type }}:buildcache
 | 
					          cache-from: type=registry,ref=ghcr.io/goauthentik/dev-${{ matrix.type }}:buildcache
 | 
				
			||||||
          cache-to: type=registry,ref=ghcr.io/goauthentik/dev-${{ matrix.type }}:buildcache,mode=max
 | 
					          cache-to: type=registry,ref=ghcr.io/goauthentik/dev-${{ matrix.type }}:buildcache,mode=max
 | 
				
			||||||
 | 
					      - uses: actions/attest-build-provenance@v1
 | 
				
			||||||
 | 
					        id: attest
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          subject-name: ${{ steps.ev.outputs.imageNames }}
 | 
				
			||||||
 | 
					          subject-digest: ${{ steps.push.outputs.digest }}
 | 
				
			||||||
 | 
					          push-to-registry: ${{ steps.ev.outputs.shouldBuild == 'true' }}
 | 
				
			||||||
  build-binary:
 | 
					  build-binary:
 | 
				
			||||||
    timeout-minutes: 120
 | 
					    timeout-minutes: 120
 | 
				
			||||||
    needs:
 | 
					    needs:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										24
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							@ -11,6 +11,9 @@ jobs:
 | 
				
			|||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      # Needed to upload contianer images to ghcr.io
 | 
					      # Needed to upload contianer images to ghcr.io
 | 
				
			||||||
      packages: write
 | 
					      packages: write
 | 
				
			||||||
 | 
					      # Needed for attestation
 | 
				
			||||||
 | 
					      id-token: write
 | 
				
			||||||
 | 
					      attestations: write
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v4
 | 
					      - uses: actions/checkout@v4
 | 
				
			||||||
      - name: Set up QEMU
 | 
					      - name: Set up QEMU
 | 
				
			||||||
@ -41,6 +44,7 @@ jobs:
 | 
				
			|||||||
          mkdir -p ./gen-go-api
 | 
					          mkdir -p ./gen-go-api
 | 
				
			||||||
      - name: Build Docker Image
 | 
					      - name: Build Docker Image
 | 
				
			||||||
        uses: docker/build-push-action@v6
 | 
					        uses: docker/build-push-action@v6
 | 
				
			||||||
 | 
					        id: push
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          context: .
 | 
					          context: .
 | 
				
			||||||
          push: true
 | 
					          push: true
 | 
				
			||||||
@ -49,11 +53,20 @@ jobs:
 | 
				
			|||||||
            GEOIPUPDATE_LICENSE_KEY=${{ secrets.GEOIPUPDATE_LICENSE_KEY }}
 | 
					            GEOIPUPDATE_LICENSE_KEY=${{ secrets.GEOIPUPDATE_LICENSE_KEY }}
 | 
				
			||||||
          tags: ${{ steps.ev.outputs.imageTags }}
 | 
					          tags: ${{ steps.ev.outputs.imageTags }}
 | 
				
			||||||
          platforms: linux/amd64,linux/arm64
 | 
					          platforms: linux/amd64,linux/arm64
 | 
				
			||||||
 | 
					      - uses: actions/attest-build-provenance@v1
 | 
				
			||||||
 | 
					        id: attest
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          subject-name: ${{ steps.ev.outputs.imageNames }}
 | 
				
			||||||
 | 
					          subject-digest: ${{ steps.push.outputs.digest }}
 | 
				
			||||||
 | 
					          push-to-registry: true
 | 
				
			||||||
  build-outpost:
 | 
					  build-outpost:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      # Needed to upload contianer images to ghcr.io
 | 
					      # Needed to upload contianer images to ghcr.io
 | 
				
			||||||
      packages: write
 | 
					      packages: write
 | 
				
			||||||
 | 
					      # Needed for attestation
 | 
				
			||||||
 | 
					      id-token: write
 | 
				
			||||||
 | 
					      attestations: write
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
@ -95,12 +108,19 @@ jobs:
 | 
				
			|||||||
          password: ${{ secrets.GITHUB_TOKEN }}
 | 
					          password: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
      - name: Build Docker Image
 | 
					      - name: Build Docker Image
 | 
				
			||||||
        uses: docker/build-push-action@v6
 | 
					        uses: docker/build-push-action@v6
 | 
				
			||||||
 | 
					        id: push
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          push: true
 | 
					          push: true
 | 
				
			||||||
          tags: ${{ steps.ev.outputs.imageTags }}
 | 
					          tags: ${{ steps.ev.outputs.imageTags }}
 | 
				
			||||||
          file: ${{ matrix.type }}.Dockerfile
 | 
					          file: ${{ matrix.type }}.Dockerfile
 | 
				
			||||||
          platforms: linux/amd64,linux/arm64
 | 
					          platforms: linux/amd64,linux/arm64
 | 
				
			||||||
          context: .
 | 
					          context: .
 | 
				
			||||||
 | 
					      - uses: actions/attest-build-provenance@v1
 | 
				
			||||||
 | 
					        id: attest
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          subject-name: ${{ steps.ev.outputs.imageNames }}
 | 
				
			||||||
 | 
					          subject-digest: ${{ steps.push.outputs.digest }}
 | 
				
			||||||
 | 
					          push-to-registry: true
 | 
				
			||||||
  build-outpost-binary:
 | 
					  build-outpost-binary:
 | 
				
			||||||
    timeout-minutes: 120
 | 
					    timeout-minutes: 120
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
@ -178,8 +198,8 @@ jobs:
 | 
				
			|||||||
          image-name: ghcr.io/goauthentik/server
 | 
					          image-name: ghcr.io/goauthentik/server
 | 
				
			||||||
      - name: Get static files from docker image
 | 
					      - name: Get static files from docker image
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          docker pull ${{ steps.ev.outputs.imageMainTag }}
 | 
					          docker pull ${{ steps.ev.outputs.imageMainName }}
 | 
				
			||||||
          container=$(docker container create ${{ steps.ev.outputs.imageMainTag }})
 | 
					          container=$(docker container create ${{ steps.ev.outputs.imageMainName }})
 | 
				
			||||||
          docker cp ${container}:web/ .
 | 
					          docker cp ${container}:web/ .
 | 
				
			||||||
      - name: Create a Sentry.io release
 | 
					      - name: Create a Sentry.io release
 | 
				
			||||||
        uses: getsentry/action-release@v1
 | 
					        uses: getsentry/action-release@v1
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user