11version : ' 3'
2-
32silent : true
4-
53vars :
64 PR_TEMPLATE : https://raw.githubusercontent.com/devops-infra/.github/refs/tags/v1/PULL_REQUEST_TEMPLATE.md
75 CONFIGS_BASE_URL : https://raw.githubusercontent.com/devops-infra/.github/refs/tags/v1/templates/dockerized/configs
86 TASKFILES_BASE_URL : https://raw.githubusercontent.com/devops-infra/.github/refs/tags/v1/templates/dockerized/taskfiles
9-
107tasks :
118 pre-commit :
129 desc : Run all pre-commit hooks
@@ -29,34 +26,12 @@ tasks:
2926 lint:actionlint :
3027 desc : Lint GitHub Actions workflows with actionlint
3128 cmds :
32- - |
33- echo "▶️ Running actionlint..."
34- set +e
35- docker run --rm -i -v "$PWD:/work" -w /work rhysd/actionlint:latest -color
36- rc=$?
37- set -e
38- if [ "$rc" -eq 0 ]; then
39- echo "✅ actionlint passed"
40- else
41- echo "❌ actionlint failed"
42- exit $rc
43- fi
29+ - task : scripts:lint:actionlint
4430
4531 lint:hadolint :
4632 desc : Lint Dockerfile with hadolint
4733 cmds :
48- - |
49- echo "▶️ Running hadolint..."
50- set +e
51- docker run --rm -i -v "$PWD:/work" -w /work hadolint/hadolint:latest-debian < Dockerfile
52- rc=$?
53- set -e
54- if [ "$rc" -eq 0 ]; then
55- echo "✅ hadolint passed"
56- else
57- echo "❌ hadolint failed"
58- exit $rc
59- fi
34+ - task : scripts:lint:hadolint
6035
6136 lint:shellcheck :
6237 desc : Lint shell scripts with shellcheck
@@ -66,36 +41,17 @@ tasks:
6641 lint:yamllint :
6742 desc : Lint YAML files with yamllint
6843 cmds :
69- - |
70- echo "▶️ Running yamllint..."
71- set +e
72- docker run --rm -i -v "$PWD:/work" -w /work cytopia/yamllint -c .yamllint.yml .
73- rc=$?
74- set -e
75- if [ "$rc" -eq 0 ]; then
76- echo "✅ yamllint passed"
77- else
78- echo "❌ yamllint failed"
79- exit $rc
80- fi
44+ - task : scripts:lint:yamllint
8145
8246 dependency:update :
83- desc : Update repository dependencies not covered by dependabot
47+ desc : ' No-op: no dedicated dependency updater configured for this profile '
8448 cmds :
85- - task : scripts:packages :update
49+ - task : scripts:dependency :update
8650
8751 version:set :
8852 desc : Validate version
8953 cmds :
90- - |
91- if [ -z "{{.VERSION}}" ]; then
92- echo "❌ ERROR: VERSION is empty"
93- exit 1
94- fi
95- if ! echo "{{.VERSION}}" | grep -Eq '^v?[0-9]+\.[0-9]+\.[0-9]+$'; then
96- echo "❌ ERROR: VERSION '{{.VERSION}}' is not a valid semantic version (expected vX.Y.Z or X.Y.Z)"
97- exit 1
98- fi
54+ - task : scripts:version:set
9955
10056 version:update:patch :
10157 desc : Increment patch version (e.g., 1.2.3 -> 1.2.4)
@@ -115,135 +71,24 @@ tasks:
11571 version:resolve-next :
11672 desc : Resolve next version from bump type and profile
11773 cmds :
118- - |
119- set -eu
120- bump_type="${BUMP_TYPE:-patch}"
121- input_version="${INPUT_VERSION:-}"
122-
123- normalize_version() {
124- candidate="${1#v}"
125- if ! printf "%s" "${candidate}" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
126- return 1
127- fi
128- printf "v%s" "${candidate}"
129- }
130-
131- current="$(task version:get 2>/dev/null || true)"
132-
133- case "$bump_type" in
134- set)
135- [ -n "$input_version" ] || { echo "Missing version for type=set"; exit 1; }
136- next="$(normalize_version "$input_version")" || {
137- echo "Invalid explicit version: $input_version. Expected vX.Y.Z or X.Y.Z"
138- exit 1
139- }
140- ;;
141- patch|minor|major)
142- [ -n "$current" ] || { echo "Current version not found or invalid. Expected vX.Y.Z"; exit 1; }
143- current="$(normalize_version "$current")" || { echo "Current version not found or invalid. Expected vX.Y.Z"; exit 1; }
144- no_v="${current#v}"
145- major="$(printf "%s" "$no_v" | awk -F. '{print $1}')"
146- minor="$(printf "%s" "$no_v" | awk -F. '{print $2}')"
147- patch="$(printf "%s" "$no_v" | awk -F. '{print $3}')"
148- case "$bump_type" in
149- patch) next="v${major}.${minor}.$((patch + 1))" ;;
150- minor) next="v${major}.$((minor + 1)).0" ;;
151- major) next="v$((major + 1)).0.0" ;;
152- esac
153- ;;
154- *)
155- echo "Unknown type: $bump_type"
156- exit 1
157- ;;
158- esac
159-
160- printf "%s" "$next"
74+ - task : scripts:version:resolve-next
16175
16276 version:tag-release :
16377 desc : Create set of git tags
16478 cmds :
165- - |
166- set -eu
167- if (set -o | grep -q pipefail) 2>/dev/null; then set -o pipefail; fi
168-
169- REMOTE='origin'
170- FULL='{{.VERSION_FULL}}'
171- MINOR='{{.VERSION_MINOR}}'
172- MAJOR='{{.VERSION_MAJOR}}'
173-
174- # Validate vX.Y.Z
175- if ! printf "%s" "$FULL" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$'; then
176- echo "❌ ERROR: VERSION '$FULL' must match vX.Y.Z" >&2
177- exit 1
178- fi
179-
180- tag_sha() { git rev-parse "refs/tags/$1" 2>/dev/null || true; }
181- remote_tag_sha() { git ls-remote --tags "$REMOTE" "refs/tags/$1" 2>/dev/null | awk '{print $1}' || true; }
182-
183- echo "ℹ️ INFO: Tags - Full: $FULL | Minor: $MINOR | Major: $MAJOR"
184-
185- # Full tag: must NOT exist on remote; fail fast if it does
186- full_remote_sha="$(remote_tag_sha "$FULL")"
187- if [ -n "$full_remote_sha" ]; then
188- echo "❌ ERROR: Full tag '$FULL' already exists on remote; aborting" >&2
189- exit 1
190- fi
191-
192- # Create full tag locally (if missing) and push
193- if git rev-parse --quiet --verify "refs/tags/$FULL" >/dev/null 2>&1; then
194- echo "ℹ️ INFO: Full tag '$FULL' exists locally but not on remote; pushing"
195- else
196- echo "ℹ️ INFO: Creating full tag '$FULL'"
197- git tag --annotate "$FULL" --message "$FULL"
198- fi
199- git push "$REMOTE" "refs/tags/$FULL"
200- echo "✅ OK: Pushed full tag '$FULL'"
201-
202- # Minor tag: create or update
203- git tag --force --annotate "$MINOR" --message "$FULL"
204- minor_local_sha="$(tag_sha "$MINOR")"
205- minor_remote_sha="$(remote_tag_sha "$MINOR")"
206- if [ -z "$minor_remote_sha" ]; then
207- git push "$REMOTE" "refs/tags/$MINOR"
208- echo "✅ OK: Created and pushed minor tag '$MINOR' -> $minor_local_sha"
209- else
210- if [ "$minor_local_sha" != "$minor_remote_sha" ]; then
211- echo "⚠️ WARN: Updating remote minor tag '$MINOR' to $minor_local_sha (was $minor_remote_sha)"
212- git push --force "$REMOTE" "refs/tags/$MINOR"
213- else
214- echo "ℹ️ INFO: Minor tag '$MINOR' already up-to-date"
215- fi
216- fi
217-
218- # Major tag: create or update
219- git tag --force --annotate "$MAJOR" --message "$FULL"
220- major_local_sha="$(tag_sha "$MAJOR")"
221- major_remote_sha="$(remote_tag_sha "$MAJOR")"
222- if [ -z "$major_remote_sha" ]; then
223- git push "$REMOTE" "refs/tags/$MAJOR"
224- echo "✅ OK: Created and pushed major tag '$MAJOR' -> $major_local_sha"
225- else
226- if [ "$major_local_sha" != "$major_remote_sha" ]; then
227- echo "⚠️ WARN: Updating remote major tag '$MAJOR' to $major_local_sha (was $major_remote_sha)"
228- git push --force "$REMOTE" "refs/tags/$MAJOR"
229- else
230- echo "ℹ️ INFO: Major tag '$MAJOR' already up-to-date"
231- fi
232- fi
79+ - task : scripts:version:tag-release
23380
23481 git:get-pr-template :
23582 desc : Get pull request template
23683 cmds :
237- - mkdir -p .tmp
238- - curl -LsS {{.PR_TEMPLATE}} -o .tmp/PULL_REQUEST_TEMPLATE.md
84+ - task : scripts:git:get-pr-template
23985
24086 git:set-config :
24187 desc : Set git user config
24288 cmds :
243- - git config user.name "github-actions[bot]"
244- - git config user.email "github-actions[bot]@users.noreply.github.com"
89+ - task : scripts:git:set-config
24590
24691 version:get :
24792 desc : Get current version
24893 cmds :
249- - echo "{{.VERSION}}"
94+ - task : scripts:version:get
0 commit comments