Skip to content

Commit 186ec90

Browse files
authored
Reconciling changes from ubi, jammy and noble (#10)
* adding capability of using image instead of stack naming on the assets * fix: push image workflow * feat: adding more control over the naming of the assets * fix: adding more control over naming fix: adding missing bracket fix: typo fix: typo fix: typo fix: wrong path refactor: for loop for each asset debug code remove me fix: typo on tag prefix fix: push image workflow * fix: excluding copying file if default stack is not found * fix: proper naming for the 3rd option on asset_pattern
1 parent 9c93edb commit 186ec90

File tree

6 files changed

+474
-272
lines changed

6 files changed

+474
-272
lines changed

.github/workflows/create-release.yml

Lines changed: 307 additions & 228 deletions
Large diffs are not rendered by default.

.github/workflows/push-image.yml

Lines changed: 109 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ on:
1313

1414
env:
1515
REGISTRIES_FILEPATH: "registries.json"
16-
STACKS_FILEPATH: "stacks/images.json"
16+
STACKS_FILEPATH: "images.json"
1717
GCR_REGISTRY: "gcr.io"
1818
GCR_USERNAME: "_json_key"
1919

@@ -27,6 +27,10 @@ jobs:
2727
push_to_gcr: ${{ steps.parse_configs.outputs.push_to_gcr }}
2828
push_to_dockerhub: ${{ steps.parse_configs.outputs.push_to_dockerhub }}
2929
tag: ${{ steps.event.outputs.tag }}
30+
os_codename: ${{ steps.repo.outputs.os_codename }}
31+
os_name: ${{ steps.repo.outputs.os_name }}
32+
repo_type: ${{ steps.repo.outputs.repo_type }}
33+
stacks: ${{ steps.get-stacks.outputs.stacks }}
3034
steps:
3135
- name: Checkout
3236
uses: actions/checkout@v4
@@ -47,39 +51,116 @@ jobs:
4751
- name: Set matrix
4852
id: set-matrix
4953
run: |
50-
release_version="${{ steps.event.outputs.tag }}"
51-
release_info=$(curl -s "https://api.github.com/repos/${{ github.repository }}/releases/tags/v${release_version}")
52-
oci_release_assets=$(echo $release_info | jq -c --arg asset_prefix "$asset_prefix" '[ .assets[] | select(.name | endswith(".oci")) | {name: (.name | split(".oci") | .[0]), url}]' | jq -c '.[]')
53-
54-
matrix=$(jq -n -c '[]')
54+
stacks=$(jq -c '.images | .[]' ${STACKS_FILEPATH})
55+
version="${{ steps.event.outputs.tag }}"
56+
os_name=$( jq -r '.os_name' ${STACKS_FILEPATH} )
57+
os_codename=$( jq -r '.os_codename' ${STACKS_FILEPATH} )
58+
repo_type=$( jq -r '.repo_type' ${STACKS_FILEPATH} )
59+
60+
# Start with an empty array
61+
asset_names=$(jq -n -c '[]')
62+
63+
for stack in $stacks; do
64+
stack_name=$(echo "$stack" | jq -r '.name')
65+
stack_type=$(echo "$stack" | jq -r '.stack_type // ""')
66+
67+
# .oci artifacts for the run image
68+
run_image=$(echo "$stack" | jq -r '.run_image')
69+
build_image=$(echo "$stack" | jq -r '.build_image')
70+
71+
if [ $pattern_assets_prefix == "os_codename-stack_type-repo_type" ]; then
72+
asset_prefix="${os_codename}-${stack_type}-${repo_type}"
73+
elif [ $pattern_assets_prefix == "os_codename-repo_type" ]; then
74+
asset_prefix="${os_codename}-${repo_type}"
75+
fi
5576
56-
if [ -f ${{ env.STACKS_FILEPATH }} ]; then
57-
pattern_image_registry_name=$(jq '.pattern_image_registry_name' ${{ env.STACKS_FILEPATH }})
58-
os_name=$(jq -r '.os_name' ${{ env.STACKS_FILEPATH }})
59-
else
60-
pattern_image_registry_name="build_image_run_image-os_codename-stack_type"
61-
fi
77+
pattern_assets_prefix=$(echo "$stack" | jq -r '.pattern_assets_prefix // ""')
78+
if [[ "$pattern_assets_prefix" == "os_name-os_codename-build_image_run_image-stack_type-version-arch" ]]; then
79+
run_image_asset_prefix="${os_name}-${os_codename}-${run_image}-${stack_type}-${version}"
80+
build_image_asset_prefix="${os_name}-${os_codename}-${build_image}-${stack_type}-${version}"
81+
elif [[ "$pattern_assets_prefix" == "os_name-os_codename-build_image_run_image-version-arch" ]]; then
82+
run_image_asset_prefix="${os_name}-${os_codename}-${run_image}-${version}"
83+
build_image_asset_prefix="${os_name}-${os_codename}-${build_image}-${version}"
84+
elif [[ "$pattern_assets_prefix" == "os_codename-stack_type-repo_type-version-arch-build_image_run_image" ]]; then
85+
run_image_asset_prefix="${os_codename}-${stack_type}-${repo_type}-${version}-${run_image}"
86+
build_image_asset_prefix="${os_codename}-${stack_type}-${repo_type}-${version}-${build_image}"
87+
fi
6288
63-
for oci_asset in $oci_release_assets; do
64-
oci_asset_name=$(echo $oci_asset | jq -r '.name')
65-
oci_asset_url=$(echo $oci_asset | jq -r '.url')
66-
os_codename=$(echo $oci_asset | jq -r '.name' | cut -d '-' -f 1)
67-
stack_type=$(echo $oci_asset | jq -r '.name' | cut -d '-' -f 2)
68-
build_or_run_image_name=$(echo $oci_asset | jq -r '.name' | cut -d '-' -f 5- | cut -d '.' -f 1)
69-
70-
if [ $pattern_image_registry_name == "build_image_run_image-os_codename-stack_type" ]; then
71-
image_registry_name="${build_or_run_image_name}-${os_codename}-${stack_type}"
72-
else
73-
image_registry_name="${os_name}-${os_codename}-${build_or_run_image_name}-${stack_type}"
89+
pattern_image_registry_name=$(echo "$stack" | jq -r '.pattern_image_registry_name // ""')
90+
if [ $pattern_image_registry_name == "os_name-os_codename-build_image_run_image-stack_type" ]; then
91+
build_image_registry_name="${os_name}-${os_codename}-${build_image}-${stack_type}"
92+
run_image_registry_name="${os_name}-${os_codename}-${run_image}-${stack_type}"
93+
elif [ $pattern_image_registry_name == "os_name-os_codename-build_image_run_image" ]; then
94+
build_image_registry_name="${os_name}-${os_codename}-${build_image}"
95+
run_image_registry_name="${os_name}-${os_codename}-${run_image}"
96+
elif [ $pattern_image_registry_name == "build_image_run_image-os_codename-stack_type" ]; then
97+
build_image_registry_name="${build_image}-${os_codename}-${stack_type}"
98+
run_image_registry_name="${run_image}-${os_codename}-${stack_type}"
7499
fi
75100
76-
matrix=$(echo $matrix | jq -c --arg os_codename "$os_codename" \
77-
--arg oci_asset_name "$oci_asset_name" \
78-
--arg registry_name "$image_registry_name" \
79-
--arg oci_asset_url "$oci_asset_url" \
80-
'. + [{name: $oci_asset_name, registry_name: $registry_name, oci_asset_url: $oci_asset_url}]')
101+
asset_names="$(jq -c \
102+
--arg image_filepath "image-files" \
103+
--arg stack_name "${stack_name}" \
104+
--arg run_image_asset_prefix "${run_image_asset_prefix}" \
105+
--arg run_image_registry_name "${run_image_registry_name}" \
106+
'. += [
107+
{
108+
"name": $run_image_asset_prefix,
109+
"path": ($image_filepath + "/" + "current-run-image-" + $stack_name + "/run" + ".oci"),
110+
"registry_name": $run_image_registry_name
111+
}
112+
]' <<<"${asset_names}")"
113+
114+
# .oci artifacts for the build image
115+
create_build_image=$(echo "$stack" | jq -r '.create_build_image // false')
116+
if [[ $create_build_image == true ]]; then
117+
118+
asset_names="$(jq -c \
119+
--arg image_filepath "image-files" \
120+
--arg stack_name "${stack_name}" \
121+
--arg build_image_asset_prefix "${build_image_asset_prefix}" \
122+
--arg build_image_registry_name "${build_image_registry_name}" \
123+
'. += [
124+
{
125+
"name": $build_image_asset_prefix,
126+
"path": ($image_filepath + "/" + "current-build-image-" + $stack_name + "/build" + ".oci"),
127+
"registry_name": $build_image_registry_name
128+
129+
}
130+
]' <<<"${asset_names}")"
131+
fi
81132
done
82133
134+
release_version="${{ steps.event.outputs.tag }}"
135+
release_info=$(curl -s "https://api.github.com/repos/${{ github.repository }}/releases/tags/v${release_version}")
136+
oci_release_assets=$(echo "$release_info" | jq -c \
137+
'[ .assets[]
138+
| select(.name | endswith(".oci"))
139+
| {name: (.name | split(".oci") | .[0]), oci_asset_url: .url}
140+
]')
141+
142+
oci_release_assets_length=$(echo "$oci_release_assets" | jq 'length')
143+
asset_names_length=$(echo "$asset_names" | jq 'length')
144+
145+
if [ "$oci_release_assets_length" != "$asset_names_length" ]; then
146+
echo "Produced assets do not match the release assets."
147+
exit 1
148+
fi
149+
150+
matrix=$(jq -n -c --argjson a "$oci_release_assets" --argjson b "$asset_names" '
151+
$a | map(
152+
. as $oci_item
153+
| ($b[] | select(.name == $oci_item.name)) as $asset_item
154+
| $oci_item + $asset_item
155+
)
156+
')
157+
158+
matrix_length=$(echo "$matrix" | jq 'length')
159+
if [ "$matrix_length" != "$asset_names_length" ]; then
160+
echo "Produced assets do not match the release assets."
161+
exit 1
162+
fi
163+
83164
echo "matrix=${matrix}"
84165
echo "matrix=${matrix}" >> "$GITHUB_OUTPUT"
85166

images.json

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"support_usns": true,
3+
"receipts_show_limit": 16,
4+
"platforms": ["linux/amd64", "linux/arm64"],
5+
"os_name": "ubuntu",
6+
"os_codename": "noble",
7+
"repo_type": "image",
8+
"images": [
9+
{
10+
"name": "noble-tiny",
11+
"config_dir": "stacks/noble-tiny-stack",
12+
"output_dir": "builds/noble-tiny-stack",
13+
"build_image": "build",
14+
"run_image": "run",
15+
"stack_type": "tiny",
16+
"pattern_image_registry_name": "os_name-os_codename-build_image_run_image-stack_type",
17+
"pattern_assets_prefix": "os_name-os_codename-build_image_run_image-stack_type-version-arch"
18+
},
19+
{
20+
"name": "noble-static",
21+
"config_dir": "stacks/noble-static-stack",
22+
"output_dir": "builds/noble-static-stack",
23+
"build_image": "build",
24+
"run_image": "run",
25+
"build_receipt_filename": "build-receipt.cyclonedx.json",
26+
"run_receipt_filename": "run-receipt.cyclonedx.json",
27+
"stack_type": "static",
28+
"pattern_image_registry_name": "os_name-os_codename-build_image_run_image-stack_type",
29+
"pattern_assets_prefix": "os_name-os_codename-build_image_run_image-stack_type-version-arch"
30+
},
31+
{
32+
"name": "noble-base",
33+
"config_dir": "stacks/noble-base-stack",
34+
"output_dir": "builds/noble-base-stack",
35+
"build_image": "build",
36+
"run_image": "run",
37+
"create_build_image": true,
38+
"stack_type": "base",
39+
"pattern_image_registry_name": "os_name-os_codename-build_image_run_image",
40+
"pattern_assets_prefix": "os_name-os_codename-build_image_run_image-version-arch"
41+
}
42+
]
43+
}

scripts/create.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ set -o pipefail
66
readonly PROG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
77
readonly ROOT_DIR="$(cd "${PROG_DIR}/.." && pwd)"
88
readonly BIN_DIR="${ROOT_DIR}/.bin"
9-
readonly IMAGES_JSON="${ROOT_DIR}/stacks/images.json"
9+
readonly IMAGES_JSON="${ROOT_DIR}/images.json"
1010

1111
# shellcheck source=SCRIPTDIR/.util/tools.sh
1212
source "${PROG_DIR}/.util/tools.sh"
@@ -67,7 +67,9 @@ function main() {
6767
if [ -f "${IMAGES_JSON}" ]; then
6868
# we need to copy images.json for inclusion in the build image
6969
defaultStackPath=$(jq -r '.images[] | select(.name == "default") | .config_dir' "${IMAGES_JSON}")
70-
cp $IMAGES_JSON $ROOT_DIR/$defaultStackPath/images.json
70+
if [ -n "$defaultStackPath" ]; then
71+
cp $IMAGES_JSON "${ROOT_DIR}/${defaultStackPath}/images.json"
72+
fi
7173
fi
7274

7375
# if stack or build argument is provided but not both, then throw an error

scripts/receipts.sh

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,7 @@ function receipts::generate::multi::arch() {
152152
fileName=$(basename ${runOutput})
153153
fi
154154

155-
if [ $imageArch = "amd64" ]; then
156-
imageReceipt="${dir}/${fileName}"
157-
else
158-
imageReceipt="${dir}/${imageArch}-${fileName}"
159-
fi
155+
imageReceipt="${dir}/${imageArch}-${fileName}"
160156

161157
util::print::info "Generating CycloneDX package SBOM using syft for $archiveName on platform linux/$imageArch saved as $imageReceipt"
162158

stacks/images.json

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
{
22
"support_usns": true,
3-
"update_on_new_image": true,
43
"receipts_show_limit": 16,
54
"platforms": ["linux/amd64", "linux/arm64"],
65
"os_name": "ubuntu",
76
"os_codename": "noble",
8-
"pattern_image_registry_name": "os-os_codename-build_image_run_image-stack_type",
7+
"repo_type": "image",
98
"images": [
109
{
1110
"name": "noble-tiny",
1211
"config_dir": "stacks/noble-tiny-stack",
1312
"output_dir": "builds/noble-tiny-stack",
1413
"build_image": "build",
1514
"run_image": "run",
16-
"build_receipt_filename": "build-receipt.cyclonedx.json",
17-
"run_receipt_filename": "run-receipt.cyclonedx.json",
18-
"stack_type": "tiny"
15+
"stack_type": "tiny",
16+
"pattern_image_registry_name": "os_name-os_codename-build_image_run_image-stack_type",
17+
"pattern_assets_prefix": "os_name-os_codename-build_image_run_image-stack_type-version-arch"
1918
},
2019
{
2120
"name": "noble-static",
@@ -25,18 +24,20 @@
2524
"run_image": "run",
2625
"build_receipt_filename": "build-receipt.cyclonedx.json",
2726
"run_receipt_filename": "run-receipt.cyclonedx.json",
28-
"stack_type": "static"
27+
"stack_type": "static",
28+
"pattern_image_registry_name": "os_name-os_codename-build_image_run_image-stack_type",
29+
"pattern_assets_prefix": "os_name-os_codename-build_image_run_image-stack_type-version-arch"
2930
},
3031
{
3132
"name": "noble-base",
3233
"config_dir": "stacks/noble-base-stack",
3334
"output_dir": "builds/noble-base-stack",
3435
"build_image": "build",
3536
"run_image": "run",
36-
"build_receipt_filename": "build-receipt.cyclonedx.json",
37-
"run_receipt_filename": "run-receipt.cyclonedx.json",
3837
"create_build_image": true,
39-
"stack_type": "base"
38+
"stack_type": "base",
39+
"pattern_image_registry_name": "os_name-os_codename-build_image_run_image",
40+
"pattern_assets_prefix": "os_name-os_codename-build_image_run_image-version-arch"
4041
}
4142
]
4243
}

0 commit comments

Comments
 (0)