-
Notifications
You must be signed in to change notification settings - Fork 58
Add release workflow #168
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add release workflow #168
Changes from all commits
93cec2b
4512fbf
0348fdb
d61c9ce
1abbcc6
67b1e65
382d835
3f27843
c3f9350
b6b5ab4
4645e8a
df59c9f
2fa6b3f
550a7a6
cc7f6b0
7949852
02817e1
2f28d37
1b7f9d6
d46455b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,224 @@ | ||
name: Release to Maven Central | ||
|
||
on: | ||
# Manual trigger | ||
workflow_dispatch: | ||
inputs: | ||
release_version: | ||
description: "Version to release (if empty, derive from project version)" | ||
required: false | ||
# Automatic trigger on pushing a version tag (e.g., "v1.2.3") | ||
push: | ||
tags: | ||
- "v*" | ||
|
||
jobs: | ||
# Corresponds to tests in tests.yml | ||
build-with-docker: | ||
name: Build ${{ matrix.dockcross-only }} (Dockcross) | ||
runs-on: ${{ matrix.os }} | ||
|
||
strategy: | ||
matrix: | ||
os: [ubuntu-latest] | ||
java-distribution: [adopt] | ||
java-version: [8] | ||
dockcross-only: | ||
[ | ||
"android-arm", | ||
"android-arm64", | ||
"linux-arm64", | ||
"linux-armv5", | ||
"linux-armv7", | ||
"linux-s390x", | ||
"linux-ppc64le", | ||
"linux-x64", | ||
"linux-x86", | ||
"windows-static-x64", | ||
"windows-static-x86", | ||
isaacbrodsky marked this conversation as resolved.
Show resolved
Hide resolved
|
||
] | ||
|
||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
submodules: recursive | ||
|
||
- uses: actions/setup-java@v2 | ||
with: | ||
distribution: "${{ matrix.java-distribution }}" | ||
java-version: "${{ matrix.java-version }}" | ||
|
||
- uses: gradle/actions/setup-gradle@v3 | ||
with: | ||
gradle-version: wrapper | ||
|
||
- uses: actions/cache@v4 | ||
id: gradle-cache | ||
with: | ||
path: | | ||
~/.gradle/caches | ||
~/.gradle/wrapper | ||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | ||
restore-keys: | | ||
${{ runner.os }}-gradle- | ||
|
||
- name: Tests | ||
run: ./gradlew clean test -Ph3SystemPrune=true "-Ph3DockcrossOnly=${{ matrix.dockcross-only }}" | ||
env: | ||
OCI_EXE: docker | ||
|
||
- uses: actions/upload-artifact@v4 | ||
name: Upload artifacts | ||
with: | ||
name: docker-built-shared-objects-${{ matrix.dockcross-only }} | ||
path: | | ||
src/main/resources/*/*.so | ||
src/main/resources/*/*.dll | ||
if-no-files-found: error | ||
|
||
# Corresponsd to tests-no-docker in tests.yml | ||
build: | ||
name: Build ${{ matrix.os }} | ||
runs-on: ${{ matrix.os }} | ||
|
||
strategy: | ||
matrix: | ||
os: [macos-latest] | ||
isaacbrodsky marked this conversation as resolved.
Show resolved
Hide resolved
|
||
java-distribution: [adopt] | ||
java-version: [8] | ||
|
||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
submodules: recursive | ||
|
||
- uses: actions/setup-java@v2 | ||
with: | ||
distribution: "${{ matrix.java-distribution }}" | ||
java-version: "${{ matrix.java-version }}" | ||
|
||
- uses: gradle/actions/setup-gradle@v3 | ||
with: | ||
gradle-version: wrapper | ||
|
||
- uses: actions/cache@v4 | ||
id: gradle-cache | ||
with: | ||
path: | | ||
~/.gradle/caches | ||
~/.gradle/wrapper | ||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | ||
restore-keys: | | ||
${{ runner.os }}-gradle- | ||
|
||
- name: Tests | ||
run: ./gradlew clean test | ||
|
||
- uses: actions/upload-artifact@v4 | ||
name: Upload Mac OS Artifacts | ||
with: | ||
name: macos-built-shared-objects | ||
path: src/main/resources/*/*.dylib | ||
if-no-files-found: error | ||
|
||
release: | ||
runs-on: ubuntu-latest | ||
permissions: | ||
contents: write # allow pushing commits/tags | ||
|
||
needs: | ||
- build-with-docker | ||
- build | ||
|
||
steps: | ||
- name: Check out code | ||
uses: actions/checkout@v3 | ||
|
||
- name: Set up JDK | ||
uses: actions/setup-java@v3 | ||
with: | ||
distribution: "temurin" | ||
java-version: "21" | ||
|
||
- name: Determine release version | ||
id: vars | ||
run: | | ||
# Derive the release version (drop "-SNAPSHOT") from Gradle project or input | ||
VERSION_INPUT="${{ github.event.inputs.release_version || '' }}" | ||
if [ -n "$VERSION_INPUT" ]; then | ||
RELEASE_VERSION="$VERSION_INPUT" | ||
else | ||
RELEASE_VERSION=$(grep -E 'version=' gradle.properties | sed -E 's/version=//') | ||
fi | ||
echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV | ||
|
||
- name: Remove -SNAPSHOT suffix (prepare release version) | ||
if: ${{ github.event_name == 'workflow_dispatch' }} | ||
run: | | ||
sed -i -E "s/${RELEASE_VERSION}-SNAPSHOT/$RELEASE_VERSION/" gradle.properties || true | ||
git config user.name "github-actions" | ||
git config user.email "[email protected]" | ||
git commit -am "chore: release $RELEASE_VERSION [skip ci]" | ||
|
||
- name: Create Git tag for release | ||
if: ${{ github.event_name == 'workflow_dispatch' }} | ||
run: | | ||
git tag -a "v${RELEASE_VERSION}" -m "Release $RELEASE_VERSION" | ||
git push origin HEAD:master --follow-tags | ||
|
||
- name: Download Docker binaries | ||
uses: actions/[email protected] | ||
with: | ||
pattern: docker-built-shared-objects-* | ||
merge-multiple: true | ||
path: src/main/resources/ | ||
|
||
- name: Download Mac binaries | ||
uses: actions/[email protected] | ||
with: | ||
name: macos-built-shared-objects | ||
path: src/main/resources/ | ||
|
||
- name: Download and test | ||
run: | | ||
./gradlew clean test assemble -Ph3GithubArtifactsUse=true -Ph3GithubArtifactsByRun=true | ||
|
||
- name: List files in jars | ||
run: | | ||
ls -lh build/libs | ||
for f in build/libs/*.jar; do | ||
echo "File: $f" | ||
unzip -l "$f" | ||
done | ||
|
||
- name: Publish to Sonatype OSSRH (Maven Central) | ||
env: | ||
SIGNING_KEY: ${{ secrets.SIGNING_KEY }} | ||
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} | ||
SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} | ||
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} | ||
OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} | ||
OSSRH_STAGING_PROFILE_ID: ${{ secrets.OSSRH_STAGING_PROFILE_ID }} | ||
run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository -Ph3GithubArtifactsUse=true -Ph3GithubArtifactsByRun=true | ||
|
||
- name: Create GitHub Release (with changelog notes) | ||
# This uses an action to create a release on GitHub | ||
uses: softprops/action-gh-release@v1 | ||
with: | ||
tag_name: "v${{ env.RELEASE_VERSION }}" | ||
name: "${{ env.RELEASE_VERSION }}" | ||
body_path: CHANGELOG.md # assumes changelog contains latest release notes at top | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will this include the entire changelog per release? Or just the latest release? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Based on the repo https://github.com/softprops/action-gh-release I think it is set up to take the first markdown section, the generated release should be very easy to manually modify after the fact if the detected changelog is not right. |
||
env: | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
|
||
- name: Bump to next snapshot version | ||
if: ${{ github.event_name != 'workflow_dispatch' }} | ||
run: | | ||
# Bump minor version (for example) and append -SNAPSHOT for continued development | ||
NEXT_VERSION=$(echo $RELEASE_VERSION | awk -F. -v OFS="." '{$NF += 1; print $0}') # increment last segment | ||
NEXT_VERSION="$NEXT_VERSION-SNAPSHOT" | ||
sed -i -E "s/$RELEASE_VERSION/$NEXT_VERSION/" gradle.properties || true | ||
git config user.name "github-actions" | ||
git config user.email "[email protected]" | ||
git commit -am "chore: start next development cycle $NEXT_VERSION [skip ci]" | ||
git push origin HEAD:master |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,10 @@ | |
|
||
The H3-Java library is published to Maven Central via OSSRH. | ||
|
||
Before releasing, make sure the version of the project is in the form `1.2.3-SNAPSHOT` where `1.2.3` is the version you wish to release. The release is triggered via GitHub Actions, when a tag of the form `v1.2.3` is pushed. (Workflow dispatch can be used but is not tested.) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this be: when a tag of the form `1.2.3-SNAPSHOT` is pushed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, the tag should be the release version with |
||
|
||
## Old instructions for manual releasing | ||
|
||
You must be a member of the `com.uber` group to release the library via OSSRH. You must have a [signing key](http://central.sonatype.org/pages/working-with-pgp-signatures.html) setup, and you must have your OSSRH username and password in the appropriate [Maven settings file](http://central.sonatype.org/pages/apache-maven.html). | ||
|
||
Release builds pull artifacts from Github Actions. This is needed so that the deployed artifact contains all supported operating system/architecture combinations. (In particular, Mac OS artifacts must be built natively.) In order to release, there must be a completed build of the Git commit to release on Github. The build must be less than 30 days old, as artifacts are only kept for that time. | ||
|
@@ -13,14 +17,14 @@ Release builds pull artifacts from Github Actions. This is needed so that the de | |
5. If this looks good, close and release the build in [Sonatype Nexus Manager](https://oss.sonatype.org/). | ||
6. Update `CHANGELOG.md` to have an Unreleased section, and commit. The release is now done and development can resume from this point. | ||
|
||
## Troubleshooting | ||
### Troubleshooting | ||
|
||
### Dependencies for `pull-from-github.sh` | ||
#### Dependencies for `pull-from-github.sh` | ||
|
||
* You should install the [Github CLI](https://cli.github.com) and authenticate with it first. You may need to use a personal access token (classic) with workflows scope. | ||
* `jq` | ||
|
||
### gpg: signing failed: Inappropriate ioctl for device | ||
#### gpg: signing failed: Inappropriate ioctl for device | ||
|
||
Per [StackOverflow](https://stackoverflow.com/questions/57591432/gpg-signing-failed-inappropriate-ioctl-for-device-on-macos-with-maven), run the following before `mvn release:perform`: | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
8 is EOL, right? Should we move this higher?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've seen different things about Java 8. It seems Oracle has very long term support for it, but it does seem practically EOL. I'm not sure how much the open source ecosystem is still supporting it as I haven't done as much Java work recently.
My plan was to leave the baseline at Java 8 for now (since that is what we previously built) and then in a follow up PR re-enable some code quality tools and bump the baseline to a newer LTS release.