diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9867013a..5e7f8c65 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,8 +18,34 @@ env: DESTDIR: ./bin jobs: + prepare: + runs-on: ubuntu-latest + outputs: + validate-targets: ${{ steps.validate-targets.outputs.matrix }} + artifact-platforms: ${{ steps.artifact-platforms.outputs.matrix }} + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Validate targets matrix + id: validate-targets + run: | + echo "matrix=$(docker buildx bake validate --print | jq -cr '.group.default.targets')" >> $GITHUB_OUTPUT + - + name: Artifact platforms matrix + id: artifact-platforms + run: | + echo "matrix=$(docker buildx bake artifact-all --print | jq -cr '.target."artifact-all".platforms')" >> $GITHUB_OUTPUT + validate: runs-on: ubuntu-latest + needs: + - prepare + strategy: + fail-fast: false + matrix: + target: ${{ fromJson(needs.prepare.outputs.validate-targets) }} steps: - name: Checkout @@ -31,8 +57,7 @@ jobs: name: Validate uses: docker/bake-action@v2 with: - targets: validate - pull: true + targets: ${{ matrix.target }} test: runs-on: ubuntu-latest @@ -57,10 +82,88 @@ jobs: with: directory: ${{ env.DESTDIR }}/coverage - build: + artifact: runs-on: ubuntu-latest needs: + - prepare - validate + strategy: + fail-fast: false + matrix: + platform: ${{ fromJson(needs.prepare.outputs.artifact-platforms) }} + steps: + - + name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + - + name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - + name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build + uses: docker/bake-action@v2 + with: + targets: artifact + pull: true + set: | + *.platform=${{ matrix.platform }} + *.cache-from=type=gha,scope=artifact-${{ env.PLATFORM_PAIR }} + *.cache-to=type=gha,scope=artifact-${{ env.PLATFORM_PAIR }},mode=max + - + name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: diun + path: ${{ env.DESTDIR }} + if-no-files-found: error + + release: + runs-on: ubuntu-latest + needs: + - artifact + - test + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: diun + path: ${{ env.DESTDIR }} + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build + uses: docker/bake-action@v2 + with: + targets: release + - + name: GitHub Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + draft: true + files: | + ${{ env.DESTDIR }}/release/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + image: + runs-on: ubuntu-latest + needs: + - artifact - test steps: - @@ -68,6 +171,17 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 + - + name: Prepare + run: | + cfroms= + while read -r platform; do + if [ -n "$cfroms" ]; then cfroms="${cfroms}\n"; fi + cfroms="${cfroms}*.cache-from=type=gha,scope=artifact-${platform//\//-}" + done < <(docker buildx bake artifact-all --print | jq -r '.target."artifact-all".platforms[]') + echo "CACHE_FROMS<> $GITHUB_ENV + echo -e "$cfroms" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV - name: Docker meta id: meta @@ -108,25 +222,7 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Build artifacts - uses: docker/bake-action@v2 - with: - targets: artifact-all - pull: true - - - name: Release - uses: docker/bake-action@v2 - with: - targets: release - - - name: Upload artifacts - uses: actions/upload-artifact@v3 - with: - name: diun - path: ${{ env.DESTDIR }}/release/* - if-no-files-found: error - - - name: Build image + name: Build uses: docker/bake-action@v2 with: files: | @@ -135,16 +231,8 @@ jobs: targets: image-all pull: true push: ${{ github.event_name != 'pull_request' }} - - - name: GitHub Release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - files: | - ${{ env.DESTDIR }}/release/* - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + set: | + ${{ env.CACHE_FROMS }} - name: Check manifest if: github.event_name != 'pull_request'