name: Docker Build & Push to GitHub Container Registry (Use git tags with format vX.Y.Z as release version) on: workflow_call: inputs: image_name: type: string required: true description: > Docker image name without registry and owner. Example: observability/alloy build_context: type: string required: false default: . description: > Path to the Docker build context. Example: . or ./services/api file_path: type: string required: false default: ./Dockerfile description: > Path to the Dockerfile relative to the repository root. Example: ./Dockerfile or ./services/api/Dockerfile platforms: type: string required: false default: linux/amd64,linux/arm64 description: > Comma-separated list of target platforms to build. Example: linux/amd64,linux/arm64 jobs: build-and-push: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout uses: actions/checkout@v4 - name: Set up QEMU (for cross-arch builds) uses: docker/setup-qemu-action@v3 with: platforms: arm64 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Ensure lowercase username because some registries do not allow uppercase letters id: lowercase run: echo "username=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: ghcr.io/${{ steps.lowercase.outputs.username }}/${{ inputs.image_name }} tags: | type=match,pattern=.*(v\d+\.\d+\.\d+),group=1 type=match,pattern=.*(v\d+\.\d+)\.\d+,group=1 type=match,pattern=.*(v\d+)\.\d+\.\d+,group=1 # - name: Login to GitHub Container Registry # uses: docker/login-action@v3 # with: # registry: ghcr.io # username: ${{ github.repository_owner }} # password: ${{ secrets.GITHUB_TOKEN }} # - name: Build and push # uses: docker/build-push-action@v6 # with: # context: ${{ inputs.build_context }} # file: ${{ inputs.file_path }} # platforms: ${{ inputs.platforms }} # push: true # tags: ${{ steps.meta.outputs.tags }} # labels: ${{ steps.meta.outputs.labels }}