-
Notifications
You must be signed in to change notification settings - Fork 0
171 lines (144 loc) · 5.67 KB
/
Copy pathweekly-release.yml
File metadata and controls
171 lines (144 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
name: Weekly Release
on:
schedule:
# Run every Sunday at 2 AM UTC
- cron: '0 2 * * 0'
workflow_dispatch:
inputs:
force_release:
description: 'Force release even if no changes since last release'
required: false
type: boolean
default: false
permissions:
contents: write
concurrency:
group: release
cancel-in-progress: false
jobs:
weekly-release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v7
with:
go-version-file: 'go.mod'
- name: Lint library
uses: golangci/golangci-lint-action@v9
with:
version: latest
- name: Lint CLI
uses: golangci/golangci-lint-action@v9
with:
version: latest
working-directory: cli
- name: Check for changes since last release
id: check-changes
run: |
# Get the latest release tag
latest_tag=$(git tag --sort=-version:refname | head -n 1)
if [[ -z "$latest_tag" ]]; then
echo "No previous releases found, proceeding with initial release"
echo "has_changes=true" >> $GITHUB_OUTPUT
echo "latest_tag=" >> $GITHUB_OUTPUT
else
echo "Latest release tag: $latest_tag"
echo "latest_tag=$latest_tag" >> $GITHUB_OUTPUT
# Check if there are commits since the last tag
commits_since_tag=$(git rev-list --count $latest_tag..HEAD)
if [ "$commits_since_tag" -gt 0 ]; then
echo "Found $commits_since_tag commits since last release"
echo "has_changes=true" >> $GITHUB_OUTPUT
# Show what changed
echo "Changes since $latest_tag:"
git log --oneline $latest_tag..HEAD
else
echo "No commits since last release"
echo "has_changes=false" >> $GITHUB_OUTPUT
fi
fi
- name: Check force release flag
id: should-release
run: |
has_changes="${{ steps.check-changes.outputs.has_changes }}"
force_release="${{ github.event.inputs.force_release }}"
if [ "$has_changes" == "true" ] || [ "$force_release" == "true" ]; then
echo "should_release=true" >> $GITHUB_OUTPUT
if [ "$force_release" == "true" ]; then
echo "🚀 Force release requested"
else
echo "📦 Changes detected, proceeding with release"
fi
else
echo "should_release=false" >> $GITHUB_OUTPUT
echo "⏭️ No changes since last release, skipping"
fi
- name: Calculate next version
if: steps.should-release.outputs.should_release == 'true'
id: get-version
run: |
latest_tag="${{ steps.check-changes.outputs.latest_tag }}"
if [[ -z "$latest_tag" ]]; then
next="v0.1.0"
echo "🎉 Initial release version: $next"
else
# Extract version numbers (ignore any prerelease suffix, e.g. -rc.1)
version=${latest_tag#v}
version=${version%%-*}
IFS='.' read -r major minor patch <<< "$version"
# Increment minor version for weekly releases
next="v$major.$((minor+1)).0"
echo "📈 Version bump: $latest_tag → $next"
fi
echo "next_tag=$next" >> $GITHUB_OUTPUT
echo "Previous tag: $latest_tag"
echo "Next tag: $next"
- name: Create and push tag
if: steps.should-release.outputs.should_release == 'true'
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
next_tag="${{ steps.get-version.outputs.next_tag }}"
echo "🏷️ Creating tag: $next_tag"
git tag "$next_tag"
git push origin "$next_tag"
echo "✅ Tag created and pushed: $next_tag"
- name: Checkout the tagged commit
if: steps.should-release.outputs.should_release == 'true'
uses: actions/checkout@v7
with:
ref: ${{ steps.get-version.outputs.next_tag }}
fetch-depth: 0
- name: Run GoReleaser
if: steps.should-release.outputs.should_release == 'true'
uses: goreleaser/goreleaser-action@v7
with:
distribution: goreleaser
version: '~> v2'
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Log release completion
if: steps.should-release.outputs.should_release == 'true'
run: |
next_tag="${{ steps.get-version.outputs.next_tag }}"
echo "🎉 Weekly release completed successfully!"
echo ""
echo "📦 Version: $next_tag"
echo "🔗 Release: https://github.com/myerscode/aws-meta/releases/tag/$next_tag"
echo "📚 Documentation: https://pkg.go.dev/github.com/myerscode/aws-meta@$next_tag"
echo ""
echo "🚀 Go package is now available:"
echo " go get github.com/myerscode/aws-meta@$next_tag"
- name: Log no release
if: steps.should-release.outputs.should_release == 'false'
run: |
echo "⏭️ No weekly release created"
echo "📊 No changes detected since last release"
echo "🔄 Next check will be in one week"
echo ""
echo "💡 To force a release, run this workflow manually with force_release=true"