Update .forgejo/workflows/build-images.yaml
This commit is contained in:
parent
c1c4c57987
commit
37ee355607
1 changed files with 102 additions and 95 deletions
|
@ -10,10 +10,12 @@ on:
|
||||||
|
|
||||||
jobs:
|
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
|
runs-on: ci-os
|
||||||
|
outputs:
|
||||||
|
channels: ${{ steps.export-channels.outputs.channels }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
@ -24,76 +26,73 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
# Path to the directory with metadata.yaml
|
# Path to the directory with metadata.yaml
|
||||||
context_dir="/workspace/pub/containers/apps/${{ github.event.inputs.app }}"
|
context_dir="/workspace/pub/containers/apps/${{ github.event.inputs.app }}"
|
||||||
metadata_file="$context_dir/metadata.yaml"
|
metadata_file="${context_dir}/metadata.yaml"
|
||||||
|
|
||||||
# If metadata.yaml doesn't exist, fail early
|
# If metadata.yaml doesn't exist, fail early.
|
||||||
if [ ! -f "$metadata_file" ]; then
|
if [ ! -f "$metadata_file" ]; then
|
||||||
echo "metadata.yaml not found at $metadata_file"
|
echo "metadata.yaml not found at $metadata_file"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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..."
|
echo "Parsing channels from $metadata_file..."
|
||||||
|
|
||||||
channel_count=$(yq '.channels | length' "$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="["
|
result="["
|
||||||
for i in $(seq 0 $((channel_count - 1))); do
|
for i in $(seq 0 $((channel_count - 1))); do
|
||||||
channel_name=$(yq ".channels[$i].name" "$metadata_file")
|
channel_name=$(yq e ".channels[$i].name" "$metadata_file")
|
||||||
platform_count=$(yq ".channels[$i].platforms | length" "$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
|
for j in $(seq 0 $((platform_count - 1))); do
|
||||||
platform=$(yq ".channels[$i].platforms[$j]" "$metadata_file")
|
platform=$(yq e ".channels[$i].platforms[$j]" "$metadata_file")
|
||||||
|
|
||||||
# Append JSON object
|
# Append JSON object
|
||||||
result="${result}{\"channel\":${channel_name},\"platform\":${platform}},"
|
result="${result}{\"channel\":\"${channel_name}\",\"platform\":\"${platform}\"},"
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
# Remove trailing comma
|
# Remove trailing comma
|
||||||
result="${result%,}]"
|
result="${result%,}]"
|
||||||
|
|
||||||
echo "Channel/Platform matrix: $result"
|
echo "Found channel/platform combinations: $result"
|
||||||
echo "$result" > matrix.json
|
|
||||||
|
|
||||||
- name: Upload matrix artifact
|
# Expose as job output for the next job's matrix
|
||||||
uses: actions/upload-artifact@v3
|
echo "channels=$result" >> "$GITHUB_OUTPUT"
|
||||||
with:
|
|
||||||
name: matrix
|
|
||||||
path: matrix.json
|
|
||||||
|
|
||||||
#################################################################
|
#################################################################
|
||||||
# 2) Download + parse matrix artifact -> set output
|
# 2) For each (channel, platform) combination -> build & push
|
||||||
#################################################################
|
|
||||||
check-matrix:
|
|
||||||
runs-on: ci-os
|
|
||||||
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:
|
build-and-push:
|
||||||
runs-on: ci-os
|
runs-on: ci-os
|
||||||
needs: [ check-matrix ]
|
needs: read-channels
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# Convert the string output from check-matrix back to a JSON array
|
include: ${{ fromJSON(needs.read-channels.outputs.channels) }}
|
||||||
includes: ${{ fromJSON(needs.check-matrix.outputs.matrix) }}
|
# This means: for each object in the array, we have "matrix.channel" and "matrix.platform"
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- 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
|
- id: set-context
|
||||||
name: Determine Context
|
name: Determine Context
|
||||||
run: |
|
run: |
|
||||||
|
@ -112,13 +111,21 @@ jobs:
|
||||||
- name: Build and Push with Kaniko
|
- name: Build and Push with Kaniko
|
||||||
uses: https://code.252.no/pub/kaniko-action@latest
|
uses: https://code.252.no/pub/kaniko-action@latest
|
||||||
with:
|
with:
|
||||||
|
# We pass the directory that holds Dockerfile, metadata.yaml, ci/version.sh, etc.
|
||||||
context: ${{ steps.set-context.outputs.context_dir }}
|
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: >
|
destinations: >
|
||||||
code.252.no/${{ github.repository }}/${{ github.event.inputs.app }}:${{ matrix.channel }}
|
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 }}
|
||||||
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: |
|
build_args: |
|
||||||
TARGETPLATFORM=${{ matrix.platform }}
|
TARGETPLATFORM=${{ matrix.platform }}
|
||||||
VERSION=${{ steps.read-version.outputs.version }}
|
VERSION=${{ steps.read-version.outputs.version }}
|
||||||
|
|
||||||
credentials: "code.252.no=tommy:${{ secrets.REGISTRY_TOKEN }}"
|
credentials: "code.252.no=tommy:${{ secrets.REGISTRY_TOKEN }}"
|
||||||
push: "true"
|
push: "true"
|
||||||
cache: "false"
|
cache: "false"
|
||||||
|
|
Loading…
Reference in a new issue