1+ name : Nightly Release
2+
3+ on :
4+ schedule :
5+ # Run at midnight UTC every day
6+ - cron : ' 0 0 * * *'
7+ # Allow manual triggering
8+ workflow_dispatch :
9+
10+ jobs :
11+ generate :
12+ runs-on : ubuntu-latest
13+ outputs :
14+ changes_made : ${{ steps.commit_changes.outputs.changes_made }}
15+ steps :
16+ - name : Checkout
17+ uses : actions/checkout@v4
18+ with :
19+ fetch-depth : 0
20+
21+ - name : Set up Go
22+ uses : actions/setup-go@v4
23+ with :
24+ go-version : ' 1.24'
25+
26+ - name : Run generate command
27+ run : go run . generate
28+
29+ - name : Check for changes
30+ id : check_for_changes
31+ run : |
32+ if [[ -n "$(git status --porcelain)" ]]; then
33+ echo "Changes detected after running generate command"
34+ echo "CHANGES_DETECTED=true" >> $GITHUB_ENV
35+ else
36+ echo "No changes detected after running generate command"
37+ echo "CHANGES_DETECTED=false" >> $GITHUB_ENV
38+ fi
39+
40+ - name : Commit changes
41+ id : commit_changes
42+ if : env.CHANGES_DETECTED == 'true'
43+ run : |
44+ git config --local user.email "action@github.com"
45+ git config --local user.name "GitHub Action"
46+ git add .
47+ git commit -m "Nightly update: $(date +'%Y-%m-%d')"
48+ git push
49+ echo "changes_made=true" >> $GITHUB_OUTPUT
50+
51+ - name : No changes to commit
52+ if : env.CHANGES_DETECTED == 'false'
53+ run : |
54+ echo "No changes to commit"
55+ echo "changes_made=false" >> $GITHUB_OUTPUT
56+
57+ check-for-changes :
58+ needs : generate
59+ runs-on : ubuntu-latest
60+ outputs :
61+ has_changes : ${{ steps.check_changes.outputs.has_changes }}
62+ new_tag : ${{ steps.create_tag.outputs.new_tag }}
63+ steps :
64+ - name : Checkout
65+ uses : actions/checkout@v4
66+ with :
67+ fetch-depth : 0
68+
69+ - name : Get latest release
70+ id : latest_release
71+ run : |
72+ LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
73+ echo "latest_tag=${LATEST_TAG}" >> $GITHUB_OUTPUT
74+ echo "Latest tag: ${LATEST_TAG}"
75+ continue-on-error : true
76+
77+ - name : Check for changes since last release
78+ id : check_changes
79+ run : |
80+ LATEST_TAG="${{ steps.latest_release.outputs.latest_tag }}"
81+
82+ # Check if the tag exists in the repository
83+ if [ "$LATEST_TAG" = "v0.0.0" ] || ! git rev-parse --verify "$LATEST_TAG" &>/dev/null; then
84+ echo "No valid previous tag found, creating first release"
85+ echo "has_changes=true" >> $GITHUB_OUTPUT
86+ else
87+ CHANGES=$(git log --oneline ${LATEST_TAG}..HEAD)
88+ if [ -n "$CHANGES" ]; then
89+ echo "Changes found since last release"
90+ echo "has_changes=true" >> $GITHUB_OUTPUT
91+ else
92+ echo "No changes since last release"
93+ echo "has_changes=false" >> $GITHUB_OUTPUT
94+ fi
95+ fi
96+
97+ - name : Create new tag
98+ id : create_tag
99+ if : steps.check_changes.outputs.has_changes == 'true'
100+ run : |
101+ LATEST_TAG="${{ steps.latest_release.outputs.latest_tag }}"
102+ if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" == "v0.0.0" ]; then
103+ NEW_TAG="v0.1.0"
104+ else
105+ # Extract version components
106+ MAJOR=$(echo $LATEST_TAG | sed 's/v\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/')
107+ MINOR=$(echo $LATEST_TAG | sed 's/v\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/')
108+ PATCH=$(echo $LATEST_TAG | sed 's/v\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/')
109+
110+ # Increment patch version
111+ PATCH=$((PATCH + 1))
112+ NEW_TAG="v${MAJOR}.${MINOR}.${PATCH}"
113+ fi
114+
115+ echo "Creating new tag: ${NEW_TAG}"
116+ echo "new_tag=${NEW_TAG}" >> $GITHUB_OUTPUT
117+
118+ # Configure git
119+ git config --local user.email "action@github.com"
120+ git config --local user.name "GitHub Action"
121+
122+ # Create and push tag
123+ git tag $NEW_TAG
124+ git push origin $NEW_TAG
125+
126+ build :
127+ needs : check-for-changes
128+ if : needs.check-for-changes.outputs.has_changes == 'true'
129+ runs-on : ubuntu-latest
130+ steps :
131+ - name : Checkout
132+ uses : actions/checkout@v4
133+ with :
134+ fetch-depth : 0
135+
136+ - name : Set up Go
137+ uses : actions/setup-go@v4
138+ with :
139+ go-version : ' 1.24'
140+
141+ - name : Run tests
142+ run : go test -v ./pkg/...
143+
144+ - name : Build
145+ run : go build -v .
146+
147+ - name : Create Release
148+ id : create_release
149+ uses : softprops/action-gh-release@v1
150+ with :
151+ tag_name : ${{ needs.check-for-changes.outputs.new_tag }}
152+ name : Nightly Release ${{ needs.check-for-changes.outputs.new_tag }}
153+ draft : false
154+ prerelease : false
155+ token : ${{ secrets.GITHUB_TOKEN }}
156+ body : |
157+ Automated nightly release created on $(date +'%Y-%m-%d')
158+
159+ This release contains all changes since the previous release.
160+
161+ - name : Package data manifests
162+ run : |
163+ mkdir -p release/aws-meta-data
164+ cp -r pkg/data/manifests/* release/aws-meta-data/
165+ cd release
166+ zip -r aws-meta-data.zip aws-meta-data/
167+
168+ - name : Package services
169+ run : |
170+ mkdir -p release/aws-meta-services
171+ cp pkg/services/list.go release/aws-meta-services/
172+ cd release
173+ zip -r aws-meta-services.zip aws-meta-services/
174+
175+ - name : Upload Release Assets
176+ uses : softprops/action-gh-release@v1
177+ with :
178+ tag_name : ${{ needs.check-for-changes.outputs.new_tag }}
179+ files : |
180+ ./release/aws-meta-data.zip
181+ ./release/aws-meta-services.zip
182+ ./aws-meta
183+ token : ${{ secrets.GITHUB_TOKEN }}
184+
185+ publish-go-pkg :
186+ needs : build
187+ runs-on : ubuntu-latest
188+ steps :
189+ - name : Checkout
190+ uses : actions/checkout@v4
191+
192+ - name : Set up Go
193+ uses : actions/setup-go@v4
194+ with :
195+ go-version : ' 1.24'
196+
197+ - name : Publish Go packages
198+ run : |
199+ GOPROXY=proxy.golang.org go list -m github.com/myerscode/aws-meta/pkg/data@${{ needs.check-for-changes.outputs.new_tag }}
200+ GOPROXY=proxy.golang.org go list -m github.com/myerscode/aws-meta/pkg/services@${{ needs.check-for-changes.outputs.new_tag }}
201+ env :
202+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
0 commit comments