From b32e6f5c2d4fcb4873a2aed3d26067c4eadd022c Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 30 Oct 2024 15:40:56 -0700 Subject: [PATCH] Add testing containers workflow --- .github/workflows/testing-containers.yml | 232 +++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 .github/workflows/testing-containers.yml diff --git a/.github/workflows/testing-containers.yml b/.github/workflows/testing-containers.yml new file mode 100644 index 0000000..c04e2ea --- /dev/null +++ b/.github/workflows/testing-containers.yml @@ -0,0 +1,232 @@ +name: "Salt Testing 🐳 Container" + +on: + workflow_dispatch: + schedule: + - cron: "0 19 * * *" + push: + branches: + - '*' + paths: + - containers.yml + - '.github/workflows/testing-containers.yml' + - 'custom/testing/*' + pull_request: + paths: + - containers.yml + - '.github/workflows/testing-containers.yml' + - 'custom/testing/*' + +env: + COLUMNS: 190 + PATH_IN_REPO: custom/testing + + +concurrency: + # New builds always cancel previous, still running, builds + group: custom/testing-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + matrix-generator: + name: Generate Matrix + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.set-matrix.outputs.tags }} + name: ${{ steps.set-matrix.outputs.name }} + dockerinfo: ${{ steps.set-matrix.outputs.dockerinfo }} + steps: + - name: "Throttle Builds" + run: | + t="$(shuf -i 5-30 -n 1)"; echo "Sleeping $t seconds"; sleep "$t" + + - name: "Fetching Repository Contents" + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install Requirements + run: | + python -m pip install -r requirements.txt + + - name: Show tools version + run: | + tools --debug --version + + - name: "Generate Matrix Data" + id: set-matrix + run: | + tools ci matrix ${{ env.PATH_IN_REPO }} + + build: + runs-on: ubuntu-latest + needs: matrix-generator + name: "Build ${{ matrix.dockerinfo.name }}:${{ matrix.dockerinfo.tag }}${{ matrix.dockerinfo.platform && format(' ({0})', matrix.dockerinfo.platform) || ''}}" + strategy: + fail-fast: false + max-parallel: 10 + matrix: + dockerinfo: ${{ fromJson(needs.matrix-generator.outputs.dockerinfo) }} + + permissions: + actions: read + checks: write + issues: read + packages: write + pull-requests: read + repository-projects: read + statuses: read + + steps: + - name: "Fetching Repository Contents" + uses: actions/checkout@v4 + + - name: "Throttle concurrent pushes" + run: | + t="$(shuf -i 5-30 -n 1)"; echo "Sleeping $t seconds"; sleep "$t" + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/${{ github.repository }}/${{ matrix.dockerinfo.name }} + tags: | + type=raw,value=${{ matrix.dockerinfo.tag }} + flavor: | + latest=false + + - name: "Docker QEMU" + uses: docker/setup-qemu-action@v3 + + - name: "Docker BuildX" + id: buildx + uses: docker/setup-buildx-action@v3 + + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + + - name: "Log into GitHub Container Registry" + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: "Build & Publish" + uses: docker/build-push-action@v5 + id: build + with: + file: ${{ matrix.dockerinfo.file }} + context: ${{ env.PATH_IN_REPO }} + platforms: ${{ matrix.dockerinfo.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=ghcr.io/${{ github.repository }}/${{ matrix.dockerinfo.name }},push-by-digest=true,name-canonical=true,push=${{ + github.repository == 'saltstack/salt-ci-containers' && contains(fromJSON('["push", "schedule", "workflow_dispatch"]'), github.event_name) }} + + - name: Export digest + if: ${{ github.repository == 'saltstack/salt-ci-containers' && contains(fromJSON('["push", "schedule", "workflow_dispatch"]'), github.event_name) }} + run: | + mkdir -p /tmp/digests + touch "/tmp/digests/$(echo ${{ steps.build.outputs.digest }} | cut -d ':' -f 2)" + ls -lah /tmp/digests + + - name: Upload digest + if: ${{ github.repository == 'saltstack/salt-ci-containers' && contains(fromJSON('["push", "schedule", "workflow_dispatch"]'), github.event_name) }} + uses: actions/upload-artifact@v4 + with: + name: digests-${{ matrix.dockerinfo.name }}-${{ matrix.dockerinfo.tag }}-${{ matrix.dockerinfo.platform_slug }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + name: "Merge ${{ needs.matrix-generator.outputs.name }}:${{ matrix.tag }}" + if: ${{ github.repository == 'saltstack/salt-ci-containers' && contains(fromJSON('["push", "schedule", "workflow_dispatch"]'), github.event_name) }} + + strategy: + fail-fast: false + max-parallel: 10 + matrix: + tag: ${{ fromJson(needs.matrix-generator.outputs.tags) }} + + needs: + - matrix-generator + - build + + permissions: + actions: read + checks: write + issues: read + packages: write + pull-requests: read + repository-projects: read + statuses: read + + steps: + + - name: "Fetching Repository Contents" + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install Requirements + run: | + python -m pip install -r requirements.txt + + - name: Show tools version + run: | + tools --debug --version + + - name: Download digests + uses: actions/download-artifact@v4 + with: + pattern: digests-${{ needs.matrix-generator.outputs.name }}-${{ matrix.tag }}-* + merge-multiple: true + path: /tmp/digests + + - name: Show digests + run: | + tree -a /tmp/digests + cat /tmp/digests/* + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/${{ github.repository }}/${{ needs.matrix-generator.outputs.name }} + tags: | + type=raw,value=${{ matrix.tag }} + flavor: | + latest=false + + - name: "Log into GitHub Container Registry" + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create manifest list and push + run: | + tools ci create-manifest-list-and-push ghcr.io/${{ github.repository }}/${{ needs.matrix-generator.outputs.name }} /tmp/digests + + - name: Inspect image + run: | + docker buildx imagetools inspect ghcr.io/${{ github.repository }}/${{ needs.matrix-generator.outputs.name }}:${{ steps.meta.outputs.version }}