name: "Build and Push Images with Kaniko" on: push: paths: - 'apps/*/Dockerfile' workflow_dispatch: jobs: # 1) Find all Dockerfiles under apps/* and output them as JSON discover-dockerfiles: runs-on: ci-os outputs: dockerfiles: ${{ steps.set-matrix.outputs.dockerfiles }} steps: - name: Checkout uses: actions/checkout@v4 - id: set-matrix name: Find Dockerfiles run: | # Find all Dockerfiles in apps/* subdirectories files=$(find apps -mindepth 2 -maxdepth 2 -type f -name Dockerfile) # If no Dockerfiles found, output an empty array to avoid parsing errors if [ -z "$files" ]; then echo 'dockerfiles=[]' >> "$GITHUB_OUTPUT" exit 0 fi # Build a JSON array of Dockerfile paths json="[" for f in $files; do json="${json}\"$f\"," done # Remove trailing comma and close array json="${json%,}]" # Write to job output echo "dockerfiles=$json" >> "$GITHUB_OUTPUT" # 2) For each Dockerfile discovered, build & push with Kaniko build-and-push: runs-on: ci-os needs: discover-dockerfiles strategy: fail-fast: false matrix: dockerfile: ${{ fromJSON(needs.discover-dockerfiles.outputs.dockerfiles) }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Build and Push with Kaniko uses: https://code.252.no/pub/kaniko-action@latest with: context: ./ dockerfile: ${{ matrix.dockerfile }} destinations: > code.252.no/${{ github.repository }}/${ { matrix.dockerfile // remove `apps/` // remove `/Dockerfile` // e.g. "apps/ci-os/Dockerfile" => "ci-os" // There's no built-in function to do this inline, so consider a real approach: }}:latest credentials: "code.252.no=tommy:${{ secrets.REGISTRY_TOKEN }}" push: "true" cache: "false" # cache_repo: "code.252.no/${{ github.repository }}/cache"