Skip to content
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

Refactor workflows and implement combined Java module release #852

Merged
merged 5 commits into from
Dec 20, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/actions/maven-release/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Release Maven module
description: |
Releases a Maven module and waits for it to appear in Sonatype.

inputs:
repodir:
description: 'Directory of repository to release'
required: false
default: '.'

runs:
using: composite
steps:
- name: Get the artifact from POM
shell: bash
working-directory: ${{ inputs.repodir }}
run: |
echo "ARTIFACT=`mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout`" >> $GITHUB_ENV

# Build and deploy to sonatype if the release does not already exist.
# Attempt to handle case of Sonatype failing to close the repository, but still succeeding
- name: Release Maven module and push to Sonatype
shell: bash
working-directory: ${{ inputs.repodir }}
run: |
goal="deploy"

if curl -f -s https://repo1.maven.org/maven2/org/eclipse/pass/$ARTIFACT/$RELEASE/ > /dev/null; then
echo "Release $RELEASE already exists"
goal="install"
fi

mvn -B -U -V -ntp -P release -DstagingProgressTimeoutMinutes=15 clean $goal | tee release.log
code=${PIPESTATUS[0]}

marker1="Remote staging repositories are being released"
marker2="Failed to execute goal org.sonatype.plugins:nexus-staging-maven-plugin"

if [ "$code" -ne "0" ]; then
if grep -q "$marker1" release.log && grep -q "$marker2" release.log; then
echo "Failed cleaning up after pushing to Sonatype, but it may have succeeded anyway."
else
exit "$code"
fi
fi

- name: Wait for Maven Central
shell: bash
run: |
echo "Waiting for $ARTIFACT $RELEASE to be released."

counter=0
until curl -f -s https://repo1.maven.org/maven2/org/eclipse/pass/$ARTIFACT/$RELEASE/ > /dev/null
do
sleep 60
echo "."
counter=$((counter+1))

if [ "$counter" -gt 30 ]; then
echo "Timed out waiting for release"
exit 1
fi
done
echo "$ARTIFACT $RELEASE has been released."
22 changes: 12 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
name: main Continuous Integration
on: [ pull_request, workflow_dispatch ]
on: [pull_request, workflow_dispatch, workflow_call]

concurrency:
group: ci-${{ github.head_ref || github.ref }}
cancel-in-progress: true

jobs:
print-workflow-description:
runs-on: ubuntu-latest
steps:
- run: echo "This is a CI build of branch ${{ github.ref }} in repository ${{ github.repository }}"
- run: echo "This job was triggered by a ${{ github.event_name }} event and is running on a ${{ runner.os }} server"

call-tests:
test:
name: Run Unit & Integration Tests
runs-on: ubuntu-latest
steps:
- name: Print description
run: |
echo "This is a CI build of branch ${{ github.ref }} in repository ${{ github.repository }}"
echo "This job was triggered by a ${{ github.event_name }} event and is running on a ${{ runner.os }} server"

- name: Checkout the repository
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 17
distribution: 'temurin'

- name: Cache Maven packages
markpatton marked this conversation as resolved.
Show resolved Hide resolved
uses: actions/cache@v2
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2

- name: Run Tests
run: mvn -V -ntp verify --file pom.xml
run: mvn -U -B -V -ntp verify
126 changes: 123 additions & 3 deletions .github/workflows/pass-java-release.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,130 @@
name: Placeholder for consolidated Java release
# Build all the Java modules by constructing a synthentic combined module.
# The main repo provides the pom for the combined module, but is kept on the side.
# The combined module is in the directory combined which contains pass-core and pass-support repos.

name: "Publish: release all Java modules"
run-name: Release all Java modules (${{ inputs.releaseversion }} -> ${{ inputs.nextversion}})

on:
workflow_dispatch:
inputs:
releaseversion:
description: 'Release version'
required: true
nextversion:
description: 'Next dev version'
required: true

jobs:
test:
release:
runs-on: ubuntu-latest
env:
RELEASE: ${{ inputs.releaseversion }}
NEXT: ${{ inputs.nextversion }}
steps:
- run: echo "Hello Moo!"
- name: Checkout main
uses: actions/checkout@v3
with:
path: main

- name: Setup Java & Maven
uses: actions/setup-java@v3
with:
java-version: 17
distribution: 'temurin'
cache: 'maven'
server-id: ossrh
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
gpg-private-key: ${{ secrets.MAVEN_GPG_KEY }}
gpg-passphrase: MAVEN_GPG_PASSPHRASE

- name: Get the artifact from the main POM
working-directory: main
run: |
echo "ARTIFACT=`mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout`" >> $GITHUB_ENV

- name: Configure git user
run: |
git config --global user.name ${{ github.actor }}
git config --global user.email "${{ github.actor }}@users.noreply.github.com"

# Combine modules together so maven can do everything at once
- name: Create combined module
run: |
mkdir combined
cp main/pom.xml combined
sed -i '/<\/developers>/a <modules><module>pass-core</module><module>pass-support</module></modules>' combined/pom.xml

- name: Checkout pass-core and pass-support using PAT
run: |
git clone https://${{ secrets.JAVA_RELEASE_PAT }}@github.com/eclipse-pass/pass-core.git combined/pass-core
git clone https://${{ secrets.JAVA_RELEASE_PAT }}@github.com/eclipse-pass/pass-support.git combined/pass-support

- name: Set the release version, commit the change, and tag it
run: |
(cd main && mvn versions:set -B -ntp -DnewVersion=$RELEASE && git commit -am "Update version to $RELEASE" && git tag $RELEASE)
(cd combined && mvn versions:set -B -ntp -DnewVersion=$RELEASE)
(cd combined/pass-core && git commit -am "Update version to $RELEASE" && git tag $RELEASE)
(cd combined/pass-support && git commit -am "Update version to $RELEASE" && git tag $RELEASE)

- name: Release Java modules
uses: ./main/.github/actions/maven-release
with:
repodir: combined
env:
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}

- name: Set the next dev version and commit the change
run: |
(cd main && mvn versions:set -B -ntp -DallowSnapshots=true -DnewVersion=$NEXT && git commit -am "Update version to $NEXT")
(cd combined && mvn versions:set -B -ntp -DallowSnapshots=true -DnewVersion=$NEXT)
(cd combined/pass-core && git commit -am "Update version to $NEXT")
(cd combined/pass-support && git commit -am "Update version to $NEXT")

- name: Release dev Java modules
working-directory: combined
run: |
mvn -B -V -ntp -P release clean deploy -DskipTests -DskipITs
env:
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}

- name: Login to GHCR
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.JAVA_RELEASE_PAT }}

- name: Push Docker images to GHCR
run: |
docker push ghcr.io/eclipse-pass/pass-core-main:$RELEASE
docker push ghcr.io/eclipse-pass/pass-core-main:$NEXT
docker push ghcr.io/eclipse-pass/deposit-services-core:$RELEASE
docker push ghcr.io/eclipse-pass/deposit-services-core:$NEXT
docker push ghcr.io/eclipse-pass/pass-notification-service:$RELEASE
docker push ghcr.io/eclipse-pass/pass-notification-service:$NEXT
docker push ghcr.io/eclipse-pass/jhu-grant-loader:$RELEASE
docker push ghcr.io/eclipse-pass/jhu-grant-loader:$NEXT
docker push ghcr.io/eclipse-pass/pass-journal-loader:$RELEASE
docker push ghcr.io/eclipse-pass/pass-journal-loader:$NEXT
docker push ghcr.io/eclipse-pass/pass-nihms-loader:$RELEASE
docker push ghcr.io/eclipse-pass/pass-nihms-loader:$NEXT

- name: Push the commits and tags
run: |
(cd main && git push origin && git push origin --tags)
(cd combined/pass-core && git push origin && git push origin --tags)
(cd combined/pass-support && git push origin && git push origin --tags)

- name: Create GitHub main release
run: |
gh release create "$RELEASE" --repo=eclipse-pass/main --generate-notes
gh release create "$RELEASE" --repo=eclipse-pass/pass-core --generate-notes
gh release create "$RELEASE" --repo=eclipse-pass/pass-support --generate-notes
env:
GITHUB_TOKEN: ${{ secrets.JAVA_RELEASE_PAT }}
Loading
Loading