Release Codegen 3.0 #10
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: Release Codegen 3.0 | |
| # Manual release workflow for codegen 3.0.0, with optional generators release. | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| release_generators: | |
| description: 'Release swagger-codegen-generators together with codegen' | |
| required: true | |
| default: 'false' | |
| type: choice | |
| options: | |
| - 'false' | |
| - 'true' | |
| skip_maven_deploy: | |
| description: 'Skip Maven deploy for recovery when artifacts are already published' | |
| required: true | |
| default: 'false' | |
| type: choice | |
| options: | |
| - 'false' | |
| - 'true' | |
| skip_docker_push: | |
| description: 'Skip Docker build and push' | |
| required: true | |
| default: 'false' | |
| type: choice | |
| options: | |
| - 'false' | |
| - 'true' | |
| skip_rancher_deploy: | |
| description: 'Skip Swagger online generator deployment' | |
| required: true | |
| default: 'false' | |
| type: choice | |
| options: | |
| - 'false' | |
| - 'true' | |
| previous_generators_version: | |
| description: 'Generator release or snapshot version used to bootstrap the first codegen build when releasing generators' | |
| required: false | |
| type: string | |
| codegen_generators_bootstrap_version: | |
| description: 'Codegen release or snapshot version used to build generators' | |
| required: false | |
| type: string | |
| dry_run: | |
| description: 'Run validation and builds without deploy, Docker push, or Rancher deploy (post-release PR is still created)' | |
| required: true | |
| default: 'true' | |
| type: choice | |
| options: | |
| - 'true' | |
| - 'false' | |
| permissions: | |
| contents: read | |
| jobs: | |
| validate-branch: | |
| if: github.ref_name != '3.0.0' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Require 3.0.0 branch | |
| run: | | |
| echo "This workflow can run only from branch 3.0.0 (current: ${GITHUB_REF_NAME})." | |
| exit 1 | |
| validate: | |
| # Single source of truth for resolved versions and release-mode decisions. | |
| if: github.ref_name == '3.0.0' | |
| runs-on: ubuntu-latest | |
| outputs: | |
| codegen_version: ${{ steps.resolve.outputs.codegen_version }} | |
| generators_version: ${{ steps.resolve.outputs.generators_version }} | |
| codegen_build_generators_version: ${{ steps.resolve.outputs.codegen_build_generators_version }} | |
| bootstrap_generators_version: ${{ steps.resolve.outputs.bootstrap_generators_version }} | |
| bootstrap_codegen_version: ${{ steps.resolve.outputs.bootstrap_codegen_version }} | |
| next_codegen_snapshot_version: ${{ steps.resolve.outputs.next_codegen_snapshot_version }} | |
| generators_deploy_needed: ${{ steps.resolve.outputs.generators_deploy_needed }} | |
| steps: | |
| - name: Checkout swagger-codegen 3.0.0 | |
| uses: actions/checkout@v6 | |
| with: | |
| ref: 3.0.0 | |
| - name: Checkout swagger-codegen-generators | |
| if: inputs.release_generators == 'true' | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: swagger-api/swagger-codegen-generators | |
| ref: master | |
| path: generators-repo | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Set up Java and Maven | |
| uses: actions/setup-java@v5 | |
| env: | |
| MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} | |
| MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} | |
| MAVEN_GPG_PASSPHRASE: ${{ secrets.OSSRH_GPG_PRIVATE_PASSPHRASE }} | |
| with: | |
| java-version: '17' | |
| distribution: temurin | |
| server-id: central | |
| cache: maven | |
| overwrite-settings: false | |
| server-username: MAVEN_USERNAME | |
| server-password: MAVEN_PASSWORD | |
| gpg-private-key: ${{ secrets.OSSRH_GPG_PRIVATE_KEY }} | |
| gpg-passphrase: MAVEN_GPG_PASSPHRASE | |
| - name: Add Central Portal snapshot repository | |
| uses: s4u/maven-settings-action@v4.0.0 | |
| with: | |
| repositories: '[{"id":"central-portal-snapshots","name":"Sonatype Central Portal snapshots","url":"https://central.sonatype.com/repository/maven-snapshots/","releases":{"enabled":false},"snapshots":{"enabled":true}}]' | |
| servers: '[{"id":"central","username":"${{ secrets.MAVEN_CENTRAL_USERNAME }}","password":"${{ secrets.MAVEN_CENTRAL_PASSWORD }}"}]' | |
| - name: Validate and resolve versions | |
| id: resolve | |
| # Computes build/deploy coordinates and enforces safe release preconditions. | |
| env: | |
| RELEASE_GENERATORS: ${{ inputs.release_generators }} | |
| PREVIOUS_GENERATORS_VERSION: ${{ inputs.previous_generators_version }} | |
| CODEGEN_GENERATORS_BOOTSTRAP_VERSION: ${{ inputs.codegen_generators_bootstrap_version }} | |
| SKIP_MAVEN_DEPLOY: ${{ inputs.skip_maven_deploy }} | |
| DRY_RUN: ${{ inputs.dry_run }} | |
| run: bash CI/release/resolve-release-versions.sh | |
| bootstrap_codegen: | |
| # Break circular dependency: build codegen first with previous generators version. | |
| runs-on: ubuntu-latest | |
| needs: validate | |
| if: inputs.release_generators == 'true' && needs.validate.outputs.generators_deploy_needed == 'true' | |
| steps: | |
| - name: Checkout swagger-codegen 3.0.0 | |
| uses: actions/checkout@v6 | |
| with: | |
| ref: 3.0.0 | |
| - name: Set up Java and Maven | |
| uses: actions/setup-java@v5 | |
| env: | |
| MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} | |
| MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} | |
| with: | |
| java-version: '17' | |
| distribution: temurin | |
| server-id: central | |
| cache: maven | |
| overwrite-settings: false | |
| server-username: MAVEN_USERNAME | |
| server-password: MAVEN_PASSWORD | |
| - name: Add Central Portal snapshot repository | |
| uses: s4u/maven-settings-action@v4.0.0 | |
| with: | |
| repositories: '[{"id":"central-portal-snapshots","name":"Sonatype Central Portal snapshots","url":"https://central.sonatype.com/repository/maven-snapshots/","releases":{"enabled":false},"snapshots":{"enabled":true}}]' | |
| servers: '[{"id":"central","username":"${{ secrets.MAVEN_CENTRAL_USERNAME }}","password":"${{ secrets.MAVEN_CENTRAL_PASSWORD }}"}]' | |
| - name: Build codegen with bootstrap generators | |
| run: | | |
| bash CI/release/build-codegen-with-generators.sh "${{ needs.validate.outputs.bootstrap_generators_version }}" | |
| generators: | |
| # Build/deploy generators only when this run is responsible for publishing them. | |
| runs-on: ubuntu-latest | |
| needs: | |
| - validate | |
| - bootstrap_codegen | |
| if: inputs.release_generators == 'true' && needs.validate.outputs.generators_deploy_needed == 'true' | |
| steps: | |
| - name: Checkout swagger-codegen-generators | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: swagger-api/swagger-codegen-generators | |
| ref: master | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Set up Java and Maven | |
| uses: actions/setup-java@v5 | |
| env: | |
| MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} | |
| MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} | |
| MAVEN_GPG_PASSPHRASE: ${{ secrets.OSSRH_GPG_PRIVATE_PASSPHRASE }} | |
| with: | |
| java-version: '17' | |
| distribution: temurin | |
| server-id: central | |
| cache: maven | |
| overwrite-settings: false | |
| server-username: MAVEN_USERNAME | |
| server-password: MAVEN_PASSWORD | |
| gpg-private-key: ${{ secrets.OSSRH_GPG_PRIVATE_KEY }} | |
| gpg-passphrase: MAVEN_GPG_PASSPHRASE | |
| - name: Add Central Portal snapshot repository | |
| uses: s4u/maven-settings-action@v4.0.0 | |
| with: | |
| repositories: '[{"id":"central-portal-snapshots","name":"Sonatype Central Portal snapshots","url":"https://central.sonatype.com/repository/maven-snapshots/","releases":{"enabled":false},"snapshots":{"enabled":true}}]' | |
| servers: '[{"id":"central","username":"${{ secrets.MAVEN_CENTRAL_USERNAME }}","password":"${{ secrets.MAVEN_CENTRAL_PASSWORD }}"}]' | |
| - name: Build swagger-codegen-generators | |
| run: | | |
| mvn -B -U clean install \ | |
| -Dswagger-codegen-version="${{ needs.validate.outputs.bootstrap_codegen_version }}" | |
| - name: Deploy swagger-codegen-generators | |
| # Recovery controls: deploy can be skipped with dry_run/skip_maven_deploy. | |
| if: inputs.skip_maven_deploy != 'true' && inputs.dry_run != 'true' | |
| env: | |
| MAVEN_GPG_PASSPHRASE: ${{ secrets.OSSRH_GPG_PRIVATE_PASSPHRASE }} | |
| run: | | |
| mvn --no-transfer-progress -B -Prelease deploy \ | |
| -Dgpg.pinentry.mode=loopback | |
| - name: Skip swagger-codegen-generators deploy | |
| if: inputs.skip_maven_deploy == 'true' || inputs.dry_run == 'true' | |
| run: | | |
| echo "Generator deploy skipped." | |
| echo "skip_maven_deploy=${{ inputs.skip_maven_deploy }}" | |
| echo "dry_run=${{ inputs.dry_run }}" | |
| codegen: | |
| # Main codegen build and Maven release deploy. | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| needs: | |
| - validate | |
| - generators | |
| if: always() && needs.validate.result == 'success' && (needs.generators.result == 'success' || needs.generators.result == 'skipped') | |
| outputs: | |
| codegen_version: ${{ steps.expose.outputs.codegen_version }} | |
| generators_version: ${{ steps.expose.outputs.generators_version }} | |
| next_codegen_snapshot_version: ${{ steps.expose.outputs.next_codegen_snapshot_version }} | |
| steps: | |
| - name: Checkout swagger-codegen 3.0.0 | |
| uses: actions/checkout@v6 | |
| with: | |
| ref: 3.0.0 | |
| - name: Set up Java and Maven | |
| uses: actions/setup-java@v5 | |
| env: | |
| MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} | |
| MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} | |
| MAVEN_GPG_PASSPHRASE: ${{ secrets.OSSRH_GPG_PRIVATE_PASSPHRASE }} | |
| with: | |
| java-version: '17' | |
| distribution: temurin | |
| server-id: central | |
| cache: maven | |
| overwrite-settings: false | |
| server-username: MAVEN_USERNAME | |
| server-password: MAVEN_PASSWORD | |
| gpg-private-key: ${{ secrets.OSSRH_GPG_PRIVATE_KEY }} | |
| gpg-passphrase: MAVEN_GPG_PASSPHRASE | |
| - name: Add Central Portal snapshot repository | |
| uses: s4u/maven-settings-action@v4.0.0 | |
| with: | |
| repositories: '[{"id":"central-portal-snapshots","name":"Sonatype Central Portal snapshots","url":"https://central.sonatype.com/repository/maven-snapshots/","releases":{"enabled":false},"snapshots":{"enabled":true}}]' | |
| servers: '[{"id":"central","username":"${{ secrets.MAVEN_CENTRAL_USERNAME }}","password":"${{ secrets.MAVEN_CENTRAL_PASSWORD }}"}]' | |
| - name: Build swagger-codegen | |
| run: | | |
| bash CI/release/build-codegen-with-generators.sh "${{ needs.validate.outputs.codegen_build_generators_version }}" | |
| - name: Deploy swagger-codegen | |
| # Intended for final release run; disabled in dry_run/recovery skip mode. | |
| if: inputs.skip_maven_deploy != 'true' && inputs.dry_run != 'true' | |
| env: | |
| MAVEN_GPG_PASSPHRASE: ${{ secrets.OSSRH_GPG_PRIVATE_PASSPHRASE }} | |
| run: | | |
| mvn --no-transfer-progress -B -Prelease deploy \ | |
| -Dswagger-codegen-generators-version="${{ needs.validate.outputs.codegen_build_generators_version }}" \ | |
| -Dgpg.pinentry.mode=loopback | |
| - name: Skip swagger-codegen deploy | |
| if: inputs.skip_maven_deploy == 'true' || inputs.dry_run == 'true' | |
| run: | | |
| echo "Codegen Maven deploy skipped." | |
| echo "skip_maven_deploy=${{ inputs.skip_maven_deploy }}" | |
| echo "dry_run=${{ inputs.dry_run }}" | |
| - name: Expose release outputs | |
| id: expose | |
| run: | | |
| echo "codegen_version=${{ needs.validate.outputs.codegen_version }}" >> "${GITHUB_OUTPUT}" | |
| echo "generators_version=${{ needs.validate.outputs.generators_version }}" >> "${GITHUB_OUTPUT}" | |
| echo "next_codegen_snapshot_version=${{ needs.validate.outputs.next_codegen_snapshot_version }}" >> "${GITHUB_OUTPUT}" | |
| - name: Publish prepared draft release notes | |
| # Publishes the draft release created in prepare-release workflow. | |
| if: inputs.dry_run != 'true' | |
| uses: actions/github-script@v8 | |
| with: | |
| script: | | |
| const tag = `v${{ needs.validate.outputs.codegen_version }}`; | |
| const owner = context.repo.owner; | |
| const repo = context.repo.repo; | |
| let release; | |
| try { | |
| const { data } = await github.rest.repos.getReleaseByTag({ owner, repo, tag }); | |
| release = data; | |
| } catch (error) { | |
| core.setFailed(`Expected prepared draft release for tag ${tag}, but it was not found.`); | |
| return; | |
| } | |
| if (!release.draft) { | |
| core.info(`Release ${tag} is already published.`); | |
| return; | |
| } | |
| await github.rest.repos.updateRelease({ | |
| owner, | |
| repo, | |
| release_id: release.id, | |
| draft: false | |
| }); | |
| core.info(`Published draft release ${tag}.`); | |
| docker_release: | |
| # Reuse the battle-tested docker release workflow with orchestrator-level skip gates. | |
| needs: codegen | |
| if: inputs.skip_docker_push != 'true' && inputs.dry_run != 'true' | |
| uses: ./.github/workflows/docker-release-3.0.yml | |
| with: | |
| tag: ${{ needs.codegen.outputs.codegen_version }} | |
| deploy_online: ${{ inputs.skip_rancher_deploy != 'true' }} | |
| secrets: inherit | |
| post_release_pr: | |
| # Prepares and opens next snapshot PR after successful release pipeline. | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| needs: | |
| - codegen | |
| - docker_release | |
| if: always() && needs.codegen.result == 'success' && (needs.docker_release.result == 'success' || needs.docker_release.result == 'skipped') | |
| env: | |
| NEXT_CODEGEN_SNAPSHOT_VERSION: ${{ needs.codegen.outputs.next_codegen_snapshot_version }} | |
| GENERATORS_VERSION: ${{ needs.codegen.outputs.generators_version }} | |
| steps: | |
| - name: Checkout swagger-codegen 3.0.0 | |
| uses: actions/checkout@v6 | |
| with: | |
| ref: 3.0.0 | |
| - uses: actions/create-github-app-token@v3 | |
| id: generate-token | |
| with: | |
| app-id: ${{ secrets.APP_ID }} | |
| private-key: ${{ secrets.APP_PRIVATE_KEY }} | |
| - name: Set up Java and Maven | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: '17' | |
| distribution: temurin | |
| cache: maven | |
| - name: Prepare next snapshot changes | |
| id: next-snapshot | |
| # Moves repo from release version to next -SNAPSHOT and updates docs/poms. | |
| run: bash CI/release/post-codegen-snapshot.sh | |
| - name: Create next snapshot pull request | |
| uses: peter-evans/create-pull-request@v8 | |
| with: | |
| token: ${{ steps.generate-token.outputs.token }} | |
| commit-message: bump snapshot ${{ steps.next-snapshot.outputs.next_codegen_snapshot_version }} | |
| title: bump snapshot ${{ steps.next-snapshot.outputs.next_codegen_snapshot_version }} | |
| branch: bump-snap-${{ steps.next-snapshot.outputs.next_codegen_snapshot_version }} | |
| base: 3.0.0 | |
| body: | | |
| Bump Swagger Codegen to ${{ steps.next-snapshot.outputs.next_codegen_snapshot_version }} after release. | |
| release_generators: ${{ inputs.release_generators }} | |
| swagger-codegen-generators dependency retained as: ${{ needs.codegen.outputs.generators_version }} |