Skip to content

Commit 7d8bdb1

Browse files
committed
wip: add tag-driven release pipeline for krawler and jobs #2
1 parent 5fba067 commit 7d8bdb1

3 files changed

Lines changed: 209 additions & 6 deletions

File tree

.github/workflows/main.yaml

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
name: Run tests
3939
if: ${{
4040
github.event_name == 'workflow_dispatch' && inputs.run_tests ||
41-
github.event_name == 'push' && !contains(github.event.head_commit.message, 'skip tests')
41+
github.event_name == 'push' && github.ref_type == 'branch' && !contains(github.event.head_commit.message, 'skip tests')
4242
}}
4343
runs-on: ubuntu-22.04
4444
services:
@@ -76,7 +76,7 @@ jobs:
7676
name: Additional tests
7777
if: ${{
7878
github.event_name == 'workflow_dispatch' && inputs.additional_tests ||
79-
github.event_name == 'push' && contains(github.event.head_commit.message, 'additional tests')
79+
github.event_name == 'push' && github.ref_type == 'branch' && contains(github.event.head_commit.message, 'additional tests')
8080
}}
8181
runs-on: ubuntu-22.04
8282
services:
@@ -114,7 +114,7 @@ jobs:
114114
name: Build app
115115
if: ${{
116116
github.event_name == 'workflow_dispatch' && inputs.build_app ||
117-
github.event_name == 'push' && !contains(github.event.head_commit.message, 'skip app')
117+
github.event_name == 'push' && github.ref_type == 'branch' && !contains(github.event.head_commit.message, 'skip app')
118118
}}
119119
runs-on: ubuntu-22.04
120120
steps:
@@ -137,7 +137,7 @@ jobs:
137137
name: Detect jobs
138138
if: ${{
139139
github.event_name == 'workflow_dispatch' && inputs.build_jobs ||
140-
github.event_name == 'push' && contains(github.event.head_commit.message, 'build jobs')
140+
github.event_name == 'push' && github.ref_type == 'branch' && contains(github.event.head_commit.message, 'build jobs')
141141
}}
142142
runs-on: ubuntu-22.04
143143
outputs:
@@ -187,7 +187,7 @@ jobs:
187187
name: Build doc
188188
if: ${{
189189
github.event_name == 'workflow_dispatch' && inputs.build_docs ||
190-
github.event_name == 'push' && contains(github.event.head_commit.message, 'doc')
190+
github.event_name == 'push' && github.ref_type == 'branch' && contains(github.event.head_commit.message, 'doc')
191191
}}
192192
runs-on: ubuntu-22.04
193193
steps:
@@ -205,3 +205,75 @@ jobs:
205205
env:
206206
SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
207207
run: bash ./scripts/build_docs.sh -p -r ${{ github.job }}
208+
209+
detect_release:
210+
name: Detect release
211+
if: ${{ github.event_name == 'push' && github.ref_type == 'tag' }}
212+
runs-on: ubuntu-22.04
213+
outputs:
214+
target: ${{ steps.compute.outputs.target }}
215+
package: ${{ steps.compute.outputs.package }}
216+
version: ${{ steps.compute.outputs.version }}
217+
matrix: ${{ steps.compute.outputs.matrix }}
218+
has_jobs: ${{ steps.compute.outputs.has_jobs }}
219+
steps:
220+
- name: Checkout repo
221+
uses: actions/checkout@v4
222+
with:
223+
submodules: true
224+
- name: Detect release
225+
id: compute
226+
env:
227+
GITHUB_REF_NAME: ${{ github.ref_name }}
228+
run: bash ./scripts/detect_release.sh
229+
230+
release_krawler:
231+
needs: detect_release
232+
if: needs.detect_release.outputs.target == 'krawler'
233+
strategy:
234+
fail-fast: false
235+
matrix:
236+
node: [ 20 ]
237+
debian: [ 'bookworm' ]
238+
name: Release krawler (${{ needs.detect_release.outputs.version }})
239+
runs-on: ubuntu-22.04
240+
steps:
241+
- name: Checkout repo
242+
uses: actions/checkout@v4
243+
with:
244+
submodules: true
245+
- name: Init runner
246+
run: bash ./scripts/init_runner.sh build_app
247+
- name: Setup workspace
248+
env:
249+
KALISIO_GITHUB_URL: ${{ secrets.KALISIO_GITHUB_URL }}
250+
run: bash ./scripts/setup_workspace.sh
251+
- name: Build & publish app
252+
env:
253+
SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
254+
run: bash ./scripts/build_app.sh -n ${{ matrix.node }} -d ${{ matrix.debian }} -p -r ${{ github.job }}
255+
256+
release_jobs:
257+
needs: detect_release
258+
if: needs.detect_release.outputs.has_jobs == 'true'
259+
strategy:
260+
fail-fast: false
261+
matrix:
262+
include: ${{ fromJSON(needs.detect_release.outputs.matrix) }}
263+
name: Release job (${{ matrix.package }}${{ matrix.variant && format(' / {0}', matrix.variant) || '' }})
264+
runs-on: ubuntu-22.04
265+
steps:
266+
- name: Checkout repo
267+
uses: actions/checkout@v4
268+
with:
269+
submodules: true
270+
- name: Init runner
271+
run: bash ./scripts/init_runner.sh build_jobs
272+
- name: Setup workspace
273+
env:
274+
KALISIO_GITHUB_URL: ${{ secrets.KALISIO_GITHUB_URL }}
275+
run: bash ./scripts/setup_workspace.sh
276+
- name: Build & publish job
277+
env:
278+
SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
279+
run: bash ./scripts/build_krawler_job.sh -j ${{ matrix.package }} ${{ matrix.variant && format('-v {0}', matrix.variant) || '' }} -p -r "${{ github.job }} ${{ matrix.package }}"

scripts/build_app.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ load_value_files "$WORKSPACE_DIR/development/common/KALISIO_DOCKERHUB_PASSWORD.e
6464
# Remove trailing @ in module name
6565
IMAGE_NAME="$KALISIO_DOCKERHUB_URL/${APP:1}"
6666
if [[ -z "$GIT_TAG" ]]; then
67-
KRAWLER_TAG="dev"
67+
KRAWLER_TAG="latest"
6868
else
6969
KRAWLER_TAG="$VERSION"
7070
fi

scripts/detect_release.sh

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
# set -x
4+
5+
# Detect which package is being released from a pushed git tag.
6+
#
7+
# Expected tag format (produced by `pnpm changeset publish`):
8+
# @kalisio/krawler@X.Y.Z -> framework release
9+
# @kalisio/krawler-<name>@X.Y.Z -> job release (all variants)
10+
#
11+
# Strategy:
12+
# 1. Parse GITHUB_REF_NAME with the regex ^@([^/]+)/(.+)@(.+)$
13+
# 2. Resolve the package directory under packages/
14+
# 3. Cross-check the parsed version against package.json.version (must match)
15+
# 4. Emit a target ("krawler" or "jobs") plus, for jobs, the per-variant matrix
16+
#
17+
# Output:
18+
# stdout -> JSON matrix (jobs path only, framework path prints "[]")
19+
# stderr -> log messages
20+
# GITHUB_OUTPUT -> target, package, version, matrix, has_jobs
21+
#
22+
# Exits non-zero on:
23+
# - tag that doesn't match the expected Changesets format
24+
# - unknown package (no matching directory under packages/)
25+
# - mismatch between tag version and package.json.version
26+
#
27+
# Usage (dev mode):
28+
# GITHUB_REF_NAME='@kalisio/krawler@2.9.0' bash ./scripts/detect_release.sh
29+
# GITHUB_REF_NAME='@kalisio/krawler-meteofrance@1.5.0' bash ./scripts/detect_release.sh
30+
#
31+
# Usage (CI mode):
32+
# GITHUB_REF_NAME is injected by the workflow on push tag events.
33+
34+
THIS_FILE=$(readlink -f "${BASH_SOURCE[0]}")
35+
THIS_DIR=$(dirname "$THIS_FILE")
36+
37+
. "$THIS_DIR/kash/kash.sh" >&2
38+
39+
REPO_ROOT=$(git rev-parse --show-toplevel)
40+
PACKAGES_DIR="$REPO_ROOT/packages"
41+
42+
GITHUB_REF_NAME="${GITHUB_REF_NAME:-}"
43+
44+
if [[ -z "$GITHUB_REF_NAME" ]]; then
45+
echo "-> Error: GITHUB_REF_NAME is not set" >&2
46+
exit 1
47+
fi
48+
49+
begin_group "Detect release ($GITHUB_REF_NAME)" >&2
50+
51+
# Parse tag : @<scope>/<name>@<version>
52+
if [[ ! "$GITHUB_REF_NAME" =~ ^@([^/]+)/(.+)@(.+)$ ]]; then
53+
echo "-> Error: tag '$GITHUB_REF_NAME' does not match expected format '@<scope>/<package>@<version>'" >&2
54+
exit 1
55+
fi
56+
57+
SCOPE="${BASH_REMATCH[1]}"
58+
PKG_NAME="${BASH_REMATCH[2]}"
59+
TAG_VERSION="${BASH_REMATCH[3]}"
60+
61+
echo "-> scope=$SCOPE package=$PKG_NAME version=$TAG_VERSION" >&2
62+
63+
# Resolve package directory.
64+
# The published name @kalisio/krawler maps to packages/krawler, while
65+
# @kalisio/krawler-<job> maps to packages/krawler-<job>. The PKG_NAME parsed
66+
# from the tag already matches the directory name in both cases.
67+
PKG_DIR="$PACKAGES_DIR/$PKG_NAME"
68+
if [[ ! -d "$PKG_DIR" ]]; then
69+
echo "-> Error: package directory '$PKG_DIR' does not exist" >&2
70+
exit 1
71+
fi
72+
73+
# Cross-check package.json.version against tag.
74+
PKG_VERSION=$(jq -r '.version' "$PKG_DIR/package.json")
75+
if [[ "$PKG_VERSION" != "$TAG_VERSION" ]]; then
76+
echo "-> Error: tag version '$TAG_VERSION' does not match $PKG_NAME/package.json version '$PKG_VERSION'" >&2
77+
exit 1
78+
fi
79+
80+
# Variants listing (same convention as detect_jobs.sh): a job has variants iff
81+
# it ships one or more `dockerfile.<variant>` files; otherwise the single
82+
# `dockerfile` produces one image with no variant.
83+
_list_variants() {
84+
local PKG_DIR="$1"
85+
local HAS_VARIANTS=false
86+
local DF
87+
for DF in "$PKG_DIR"/dockerfile.*; do
88+
[[ -e "$DF" ]] || continue
89+
HAS_VARIANTS=true
90+
echo "${DF##*/dockerfile.}"
91+
done
92+
if [[ "$HAS_VARIANTS" == false ]]; then
93+
echo ""
94+
fi
95+
}
96+
97+
# Decide target and (for jobs) build matrix.
98+
if [[ "$PKG_NAME" == "krawler" ]]; then
99+
TARGET="krawler"
100+
MATRIX_JSON='[]'
101+
HAS_JOBS=false
102+
echo "-> Framework release: kalisio/krawler:$TAG_VERSION" >&2
103+
else
104+
TARGET="jobs"
105+
ENTRIES=()
106+
while IFS= read -r VARIANT; do
107+
ENTRIES+=("${PKG_NAME}|${VARIANT}")
108+
done < <(_list_variants "$PKG_DIR")
109+
110+
MATRIX_JSON=$(printf '%s\n' "${ENTRIES[@]}" \
111+
| jq -Rn '[inputs | split("|") | {package: .[0], variant: .[1]}]')
112+
HAS_JOBS=true
113+
echo "-> Job release: $PKG_NAME v$TAG_VERSION" >&2
114+
echo "$MATRIX_JSON" | jq -r '.[] | " - \(.package)\(if .variant != "" then " / \(.variant)" else "" end)"' >&2
115+
fi
116+
117+
end_group "Detect release ($GITHUB_REF_NAME)" >&2
118+
119+
# Write to GITHUB_OUTPUT when running in CI
120+
if [[ "${CI:-false}" == "true" ]] && [[ -n "${GITHUB_OUTPUT:-}" ]]; then
121+
MATRIX_ONELINE=$(echo "$MATRIX_JSON" | jq -c '.')
122+
{
123+
echo "target=${TARGET}"
124+
echo "package=${PKG_NAME}"
125+
echo "version=${TAG_VERSION}"
126+
echo "matrix=${MATRIX_ONELINE}"
127+
echo "has_jobs=${HAS_JOBS}"
128+
} >> "${GITHUB_OUTPUT}"
129+
fi
130+
131+
echo "$MATRIX_JSON"

0 commit comments

Comments
 (0)