Skip to content

Commit 5dbf1d4

Browse files
feat: improve workflow linting and update workflow files
1 parent e00ae38 commit 5dbf1d4

8 files changed

Lines changed: 162 additions & 197 deletions

.github/workflows/auto-pull-request-create.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
name: (Auto) Pull Request Create
1+
name: (Automatic) Pull Request Create
22

33
on:
44
push:
55
branches-ignore:
66
- master
77
- main
8+
- release/**
89
- dependabot/**
910

1011
permissions:
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: (Automatic) Release Create
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
- main
8+
workflow_dispatch:
9+
inputs:
10+
release_branch:
11+
description: Release branch to publish from (e.g. release/v1.3.0)
12+
required: false
13+
default: ''
14+
type: string
15+
release_version:
16+
description: Explicit release version override (e.g. v1.3.0)
17+
required: false
18+
default: ''
19+
type: string
20+
21+
permissions:
22+
contents: write
23+
pull-requests: read
24+
25+
jobs:
26+
call:
27+
uses: devops-infra/.github/.github/workflows/reusable-auto-release-create.yml@v1
28+
with:
29+
profile: dockerized
30+
release-branch: ${{ inputs.release_branch }}
31+
release-version: ${{ inputs.release_version }}
32+
secrets: inherit
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: (Manual) Release Branch Prepare
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
type:
7+
description: Bump type
8+
required: false
9+
default: patch
10+
type: choice
11+
options:
12+
- patch
13+
- minor
14+
- major
15+
- set
16+
version:
17+
description: Explicit version when type="set" (e.g., v1.2.3)
18+
required: false
19+
default: ''
20+
build_only:
21+
description: Build and push artifacts without version bump
22+
required: false
23+
default: false
24+
type: boolean
25+
26+
permissions:
27+
contents: write
28+
packages: write
29+
pull-requests: write
30+
31+
jobs:
32+
call:
33+
uses: devops-infra/.github/.github/workflows/reusable-manual-release-branch-prepare.yml@v1
34+
with:
35+
bump-type: ${{ inputs.type }}
36+
explicit-version: ${{ inputs.version }}
37+
build-and-push-only: ${{ inputs.build_only }}
38+
profile: dockerized
39+
secrets: inherit

.gitignore

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Intellij
2-
/.idea/
2+
.idea/
33
*.iml
44

55
# Custom
@@ -10,3 +10,10 @@
1010
.envrc
1111
.env
1212
.tmp
13+
14+
# Python
15+
build/
16+
dist/
17+
*.egg-info/
18+
*.pyc
19+
__py

Taskfile.cicd.yml

Lines changed: 11 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -1,249 +1,78 @@
11
version: '3'
2-
32
silent: true
4-
53
vars:
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-
107
tasks:
118
pre-commit:
129
desc: Run all pre-commit hooks
1310
cmds:
1411
- pre-commit run --all-files
15-
1612
pre-commit:install:
1713
desc: Install pre-commit hooks
1814
cmds:
1915
- pre-commit install
20-
2116
lint:
2217
desc: Run all linters (Dockerfile, shell scripts, workflows, YAML)
2318
cmds:
2419
- task: lint:actionlint
2520
- task: lint:hadolint
2621
- task: lint:shellcheck
2722
- task: lint:yamllint
28-
2923
lint:actionlint:
3024
desc: Lint GitHub Actions workflows with actionlint
3125
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
44-
26+
- task: scripts:lint:actionlint
4527
lint:hadolint:
4628
desc: Lint Dockerfile with hadolint
4729
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
60-
30+
- task: scripts:lint:hadolint
6131
lint:shellcheck:
6232
desc: Lint shell scripts with shellcheck
6333
cmds:
6434
- task: scripts:lint:shellcheck
65-
6635
lint:yamllint:
6736
desc: Lint YAML files with yamllint
6837
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
81-
38+
- task: scripts:lint:yamllint
8239
dependency:update:
83-
desc: Update repository dependencies not covered by dependabot
40+
desc: 'No-op: no dedicated dependency updater configured for this profile'
8441
cmds:
85-
- task: scripts:packages:update
86-
42+
- task: scripts:dependency:update
8743
version:set:
8844
desc: Validate version
8945
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
99-
46+
- task: scripts:version:set
10047
version:update:patch:
10148
desc: Increment patch version (e.g., 1.2.3 -> 1.2.4)
10249
cmds:
10350
- task version:set VERSION=v{{.MAJOR}}.{{.MINOR}}.{{.NEXT_PATCH}}
104-
10551
version:update:minor:
10652
desc: Increment minor version (e.g., 1.2.3 -> 1.3.0)
10753
cmds:
10854
- task version:set VERSION=v{{.MAJOR}}.{{.NEXT_MINOR}}.0
109-
11055
version:update:major:
11156
desc: Increment major version (e.g., 1.2.3 -> 2.0.0)
11257
cmds:
11358
- task version:set VERSION=v{{.NEXT_MAJOR}}.0.0
114-
11559
version:resolve-next:
11660
desc: Resolve next version from bump type and profile
11761
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"
161-
62+
- task: scripts:version:resolve-next
16263
version:tag-release:
16364
desc: Create set of git tags
16465
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
233-
66+
- task: scripts:version:tag-release
23467
git:get-pr-template:
23568
desc: Get pull request template
23669
cmds:
237-
- mkdir -p .tmp
238-
- curl -LsS {{.PR_TEMPLATE}} -o .tmp/PULL_REQUEST_TEMPLATE.md
239-
70+
- task: scripts:git:get-pr-template
24071
git:set-config:
24172
desc: Set git user config
24273
cmds:
243-
- git config user.name "github-actions[bot]"
244-
- git config user.email "github-actions[bot]@users.noreply.github.com"
245-
74+
- task: scripts:git:set-config
24675
version:get:
24776
desc: Get current version
24877
cmds:
249-
- echo "{{.VERSION}}"
78+
- task: scripts:version:get

Taskfile.docker.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ tasks:
4343
docker:cmds:
4444
desc: Show full docker build command
4545
cmds:
46-
- echo -e '{{.DOCKER_BUILD_START}} {{.DOCKER_BUILD_FINISH}}' | {{.SED}} 's/--/ \\\n --/g'
46+
- echo -e '{{.DOCKER_BUILD_START}} {{.DOCKER_BUILD_FINISH}}' | {{.SED}} 's/--/ \\\n+ --/g'
4747

4848
docker:build:
4949
desc: Build Docker image
@@ -80,7 +80,6 @@ tasks:
8080
rc=$?
8181
set -e
8282
83-
# Validate that docker inspect returned a non-empty array with an Id
8483
has_local=0
8584
if [ "$rc" -eq 0 ] && [ -n "$image_inspect_out" ]; then
8685
if echo "$image_inspect_out" | jq -e 'type=="array" and (length > 0) and \

0 commit comments

Comments
 (0)