| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- name: Reusable workflow to run trivy scan
- on:
- workflow_call:
- inputs:
- image-name:
- required: true
- type: string
- image-tag:
- required: false
- type: string
- tag-suffix:
- required: true
- type: string
- dockerfile:
- required: true
- type: string
- ref:
- required: false
- default: main
- type: string
- build-args:
- required: true
- type: string
- build-arch:
- required: true
- type: string
- build-platform:
- required: true
- type: string
- secrets:
- GHCR_USERNAME:
- required: true
- GHCR_TOKEN:
- required: true
- env:
- IMAGE_NAME: ${{ inputs.image-name }}
- TAG_SUFFIX: ${{ inputs.tag-suffix }}
- ARCH: ${{ inputs.build-arch }}
- DOCKERFILE: ${{ inputs.dockerfile }}
- IS_FORK: ${{ secrets.GHCR_USERNAME == '' && 'true' || 'false' }}
- jobs:
- build-publish:
- name: Build and Publish
- runs-on: ubuntu-latest
- outputs:
- image-tag: ${{ steps.container_info.outputs.image-tag }}
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- with:
- ref: ${{ inputs.ref }}
- - name: Setup QEMU
- uses: docker/setup-qemu-action@v3
- with:
- platforms: all
- - name: Setup Docker Buildx
- uses: docker/setup-buildx-action@v3
- with:
- version: 'v0.4.2'
- install: true
- - name: Setup Go
- uses: actions/setup-go@v5
- id: setup-go
- with:
- go-version-file: "go.mod"
- - name: Download Go modules
- if: ${{ steps.setup-go.outputs.cache-hit != 'true' }}
- run: go mod download
- - name: Fetch History
- shell: bash
- run: git fetch --prune --unshallow
- - name: Login to Docker
- uses: docker/login-action@v3
- if: env.IS_FORK == 'false'
- with:
- registry: ghcr.io
- username: ${{ secrets.GHCR_USERNAME }}
- password: ${{ secrets.GHCR_TOKEN }}
- - name: Get docker image tag
- id: container_info
- shell: bash
- env:
- GITHUB_REF: ${{ github.ref }}
- run: |
- # rebuild-image
- if [ "${{ inputs.image-tag }}" != "" ]; then
- TAG="${{ inputs.image-tag }}${{ inputs.tag-suffix }}"
- # main / release-x.y
- elif [[ "$GITHUB_REF" == "refs/heads/main" || "$GITHUB_REF" =~ refs/heads/release-.* ]]; then
- TAG=${GITHUB_REF#refs/heads/}${{ inputs.tag-suffix }}
- # Pull Request
- else
- TAG=$(make docker.tag)
- fi
- echo "::set-output name=image-tag::${TAG}"
- - name: Build & Publish Artifacts
- if: env.IS_FORK == 'false'
- shell: bash
- env:
- IMAGE_TAG: ${{ steps.container_info.outputs.image-tag }}
- BUILD_ARGS: ${{ inputs.build-args }}
- DOCKER_BUILD_ARGS: >-
- --push
- --platform ${{ inputs.build-platform }}
- run: make docker.build
- - name: Build & Publish Artifacts fork
- if: env.IS_FORK == 'true'
- shell: bash
- env:
- IMAGE_TAG: ${{ steps.container_info.outputs.image-tag }}
- BUILD_ARGS: ${{ inputs.build-args }}
- DOCKER_BUILD_ARGS: --load
- run: make docker.build
- - name: Run Trivy vulnerability scanner
- uses: aquasecurity/trivy-action@master
- with:
- image-ref: ${{ inputs.image-name }}:${{ steps.container_info.outputs.image-tag }}
- format: 'table'
- exit-code: '1'
- ignore-unfixed: true
- vuln-type: 'os,library'
- severity: 'CRITICAL,HIGH'
- sign:
- runs-on: ubuntu-latest
- needs: build-publish
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Sign image
- if: env.IS_FORK == 'false'
- uses: ./.github/actions/sign
- with:
- image-name: ${{ inputs.image-name }}
- image-tag: ${{ needs.build-publish.outputs.image-tag }}
- GHCR_USERNAME: ${{ secrets.GHCR_USERNAME }}
- GHCR_TOKEN: ${{ secrets.GHCR_TOKEN }}
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|