Update .forgejo/workflows/build-images.yaml

This commit is contained in:
Tommy 2025-01-03 17:05:53 +00:00
parent c1c4c57987
commit 37ee355607
Signed by: Mooo[bot]
GPG key ID: CF3AFE4D5B62BB9A

View file

@ -10,115 +10,122 @@ on:
jobs:
#################################################################
# 1) Collect channel/platform JSON -> Upload artifact
# 1) Parse metadata.yaml -> produce JSON array of (channel, platform) items
#################################################################
matrix:
read-channels:
runs-on: ci-os
steps:
- 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"
# 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..."
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")
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
# Remove trailing comma
result="${result%,}]"
echo "Channel/Platform matrix: $result"
echo "$result" > matrix.json
- name: Upload matrix artifact
uses: actions/upload-artifact@v3
with:
name: matrix
path: matrix.json
#################################################################
# 2) Download + parse matrix artifact -> set output
#################################################################
check-matrix:
runs-on: ci-os
needs: [ matrix ]
outputs:
matrix: ${{ steps.extract.outputs.matrix }}
channels: ${{ steps.export-channels.outputs.channels }}
steps:
- uses: actions/download-artifact@v3
with:
name: matrix
- name: Checkout
uses: actions/checkout@v4
- 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"
- 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"
# If metadata.yaml doesn't exist, fail early.
if [ ! -f "$metadata_file" ]; then
echo "metadata.yaml not found at $metadata_file"
exit 1
fi
# We want a JSON array of objects like:
# [
# {"channel":"stable","platform":"linux/amd64"},
# {"channel":"beta","platform":"linux/amd64"},
# {"channel":"beta","platform":"linux/arm64"}
# ]
# We'll parse channels[].name and channels[].platforms[].
echo "Parsing channels from $metadata_file..."
# We'll produce a JSON array using yq + bash:
# for each channel in .channels[], take channel.name as "channel",
# and for each p in channel.platforms, create an object { channel, platform }.
# You can do it purely in yq or mix with shell logic. Here's one example:
# First, get the total channel count:
channel_count=$(yq e '.channels | length' "$metadata_file")
# We'll build the array in bash:
result="["
for i in $(seq 0 $((channel_count - 1))); do
channel_name=$(yq e ".channels[$i].name" "$metadata_file")
# Number of platforms in this channel:
platform_count=$(yq e ".channels[$i].platforms | length" "$metadata_file")
for j in $(seq 0 $((platform_count - 1))); do
platform=$(yq e ".channels[$i].platforms[$j]" "$metadata_file")
# Append JSON object
result="${result}{\"channel\":\"${channel_name}\",\"platform\":\"${platform}\"},"
done
done
# Remove trailing comma
result="${result%,}]"
echo "Found channel/platform combinations: $result"
# Expose as job output for the next job's matrix
echo "channels=$result" >> "$GITHUB_OUTPUT"
#################################################################
# 3) For each (channel, platform) combination -> build & push
# 2) For each (channel, platform) combination -> build & push
#################################################################
build-and-push:
runs-on: ci-os
needs: [ check-matrix ]
needs: read-channels
strategy:
fail-fast: false
matrix:
# Convert the string output from check-matrix back to a JSON array
includes: ${{ fromJSON(needs.check-matrix.outputs.matrix) }}
include: ${{ fromJSON(needs.read-channels.outputs.channels) }}
# This means: for each object in the array, we have "matrix.channel" and "matrix.platform"
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"
- run: echo "Channel is ${{ matrix.channel }} and platform is ${{ matrix.platform }}"
- name: Debug matrix
run: |
echo "Matrix from check-matrix: ${{ needs.check-matrix.outputs.matrix }}"
- 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:
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"
- 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) :<channel>
# 2) :<version>
# 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"