diff --git a/.forgejo/workflows/build-images.yaml b/.forgejo/workflows/build-images.yaml index 6474721..6358a0b 100644 --- a/.forgejo/workflows/build-images.yaml +++ b/.forgejo/workflows/build-images.yaml @@ -10,108 +10,115 @@ on: jobs: ################################################################# - # 1) Parse metadata.yaml -> produce JSON array of (channel, platform) items + # 1) Collect channel/platform JSON -> Upload artifact ################################################################# - read-channels: - runs-on: ci-os - outputs: - channels: ${{ steps.export-channels.outputs.channels }} + matrix: + runs-on: ubuntu-22.04 steps: - - name: Checkout - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - - id: export-channels - name: Read channels from metadata.yaml - shell: bash - run: | - # Path to the directory with metadata.yaml - context_dir="/workspace/pub/containers/apps/${{ github.event.inputs.app }}" - metadata_file="$context_dir/metadata.yaml" + - id: export-channels + name: Read channels from metadata.yaml + shell: bash + run: | + # Path to the directory with metadata.yaml + context_dir="/workspace/pub/containers/apps/${{ github.event.inputs.app }}" + metadata_file="$context_dir/metadata.yaml" - ls -lhart /workspace/pub/containers/apps/ - ls -lhart /workspace/pub/containers/apps/home-assistant + # If metadata.yaml doesn't exist, fail early + if [ ! -f "$metadata_file" ]; then + echo "metadata.yaml not found at $metadata_file" + exit 1 + fi - # If metadata.yaml doesn't exist, fail early. - if [ ! -f "$metadata_file" ]; then - echo "metadata.yaml not found at $metadata_file" - exit 1 - fi + echo "Parsing channels from $metadata_file..." - echo "Parsing channels from $metadata_file..." + channel_count=$(yq '.channels | length' "$metadata_file") + result="[" + for i in $(seq 0 $((channel_count - 1))); do + channel_name=$(yq ".channels[$i].name" "$metadata_file") + platform_count=$(yq ".channels[$i].platforms | length" "$metadata_file") - # First, get the total channel count: - channel_count=$(cat "$metadata_file" | yq '.channels | length') - - # We'll build the array in bash: - result="[" - for i in $(seq 0 $((channel_count - 1))); do - channel_name=$(cat "$metadata_file" | yq ".channels[$i].name" ) - # Number of platforms in this channel: - platform_count=$(cat "$metadata_file" | yq ".channels[$i].platforms | length") - - for j in $(seq 0 $((platform_count - 1))); do - platform=$(cat "$metadata_file" | yq ".channels[$i].platforms[$j]") - - # Append JSON object - result="${result}{\"channel\":${channel_name},\"platform\":${platform}}," + for j in $(seq 0 $((platform_count - 1))); do + platform=$(yq ".channels[$i].platforms[$j]" "$metadata_file") + # Append JSON object + result="${result}{\"channel\":${channel_name},\"platform\":${platform}}," + done done - done - # Remove trailing comma - result="${result%,}]" + # Remove trailing comma + result="${result%,}]" - echo "Found channel/platform combinations: $result" + echo "Channel/Platform matrix: $result" + echo "$result" > matrix.json - # Expose as job output for the next job's matrix - echo "channels=$result" >> "$GITHUB_OUTPUT" + - name: Upload matrix artifact + uses: actions/upload-artifact@v3 + with: + name: matrix + path: matrix.json ################################################################# - # 2) For each (channel, platform) combination -> build & push + # 2) Download + parse matrix artifact -> set output + ################################################################# + check-matrix: + runs-on: ubuntu-22.04 + needs: [ matrix ] + outputs: + matrix: ${{ steps.extract.outputs.matrix }} + steps: + - uses: actions/download-artifact@v3 + with: + name: matrix + + - id: extract + name: Read matrix.json + shell: bash + run: | + # Using jq to "compact" the JSON into one line: + matrix="$(jq -c . matrix.json)" + echo "::set-output name=matrix::$matrix" + + ################################################################# + # 3) For each (channel, platform) combination -> build & push ################################################################# build-and-push: - runs-on: ci-os - needs: read-channels + runs-on: ubuntu-22.04 + needs: [ check-matrix ] strategy: fail-fast: false matrix: - include: ${{ needs.read-channels.outputs.channels }} - # This means: for each object in the array, we have "matrix.channel" and "matrix.platform" + # Convert the string output from check-matrix back to a JSON array + includes: ${{ fromJSON(needs.check-matrix.outputs.matrix) }} steps: - - name: Checkout - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - - id: set-context - name: Determine Context - run: | - # We'll reuse the same directory from job #1 - context_dir="/workspace/pub/containers/apps/${{ github.event.inputs.app }}" - echo "context_dir=$context_dir" >> "$GITHUB_OUTPUT" + - id: set-context + name: Determine Context + run: | + # We'll reuse the same directory from job #1 + context_dir="/workspace/pub/containers/apps/${{ github.event.inputs.app }}" + echo "context_dir=$context_dir" >> "$GITHUB_OUTPUT" - - id: read-version - name: Read Version from version.sh - run: | - version=$(bash "${{ steps.set-context.outputs.context_dir }}/ci/version.sh" || echo "") - echo "Building channel '${{ matrix.channel }}' with platform '${{ matrix.platform }}'" - echo "Version: $version" - echo "version=$version" >> "$GITHUB_OUTPUT" + - id: read-version + name: Read Version from version.sh + run: | + version=$(bash "${{ steps.set-context.outputs.context_dir }}/ci/version.sh" || echo "") + echo "Building channel '${{ matrix.channel }}' with platform '${{ matrix.platform }}'" + echo "Version: $version" + echo "version=$version" >> "$GITHUB_OUTPUT" - - name: Build and Push with Kaniko - uses: https://code.252.no/pub/kaniko-action@latest - with: - # We pass the directory that holds Dockerfile, metadata.yaml, ci/version.sh, etc. - context: ${{ steps.set-context.outputs.context_dir }} - - # We'll build two tags: - # 1) : - # 2) : - # Example: code.252.no/org/repo:stable, code.252.no/org/repo:2023.5.0 - destinations: > - code.252.no/${{ github.repository }}/${{ github.event.inputs.app }}:${{ matrix.channel }} code.252.no/${{ github.repository }}/${{ github.event.inputs.app }}:${{ steps.read-version.outputs.version }} - - # If your Dockerfile uses ARG TARGETPLATFORM (e.g. in FROM lines), pass it in build_args - build_args: | - TARGETPLATFORM=${{ matrix.platform }} - VERSION=${{ steps.read-version.outputs.version }} - - credentials: "code.252.no=tommy:${{ secrets.REGISTRY_TOKEN }}" - push: "true" - cache: "false" + - name: Build and Push with Kaniko + uses: https://code.252.no/pub/kaniko-action@latest + with: + context: ${{ steps.set-context.outputs.context_dir }} + destinations: > + code.252.no/${{ github.repository }}/${{ github.event.inputs.app }}:${{ matrix.channel }} + code.252.no/${{ github.repository }}/${{ github.event.inputs.app }}:${{ steps.read-version.outputs.version }} + build_args: | + TARGETPLATFORM=${{ matrix.platform }} + VERSION=${{ steps.read-version.outputs.version }} + credentials: "code.252.no=tommy:${{ secrets.REGISTRY_TOKEN }}" + push: "true" + cache: "false"