Skip to content

Commit d6feca4

Browse files
Add automated Maven release workflow with GitHub Actions (#94)
1 parent 9e87bc1 commit d6feca4

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
name: Maven Release
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
releaseVersion:
7+
description: 'Release version (e.g., 0.2.5)'
8+
required: true
9+
type: string
10+
nextVersion:
11+
description: 'Next development version (e.g., 0.2.6-SNAPSHOT)'
12+
required: true
13+
type: string
14+
15+
# Only allow maintainers and admins to trigger this workflow
16+
# Configure in Settings → Actions → General → Workflow permissions
17+
18+
jobs:
19+
release:
20+
runs-on: ubuntu-latest
21+
environment: production # Requires approval from designated reviewers
22+
permissions:
23+
contents: write
24+
packages: write
25+
26+
steps:
27+
- name: Checkout code
28+
uses: actions/checkout@v4
29+
with:
30+
fetch-depth: 0
31+
token: ${{ secrets.GITHUB_TOKEN }}
32+
33+
- name: Set up JDK 11
34+
uses: actions/setup-java@v4
35+
with:
36+
java-version: '11'
37+
distribution: 'temurin'
38+
cache: 'maven'
39+
server-id: central-mj
40+
server-username: MAVEN_USERNAME
41+
server-password: MAVEN_PASSWORD
42+
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
43+
gpg-passphrase: MAVEN_GPG_PASSPHRASE
44+
45+
- name: Configure Git
46+
run: |
47+
git config user.name "github-actions[bot]"
48+
git config user.email "github-actions[bot]@users.noreply.github.com"
49+
50+
- name: Update version to release version
51+
run: |
52+
mvn versions:set -DnewVersion=${{ inputs.releaseVersion }} -DgenerateBackupPoms=false
53+
git add .
54+
git commit -m "chore: release version ${{ inputs.releaseVersion }}"
55+
56+
- name: Build and test
57+
run: mvn clean verify -Dmaven.test.failure.ignore=false
58+
59+
- name: Deploy to Maven Central
60+
env:
61+
MAVEN_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
62+
MAVEN_PASSWORD: ${{ secrets.SONATYPE_TOKEN }}
63+
MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
64+
run: mvn deploy -Prelease -DskipTests
65+
66+
- name: Create Git tag
67+
run: |
68+
git tag -a "v${{ inputs.releaseVersion }}" -m "Release version ${{ inputs.releaseVersion }}"
69+
git push origin "v${{ inputs.releaseVersion }}"
70+
71+
- name: Generate changelog
72+
id: changelog
73+
run: |
74+
# Get the previous tag
75+
PREVIOUS_TAG=$(git describe --abbrev=0 --tags HEAD^ 2>/dev/null || echo "")
76+
77+
if [ -z "$PREVIOUS_TAG" ]; then
78+
CHANGELOG=$(git log --pretty=format:"* %s (%h)" --no-merges)
79+
else
80+
CHANGELOG=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"* %s (%h)" --no-merges)
81+
fi
82+
83+
# Save changelog to file for multiline output
84+
echo "$CHANGELOG" > changelog.txt
85+
echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT
86+
87+
- name: Create GitHub Release
88+
uses: softprops/action-gh-release@v2
89+
with:
90+
tag_name: v${{ inputs.releaseVersion }}
91+
name: Release ${{ inputs.releaseVersion }}
92+
body_path: changelog.txt
93+
draft: false
94+
prerelease: false
95+
generate_release_notes: true
96+
env:
97+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
98+
99+
- name: Update to next development version
100+
run: |
101+
mvn versions:set -DnewVersion=${{ inputs.nextVersion }} -DgenerateBackupPoms=false
102+
git add .
103+
git commit -m "chore: prepare next development iteration ${{ inputs.nextVersion }}"
104+
git push origin main

0 commit comments

Comments
 (0)