Skip to content

Commit fad91c2

Browse files
authored
Add manual date-based release workflow (#112)
1 parent ef61138 commit fad91c2

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

.github/workflows/release.yml

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
name: Release
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
force_release:
7+
description: 'Force release even if no meaningful changes detected'
8+
type: boolean
9+
required: false
10+
default: false
11+
12+
permissions:
13+
contents: write
14+
15+
jobs:
16+
release:
17+
runs-on: ubuntu-latest
18+
steps:
19+
- name: Checkout
20+
uses: actions/checkout@v4
21+
with:
22+
fetch-depth: 0
23+
24+
- name: Check for Changes
25+
id: check
26+
run: |
27+
FORCE="${{ inputs.force_release }}"
28+
echo "Force Release: $FORCE"
29+
30+
if [ "$FORCE" == "true" ]; then
31+
echo "Release forced by user."
32+
echo "skip=false" >> $GITHUB_OUTPUT
33+
exit 0
34+
fi
35+
36+
git fetch --tags --force
37+
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
38+
39+
if [ -z "$LAST_TAG" ]; then
40+
echo "No tags found. Assuming first release."
41+
echo "skip=false" >> $GITHUB_OUTPUT
42+
else
43+
echo "Last tag: $LAST_TAG"
44+
CHANGED=$(git diff --name-only "$LAST_TAG" HEAD)
45+
46+
if [ -z "$CHANGED" ]; then
47+
echo "No file changes found."
48+
echo "skip=true" >> $GITHUB_OUTPUT
49+
else
50+
echo "Changed files:"
51+
echo "$CHANGED"
52+
53+
# Check for meaningful changes
54+
# For Templates, we care about apps/ and sensitive config files.
55+
# We exclude .github, README, linters
56+
if echo "$CHANGED" | grep -Eqv '^(\.github/|\.gitignore|\.editorconfig|README\.md|LICENSE|\.markdownlint\.yml|\.yamllint\.yml)'; then
57+
echo "Meaningful changes detected."
58+
echo "skip=false" >> $GITHUB_OUTPUT
59+
else
60+
echo "No meaningful changes detected."
61+
echo "skip=true" >> $GITHUB_OUTPUT
62+
fi
63+
fi
64+
fi
65+
66+
- name: Generate Version Tag
67+
if: steps.check.outputs.skip == 'false'
68+
id: tag
69+
run: |
70+
# Versioning Scheme: v1.YYYYMMDD.N[-Suffix]
71+
# Major: 1
72+
# Minor: YYYYMMDD
73+
# Patch: N (Daily build counter)
74+
75+
# Example: v1.20260121.1
76+
77+
TODAY_INT=$(date -u +'%Y%m%d')
78+
PREFIX="v1.${TODAY_INT}"
79+
80+
git fetch --tags --force
81+
82+
if [[ "${{ github.ref_name }}" == "main" ]]; then
83+
SUFFIX=""
84+
# Match v1.YYYYMMDD.N
85+
REGEX="^${PREFIX}\.[0-9]+$"
86+
else
87+
SAFE_BRANCH=$(echo "${{ github.ref_name }}" | sed 's/[^a-zA-Z0-9]/-/g')
88+
SUFFIX="-${SAFE_BRANCH}"
89+
# Match v1.YYYYMMDD.N-branch
90+
REGEX="^${PREFIX}\.[0-9]+${SUFFIX}$"
91+
fi
92+
93+
echo "Scope: ${{ github.ref_name }}"
94+
echo "Suffix: '$SUFFIX'"
95+
echo "Regex: '$REGEX'"
96+
97+
MAX_N="-1"
98+
99+
# Get all tags for this "Minor" version (v1.YYYYMMDD.*)
100+
TAGS=$(git tag -l "${PREFIX}*")
101+
102+
for tag in $TAGS; do
103+
if [[ "$tag" =~ $REGEX ]]; then
104+
# Strip suffix: v1.YYYYMMDD.N
105+
base="${tag%$SUFFIX}"
106+
# Extract Patch (N): Remove v1.YYYYMMDD.
107+
n="${base#$PREFIX.}"
108+
109+
# Ensure n is numeric
110+
if [[ "$n" =~ ^[0-9]+$ ]]; then
111+
if (( n > MAX_N )); then
112+
MAX_N=$n
113+
fi
114+
fi
115+
fi
116+
done
117+
118+
if [ "$MAX_N" == "-1" ]; then
119+
NEXT_N=1
120+
else
121+
NEXT_N=$((MAX_N + 1))
122+
fi
123+
124+
FINAL_VER="${PREFIX}.${NEXT_N}${SUFFIX}"
125+
126+
echo "Generated Version: $FINAL_VER"
127+
echo "version=$FINAL_VER" >> $GITHUB_OUTPUT
128+
129+
- name: Create Release
130+
if: steps.check.outputs.skip == 'false'
131+
env:
132+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
133+
run: |
134+
TAG_NAME="${{ steps.tag.outputs.version }}"
135+
echo "Creating release for $TAG_NAME"
136+
137+
# Create tag and release
138+
gh release create "$TAG_NAME" \
139+
--title "Release $TAG_NAME" \
140+
--generate-notes \
141+
--target "${{ github.ref_name }}"

0 commit comments

Comments
 (0)