CI #190
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: | |
| - master | |
| tags: | |
| - v[0-9]+.[0-9]+.[0-9]+* | |
| pull_request: | |
| branches: | |
| - master | |
| workflow_dispatch: | |
| jobs: | |
| test: | |
| name: Run tests and publish test coverage | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Java JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: 8 | |
| distribution: 'adopt' | |
| - name: Install dependencies | |
| run: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -Dgpg.skip | |
| - name: Run tests and collect coverage | |
| run: mvn -B test | |
| - name: Upload coverage to Codecov | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| fail_ci_if_error: false | |
| verbose: true | |
| publish-dry-run: | |
| name: Publish dry run (validate artifacts) | |
| needs: test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Java JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: 8 | |
| distribution: 'adopt' | |
| - name: Build package with sources and javadoc | |
| run: mvn clean package -B -Dgpg.skip | |
| - name: Verify artifacts exist | |
| run: | | |
| echo "=== Checking generated artifacts ===" | |
| ls -la target/*.jar | |
| echo "" | |
| VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) | |
| echo "=== Verifying JAR ===" | |
| test -f "target/razorpay-java-${VERSION}.jar" && echo "✓ Main JAR found" || (echo "✗ Main JAR missing" && exit 1) | |
| echo "=== Verifying Sources JAR ===" | |
| test -f "target/razorpay-java-${VERSION}-sources.jar" && echo "✓ Sources JAR found" || (echo "✗ Sources JAR missing" && exit 1) | |
| echo "=== Verifying Javadoc JAR ===" | |
| test -f "target/razorpay-java-${VERSION}-javadoc.jar" && echo "✓ Javadoc JAR found" || (echo "✗ Javadoc JAR missing" && exit 1) | |
| - name: Validate pom.xml metadata | |
| run: | | |
| echo "=== Validating pom.xml for Central Portal requirements ===" | |
| mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout | grep -q "com.razorpay" && echo "✓ groupId present" || (echo "✗ groupId missing" && exit 1) | |
| mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout | grep -q "razorpay-java" && echo "✓ artifactId present" || (echo "✗ artifactId missing" && exit 1) | |
| mvn help:evaluate -Dexpression=project.version -q -DforceStdout | grep -qv "SNAPSHOT" && echo "✓ version is release (non-SNAPSHOT)" || (echo "✗ version is SNAPSHOT" && exit 1) | |
| mvn help:evaluate -Dexpression=project.name -q -DforceStdout | grep -q "." && echo "✓ name present" || (echo "✗ name missing" && exit 1) | |
| mvn help:evaluate -Dexpression=project.description -q -DforceStdout | grep -q "." && echo "✓ description present" || (echo "✗ description missing" && exit 1) | |
| mvn help:evaluate -Dexpression=project.url -q -DforceStdout | grep -q "http" && echo "✓ url present" || (echo "✗ url missing" && exit 1) | |
| echo "" | |
| echo "=== All Central Portal validations passed ===" | |
| - name: Validate Central Portal credentials | |
| env: | |
| CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} | |
| CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} | |
| run: | | |
| echo "=== Validating Central Portal credentials ===" | |
| if [ -z "$CENTRAL_USERNAME" ] || [ -z "$CENTRAL_TOKEN" ]; then | |
| echo "✗ CENTRAL_USERNAME or CENTRAL_TOKEN secrets are not set" | |
| exit 1 | |
| fi | |
| HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ | |
| -u "${CENTRAL_USERNAME}:${CENTRAL_TOKEN}" \ | |
| "https://central.sonatype.com/api/v1/publisher/status") | |
| case "$HTTP_STATUS" in | |
| 401|403) | |
| echo "✗ Central Portal rejected credentials (HTTP $HTTP_STATUS)" | |
| exit 1 | |
| ;; | |
| *) | |
| echo "✓ Central Portal accepted credentials (HTTP $HTTP_STATUS) — deep validation happens at publish time" | |
| ;; | |
| esac | |
| publish: | |
| if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch' | |
| needs: publish-dry-run | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Maven Central Repository | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: 8 | |
| distribution: 'adopt' | |
| server-id: central | |
| server-username: MAVEN_USERNAME | |
| server-password: MAVEN_PASSWORD | |
| gpg-private-key: ${{ secrets.OSSRH_GPG_SECRET_KEY }} | |
| gpg-passphrase: MAVEN_GPG_PASSPHRASE | |
| - name: Configure GPG | |
| run: | | |
| echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf | |
| gpg-connect-agent reloadagent /bye | |
| gpg --list-secret-keys | |
| - name: Build with Maven | |
| run: mvn clean package -B | |
| - name: Publish package | |
| run: mvn deploy | |
| env: | |
| MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} | |
| MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }} | |
| MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} |