Skip to content

Commit a6a3bcd

Browse files
authored
feat: auto release snapshot versions now (#519)
1 parent ab2403e commit a6a3bcd

5 files changed

Lines changed: 336 additions & 23 deletions

File tree

.github/workflows/maven-ci.yml

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@ jobs:
2222
uses: actions/setup-java@v1
2323
with:
2424
java-version: 1.8
25-
server-id: ossrh
26-
server-username: OSSRH_JIRA_USERNAME
27-
server-password: OSSRH_JIRA_PASSWORD
28-
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
29-
gpg-passphrase: GPG_PASSPHRASE
3025

3126
- name: Build with Maven
3227
run: mvn clean test cobertura:cobertura
@@ -35,19 +30,3 @@ jobs:
3530
uses: codecov/codecov-action@v1
3631
with:
3732
token: ${{ secrets.CODECOV_TOKEN }}
38-
39-
- name: Set up Node.js
40-
uses: actions/setup-node@v2
41-
with:
42-
node-version: 20
43-
44-
- name: Semantic Release
45-
run: |
46-
npm install -g @conveyal/maven-semantic-release semantic-release
47-
semantic-release --prepare @conveyal/maven-semantic-release --publish @semantic-release/github,@conveyal/maven-semantic-release --verify-conditions @semantic-release/github,@conveyal/maven-semantic-release
48-
env:
49-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
50-
GPG_KEY_NAME: ${{ secrets.GPG_KEY_NAME }}
51-
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
52-
OSSRH_JIRA_USERNAME: ${{ secrets.OSSRH_JIRA_USERNAME }}
53-
OSSRH_JIRA_PASSWORD: ${{ secrets.OSSRH_JIRA_PASSWORD }}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: Publish Maven Snapshot
2+
3+
on:
4+
workflow_run:
5+
workflows:
6+
- build
7+
types:
8+
- completed
9+
branches:
10+
- master
11+
workflow_dispatch:
12+
13+
permissions:
14+
contents: read
15+
16+
jobs:
17+
publish-maven-snapshot:
18+
if: ${{ github.repository == 'apache/casbin-jcasbin' && (github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success') }}
19+
runs-on: ubuntu-latest
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
with:
24+
fetch-depth: 0
25+
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
26+
27+
- name: Set up JDK 1.8
28+
uses: actions/setup-java@v4
29+
with:
30+
distribution: temurin
31+
java-version: 8
32+
server-id: ossrh
33+
server-username: OSSRH_JIRA_USERNAME
34+
server-password: OSSRH_JIRA_PASSWORD
35+
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
36+
gpg-passphrase: GPG_PASSPHRASE
37+
38+
- name: Compute Maven snapshot version
39+
id: snapshot
40+
run: |
41+
LATEST_RELEASE_TAG="$(
42+
git tag --list 'v*' |
43+
grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' |
44+
sort -V |
45+
tail -n 1
46+
)"
47+
48+
if [ -z "${LATEST_RELEASE_TAG}" ]; then
49+
SNAPSHOT_VERSION="0.1.0-SNAPSHOT"
50+
else
51+
RELEASE_VERSION="${LATEST_RELEASE_TAG#v}"
52+
MAJOR="${RELEASE_VERSION%%.*}"
53+
REST="${RELEASE_VERSION#*.}"
54+
MINOR="${REST%%.*}"
55+
NEXT_MINOR="$((MINOR + 1))"
56+
SNAPSHOT_VERSION="${MAJOR}.${NEXT_MINOR}.0-SNAPSHOT"
57+
fi
58+
59+
echo "version=${SNAPSHOT_VERSION}" >> "${GITHUB_OUTPUT}"
60+
echo "Computed Maven snapshot version: ${SNAPSHOT_VERSION}"
61+
62+
- name: Publish Maven snapshot
63+
run: |
64+
mvn -B org.codehaus.mojo:versions-maven-plugin:2.16.2:set -DnewVersion="${{ steps.snapshot.outputs.version }}" -DgenerateBackupPoms=false
65+
mvn -B deploy -DskipTests
66+
env:
67+
GPG_KEY_NAME: ${{ secrets.GPG_KEY_NAME }}
68+
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
69+
OSSRH_JIRA_USERNAME: ${{ secrets.OSSRH_JIRA_USERNAME }}
70+
OSSRH_JIRA_PASSWORD: ${{ secrets.OSSRH_JIRA_PASSWORD }}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
name: Build Source Release Draft
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
build-source-release-draft:
13+
if: ${{ github.repository == 'apache/casbin-jcasbin' && !contains(github.ref_name, '-') }}
14+
runs-on: ubuntu-latest
15+
steps:
16+
- name: Checkout
17+
uses: actions/checkout@v4
18+
with:
19+
fetch-depth: 0
20+
21+
- name: Compute release metadata
22+
id: release
23+
run: |
24+
TAG_NAME="${GITHUB_REF_NAME}"
25+
if ! [[ "${TAG_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
26+
echo "Unsupported release tag: ${TAG_NAME}" >&2
27+
exit 1
28+
fi
29+
30+
VERSION="${TAG_NAME#v}"
31+
BASENAME="jcasbin-${VERSION}-src"
32+
PREVIOUS_TAG="$(
33+
git tag --list 'v*' |
34+
grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' |
35+
sort -V |
36+
awk -v current="${TAG_NAME}" '
37+
$0 == current {
38+
print previous
39+
exit
40+
}
41+
{
42+
previous = $0
43+
}
44+
'
45+
)"
46+
47+
echo "tag=${TAG_NAME}" >> "${GITHUB_OUTPUT}"
48+
echo "version=${VERSION}" >> "${GITHUB_OUTPUT}"
49+
echo "basename=${BASENAME}" >> "${GITHUB_OUTPUT}"
50+
echo "previous_tag=${PREVIOUS_TAG}" >> "${GITHUB_OUTPUT}"
51+
52+
- name: Generate release notes
53+
run: |
54+
CURRENT_TAG="${{ steps.release.outputs.tag }}"
55+
CURRENT_VERSION="${{ steps.release.outputs.version }}"
56+
PREVIOUS_TAG="${{ steps.release.outputs.previous_tag }}"
57+
RELEASE_DATE="$(date -u +%F)"
58+
RANGE="${CURRENT_TAG}"
59+
60+
if [ -n "${PREVIOUS_TAG}" ]; then
61+
RANGE="${PREVIOUS_TAG}..${CURRENT_TAG}"
62+
fi
63+
64+
FEATURES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(feat)(\(.+\))?: ' || true)"
65+
FIXES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(fix)(\(.+\))?: ' || true)"
66+
DOCS="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(docs?|doc)(\(.+\))?: ' || true)"
67+
68+
{
69+
if [ -n "${PREVIOUS_TAG}" ]; then
70+
echo "# [${CURRENT_VERSION}](https://github.com/${GITHUB_REPOSITORY}/compare/${PREVIOUS_TAG}...${CURRENT_TAG}) (${RELEASE_DATE})"
71+
else
72+
echo "# ${CURRENT_VERSION} (${RELEASE_DATE})"
73+
fi
74+
echo
75+
echo "This GitHub release is a draft helper for packaging and release notes."
76+
echo
77+
if [ -n "${PREVIOUS_TAG}" ]; then
78+
echo "Changes since ${PREVIOUS_TAG}."
79+
fi
80+
echo
81+
82+
if [ -n "${FEATURES}" ]; then
83+
echo "## Features"
84+
echo
85+
printf '%s\n' "${FEATURES}" | sed 's/^/- /'
86+
echo
87+
fi
88+
89+
if [ -n "${FIXES}" ]; then
90+
echo "## Fixes"
91+
echo
92+
printf '%s\n' "${FIXES}" | sed 's/^/- /'
93+
echo
94+
fi
95+
96+
if [ -n "${DOCS}" ]; then
97+
echo "## Docs"
98+
echo
99+
printf '%s\n' "${DOCS}" | sed 's/^/- /'
100+
echo
101+
fi
102+
103+
if [ -z "${FEATURES}${FIXES}${DOCS}" ]; then
104+
echo "## Notes"
105+
echo
106+
echo "- No feat/fix/doc commits were found in this release range."
107+
fi
108+
} > RELEASE_NOTES.md
109+
110+
- name: Create source archives
111+
run: |
112+
mkdir -p dist
113+
git archive --format=tar.gz --prefix="${{ steps.release.outputs.basename }}/" -o "dist/${{ steps.release.outputs.basename }}.tar.gz" "${{ steps.release.outputs.tag }}"
114+
git archive --format=zip --prefix="${{ steps.release.outputs.basename }}/" -o "dist/${{ steps.release.outputs.basename }}.zip" "${{ steps.release.outputs.tag }}"
115+
116+
- name: Create draft GitHub release
117+
uses: softprops/action-gh-release@v2
118+
with:
119+
tag_name: ${{ steps.release.outputs.tag }}
120+
name: JCasbin ${{ steps.release.outputs.tag }}
121+
body_path: RELEASE_NOTES.md
122+
draft: true
123+
files: |
124+
dist/${{ steps.release.outputs.basename }}.tar.gz
125+
dist/${{ steps.release.outputs.basename }}.zip
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
name: Build Source Snapshot
2+
3+
on:
4+
workflow_run:
5+
workflows:
6+
- build
7+
types:
8+
- completed
9+
branches:
10+
- master
11+
workflow_dispatch:
12+
13+
permissions:
14+
contents: write
15+
16+
jobs:
17+
build-source-snapshot:
18+
if: ${{ github.repository == 'apache/casbin-jcasbin' && (github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success') }}
19+
runs-on: ubuntu-latest
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
with:
24+
fetch-depth: 0
25+
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
26+
27+
- name: Compute snapshot metadata
28+
id: snapshot
29+
run: |
30+
LATEST_RELEASE_TAG="$(
31+
git tag --list 'v*' |
32+
grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' |
33+
sort -V |
34+
tail -n 1
35+
)"
36+
37+
if [ -z "${LATEST_RELEASE_TAG}" ]; then
38+
BASE_VERSION="0.1.0"
39+
else
40+
RELEASE_VERSION="${LATEST_RELEASE_TAG#v}"
41+
MAJOR="${RELEASE_VERSION%%.*}"
42+
REST="${RELEASE_VERSION#*.}"
43+
MINOR="${REST%%.*}"
44+
NEXT_MINOR="$((MINOR + 1))"
45+
BASE_VERSION="${MAJOR}.${NEXT_MINOR}.0"
46+
fi
47+
48+
ESCAPED_BASE_VERSION="${BASE_VERSION//./\\.}"
49+
LAST_SNAPSHOT_NUMBER="$(
50+
git tag --list "v${BASE_VERSION}-snapshot.*" |
51+
sed -nE "s/^v${ESCAPED_BASE_VERSION}-snapshot\\.([0-9]+)$/\\1/p" |
52+
sort -n |
53+
tail -n 1
54+
)"
55+
LAST_SNAPSHOT_NUMBER="${LAST_SNAPSHOT_NUMBER:-0}"
56+
NEXT_SNAPSHOT_NUMBER="$((LAST_SNAPSHOT_NUMBER + 1))"
57+
SNAPSHOT_VERSION="v${BASE_VERSION}-snapshot.${NEXT_SNAPSHOT_NUMBER}"
58+
BASENAME="jcasbin-${SNAPSHOT_VERSION#v}-src"
59+
60+
echo "latest_release_tag=${LATEST_RELEASE_TAG}" >> "${GITHUB_OUTPUT}"
61+
echo "base_version=${BASE_VERSION}" >> "${GITHUB_OUTPUT}"
62+
echo "number=${NEXT_SNAPSHOT_NUMBER}" >> "${GITHUB_OUTPUT}"
63+
echo "version=${SNAPSHOT_VERSION}" >> "${GITHUB_OUTPUT}"
64+
echo "basename=${BASENAME}" >> "${GITHUB_OUTPUT}"
65+
if [ -n "${LAST_SNAPSHOT_NUMBER}" ] && [ "${LAST_SNAPSHOT_NUMBER}" -gt 0 ]; then
66+
echo "previous_tag=v${BASE_VERSION}-snapshot.${LAST_SNAPSHOT_NUMBER}" >> "${GITHUB_OUTPUT}"
67+
else
68+
echo "previous_tag=${LATEST_RELEASE_TAG}" >> "${GITHUB_OUTPUT}"
69+
fi
70+
71+
- name: Generate snapshot release notes
72+
run: |
73+
PREVIOUS_TAG="${{ steps.snapshot.outputs.previous_tag }}"
74+
CURRENT_TAG="${{ steps.snapshot.outputs.version }}"
75+
CURRENT_VERSION="${CURRENT_TAG#v}"
76+
RELEASE_DATE="$(date -u +%F)"
77+
RANGE="HEAD"
78+
79+
if [ -n "${PREVIOUS_TAG}" ]; then
80+
RANGE="${PREVIOUS_TAG}..HEAD"
81+
fi
82+
83+
FEATURES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(feat)(\(.+\))?: ' || true)"
84+
FIXES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(fix)(\(.+\))?: ' || true)"
85+
DOCS="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(docs?|doc)(\(.+\))?: ' || true)"
86+
87+
{
88+
if [ -n "${PREVIOUS_TAG}" ]; then
89+
echo "# [${CURRENT_VERSION}](https://github.com/${GITHUB_REPOSITORY}/compare/${PREVIOUS_TAG}...${CURRENT_TAG}) (${RELEASE_DATE})"
90+
else
91+
echo "# ${CURRENT_VERSION} (${RELEASE_DATE})"
92+
fi
93+
echo
94+
if [ -n "${FEATURES}" ]; then
95+
echo "## Features"
96+
echo
97+
printf '%s\n' "${FEATURES}" | sed 's/^/- /'
98+
echo
99+
fi
100+
101+
if [ -n "${FIXES}" ]; then
102+
echo "## Fixes"
103+
echo
104+
printf '%s\n' "${FIXES}" | sed 's/^/- /'
105+
echo
106+
fi
107+
108+
if [ -n "${DOCS}" ]; then
109+
echo "## Docs"
110+
echo
111+
printf '%s\n' "${DOCS}" | sed 's/^/- /'
112+
echo
113+
fi
114+
115+
if [ -z "${FEATURES}${FIXES}${DOCS}" ]; then
116+
echo "## Notes"
117+
echo
118+
echo "- No feat/fix/doc commits were found in this snapshot range."
119+
fi
120+
} > SNAPSHOT_RELEASE_NOTES.md
121+
122+
- name: Create source archives
123+
run: |
124+
mkdir -p dist
125+
git archive --format=tar.gz --prefix="${{ steps.snapshot.outputs.basename }}/" -o "dist/${{ steps.snapshot.outputs.basename }}.tar.gz" HEAD
126+
git archive --format=zip --prefix="${{ steps.snapshot.outputs.basename }}/" -o "dist/${{ steps.snapshot.outputs.basename }}.zip" HEAD
127+
128+
- name: Create snapshot GitHub release
129+
uses: softprops/action-gh-release@v2
130+
with:
131+
tag_name: ${{ steps.snapshot.outputs.version }}
132+
target_commitish: ${{ github.event.workflow_run.head_sha || github.sha }}
133+
name: ${{ steps.snapshot.outputs.version }}
134+
body_path: SNAPSHOT_RELEASE_NOTES.md
135+
draft: false
136+
prerelease: false
137+
files: |
138+
dist/${{ steps.snapshot.outputs.basename }}.tar.gz
139+
dist/${{ steps.snapshot.outputs.basename }}.zip

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<distributionManagement>
5050
<snapshotRepository>
5151
<id>ossrh</id>
52-
<url>https://central.sonatype.com</url>
52+
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
5353
</snapshotRepository>
5454
</distributionManagement>
5555

@@ -130,7 +130,7 @@
130130
<!-- Automatically close and deploy from OSSRH -->
131131
<groupId>org.sonatype.central</groupId>
132132
<artifactId>central-publishing-maven-plugin</artifactId>
133-
<version>0.6.0</version>
133+
<version>0.9.0</version>
134134
<extensions>true</extensions>
135135
<configuration>
136136
<publishingServerId>ossrh</publishingServerId>

0 commit comments

Comments
 (0)