name: Publish Release run-name: "Publish Release (pypi_target=${{ inputs.pypi_target }}, repo_release_ref=${{ inputs.repo_release_ref }})" on: # Trigger release workflow from other workflows (e.g. release dev build as part of CI) workflow_call: inputs: pypi_target: description: "PyPI repository to publish to" required: true type: string default: "test.pypi.org" repo_release_ref: description: "Gitlint git reference to publish release for" type: string default: "main" # Manually trigger a release workflow_dispatch: inputs: pypi_target: description: "PyPI repository to publish to" required: true type: choice options: - "pypi.org" - "test.pypi.org" default: "test.pypi.org" repo_release_ref: description: "Gitlint git reference to publish release for" type: string default: "main" jobs: publish: timeout-minutes: 15 runs-on: "ubuntu-latest" outputs: gitlint_version: ${{ steps.set_version.outputs.gitlint_version }} steps: - name: Setup python uses: actions/setup-python@v4.5.0 with: python-version: "3.11" - name: Install pypa/build run: python -m pip install build==0.10.0 - name: Install Hatch run: python -m pip install hatch==1.6.3 - uses: actions/checkout@v3.3.0 with: ref: ${{ inputs.repo_release_ref }} fetch-depth: 0 # checkout all history, needed for hatch versioning # Run hatch version once to avoid additional output ("Setting up build environment for missing dependencies") # during the next step - name: Hatch version run: hatch version # Hatch versioning is based on git (using hatch-vcs). If there is no explicit tag for the commit we're trying to # publish, hatch versioning strings will have this format: 0.19.0.dev52+g9f7dc7d # With the string after '+' being the 'g' of the commit. # # However, PyPI doesn't allow '+' in version numbers (no PEP440 local versions allowed on PyPI). # To work around this, we override the version string by setting the SETUPTOOLS_SCM_PRETEND_VERSION env var # to the version string without the '+' and everything after it. # We do this by setting the `gitlint_version` step output here and re-using it later to # set SETUPTOOLS_SCM_PRETEND_VERSION. # # We only actually publish such releases on the main branch to guarantee the dev numbering scheme remains # unique. # Note that when a tag *is* present (i.e. v0.19.0), hatch versioning will return the tag name (i.e. 0.19.0) # and this step has no effect, ie. SETUPTOOLS_SCM_PRETEND_VERSION will be the same as `hatch version`. - name: Set SETUPTOOLS_SCM_PRETEND_VERSION id: set_version run: | echo "gitlint_version=$(hatch version | cut -d+ -f1)" >> $GITHUB_OUTPUT - name: Build (gitlint-core) run: python -m build working-directory: ./gitlint-core env: SETUPTOOLS_SCM_PRETEND_VERSION: ${{ steps.set_version.outputs.gitlint_version }} - name: Build (gitlint) run: python -m build env: SETUPTOOLS_SCM_PRETEND_VERSION: ${{ steps.set_version.outputs.gitlint_version }} - name: Publish gitlint-core (pypi.org) run: hatch publish working-directory: ./gitlint-core env: HATCH_INDEX_USER: ${{ secrets.PYPI_GITLINT_CORE_USERNAME }} HATCH_INDEX_AUTH: ${{ secrets.PYPI_GITLINT_CORE_PASSWORD }} if: inputs.pypi_target == 'pypi.org' - name: Publish gitlint (pypi.org) run: hatch publish env: HATCH_INDEX_USER: ${{ secrets.PYPI_GITLINT_USERNAME }} HATCH_INDEX_AUTH: ${{ secrets.PYPI_GITLINT_PASSWORD }} if: inputs.pypi_target == 'pypi.org' - name: Publish gitlint-core (test.pypi.org) run: hatch publish -r test working-directory: ./gitlint-core env: HATCH_INDEX_USER: ${{ secrets.TEST_PYPI_GITLINT_CORE_USERNAME }} HATCH_INDEX_AUTH: ${{ secrets.TEST_PYPI_GITLINT_CORE_PASSWORD }} if: inputs.pypi_target == 'test.pypi.org' - name: Publish gitlint (test.pypi.org) run: hatch publish -r test env: HATCH_INDEX_USER: ${{ secrets.TEST_PYPI_GITLINT_USERNAME }} HATCH_INDEX_AUTH: ${{ secrets.TEST_PYPI_GITLINT_PASSWORD }} if: inputs.pypi_target == 'test.pypi.org' # Wait for gitlint package to be available in PyPI for installation wait-for-package: needs: - publish runs-on: "ubuntu-latest" steps: - name: Install gitlint uses: nick-fields/retry@v2.8.3 with: timeout_minutes: 1 max_attempts: 10 command: | python -m pip install gitlint==${{ needs.publish.outputs.gitlint_version }} if: inputs.pypi_target == 'pypi.org' - name: Install gitlint (test.pypi.org) uses: nick-fields/retry@v2.8.3 with: timeout_minutes: 1 max_attempts: 10 command: | pip install --no-cache-dir -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple gitlint==${{ needs.publish.outputs.gitlint_version }} if: inputs.pypi_target == 'test.pypi.org' - name: gitlint --version run: | gitlint --version [ "$(gitlint --version)" == "gitlint, version ${{ needs.publish.outputs.gitlint_version }}" ] # Unfortunately, it's not because the newly published package installation worked once that replication # has finished amongst all PyPI servers (subsequent installations might still fail). We sleep for 10 min here # to increase the odds that replication has finished. - name: Sleep run: sleep 600 test-release: needs: - publish - wait-for-package uses: ./.github/workflows/test-release.yml with: gitlint_version: ${{ needs.publish.outputs.gitlint_version }} pypi_source: ${{ inputs.pypi_target }} repo_test_ref: ${{ inputs.repo_release_ref }} publish-docker: needs: - publish - test-release uses: ./.github/workflows/publish-docker.yml secrets: inherit # pass all secrets (required to access secrets in a called workflow) with: gitlint_version: ${{ needs.publish.outputs.gitlint_version }} docker_image_tag: "latest_dev" push_to_dockerhub: true