diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml new file mode 100644 index 00000000..9bd8367e --- /dev/null +++ b/.github/actions/build/action.yml @@ -0,0 +1,44 @@ +name: 'Build' +description: 'Builds the project, optionally publishing it to a local deployment repository' +inputs: + java-version: + required: false + default: '17' + description: 'The Java version to compile and test with' + java-distribution: + required: false + default: 'liberica' + description: 'The Java distribution to use for the build' + publish: + required: false + default: 'false' + description: 'Whether to publish artifacts ready for deployment to Artifactory' +outputs: + version: + description: 'The version that was built' + value: ${{ steps.read-version.outputs.version }} +runs: + using: composite + steps: + - name: Prepare Maven Build + uses: ./.github/actions/prepare-maven-build + with: + java-version: ${{ inputs.java-version }} + java-distribution: ${{ inputs.java-distribution }} + - name: Build + id: build + if: ${{ inputs.publish == 'false' }} + shell: bash + run: ./mvnw --no-transfer-progress --batch-mode --update-snapshots verify + - name: Publish + id: publish + if: ${{ inputs.publish == 'true' }} + shell: bash + run: ./mvnw --no-transfer-progress --batch-mode --update-snapshots -DaltDeploymentRepository=local::file:deployment-repository/ clean deploy -Pspring + - name: Read version from pom.xml + id: read-version + shell: bash + run: | + version=$(sed -n 's/^.*\(.*\)<\/revision>.*$/\1/p' pom.xml) + echo "Version is $version" + echo "version=$version" >> $GITHUB_OUTPUT diff --git a/.github/actions/prepare-maven-build/action.yml b/.github/actions/prepare-maven-build/action.yml new file mode 100644 index 00000000..ea1f2402 --- /dev/null +++ b/.github/actions/prepare-maven-build/action.yml @@ -0,0 +1,21 @@ +name: 'Prepare Gradle Build' +description: 'Prepares a Maven build. Sets up Java' +inputs: + java-version: + required: false + default: '17' + description: 'The Java version to use for the build' + java-distribution: + required: false + default: 'liberica' + description: 'The Java distribution to use for the build' +runs: + using: composite + steps: + - name: Set Up Java + uses: actions/setup-java@v4 + with: + distribution: ${{ inputs.java-distribution }} + java-version: | + ${{ inputs.java-version }} + ${{ inputs.java-toolchain == 'true' && '17' || '' }} diff --git a/.github/actions/print-jvm-thread-dumps/action.yml b/.github/actions/print-jvm-thread-dumps/action.yml new file mode 100644 index 00000000..9b0905b7 --- /dev/null +++ b/.github/actions/print-jvm-thread-dumps/action.yml @@ -0,0 +1,17 @@ +name: Print JVM thread dumps +description: Prints a thread dump for all running JVMs +runs: + using: composite + steps: + - if: ${{ runner.os == 'Linux' }} + shell: bash + run: | + for jvm_pid in $(jps -q -J-XX:+PerfDisableSharedMem); do + jcmd $jvm_pid Thread.print + done + - if: ${{ runner.os == 'Windows' }} + shell: powershell + run: | + foreach ($jvm_pid in $(jps -q -J-XX:+PerfDisableSharedMem)) { + jcmd $jvm_pid Thread.print + } diff --git a/.github/actions/send-notification/action.yml b/.github/actions/send-notification/action.yml new file mode 100644 index 00000000..8a93fc86 --- /dev/null +++ b/.github/actions/send-notification/action.yml @@ -0,0 +1,30 @@ +name: Send Notification +description: Sends a Google Chat message as a notification of the job's outcome +inputs: + webhook-url: + description: 'Google Chat Webhook URL' + required: true + status: + description: 'Status of the job' + required: true + run-name: + description: 'Name of the run to include in the notification' + default: ${{ format('{0} {1}', github.ref_name, github.job) }} +runs: + using: composite + steps: + - shell: bash + run: | + echo "RUN_URL=${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> "$GITHUB_ENV" + - shell: bash + if: ${{ inputs.status == 'success' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: "<${{ env.RUN_URL }}|${{ inputs.run-name }}> was successful"}' || true + - shell: bash + if: ${{ inputs.status == 'failure' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: " *<${{ env.RUN_URL }}|${{ inputs.run-name }}> failed*"}' || true + - shell: bash + if: ${{ inputs.status == 'cancelled' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: "<${{ env.RUN_URL }}|${{ inputs.run-name }}> was cancelled"}' || true diff --git a/.github/workflows/build-and-deploy-snapshot.yml b/.github/workflows/build-and-deploy-snapshot.yml new file mode 100644 index 00000000..ce1d9c7e --- /dev/null +++ b/.github/workflows/build-and-deploy-snapshot.yml @@ -0,0 +1,42 @@ +name: Build and Deploy Snapshot +on: + push: + branches: + - main +permissions: + actions: write +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} +jobs: + build-and-deploy-snapshot: + if: ${{ github.repository == 'spring-projects/spring-retry' }} + name: Build and Deploy Snapshot + runs-on: ubuntu-latest + steps: + - name: Check Out Code + uses: actions/checkout@v4 + - name: Build and Publish + id: build-and-publish + uses: ./.github/actions/build + with: + publish: true + - name: Deploy + uses: spring-io/artifactory-deploy-action@26bbe925a75f4f863e1e529e85be2d0093cac116 # v0.0.1 + with: + uri: 'https://repo.spring.io' + username: ${{ secrets.ARTIFACTORY_USERNAME }} + password: ${{ secrets.ARTIFACTORY_PASSWORD }} + build-name: 'spring-retry-2.0.x' + repository: 'libs-snapshot-local' + folder: 'deployment-repository' + signing-key: ${{ secrets.GPG_PRIVATE_KEY }} + signing-passphrase: ${{ secrets.GPG_PASSPHRASE }} + - name: Send Notification + uses: ./.github/actions/send-notification + if: always() + with: + webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK_URL }} + status: ${{ job.status }} + run-name: ${{ format('{0} | Linux | Java 17', github.ref_name) }} + outputs: + version: ${{ steps.build-and-publish.outputs.version }} diff --git a/.github/workflows/pr-build-workflow.yml b/.github/workflows/build-pull-request.yml similarity index 55% rename from .github/workflows/pr-build-workflow.yml rename to .github/workflows/build-pull-request.yml index 995b41c3..afb5c1be 100644 --- a/.github/workflows/pr-build-workflow.yml +++ b/.github/workflows/build-pull-request.yml @@ -6,18 +6,19 @@ permissions: jobs: build: - name: Build pull request + name: Build Pull Request runs-on: ubuntu-latest if: ${{ github.repository == 'spring-projects/spring-retry' }} steps: - - name: Set up JDK 17 - uses: actions/setup-java@v3 + - name: Set Up JDK 17 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'liberica' - - - name: Check out code - uses: actions/checkout@v3 - + - name: Check Out + uses: actions/checkout@v4 - name: Build run: ./mvnw --batch-mode --update-snapshots verify + - name: Print JVM Thread Dumps When Cancelled + uses: ./.github/actions/print-jvm-thread-dumps + if: cancelled()