diff --git a/.github/workflows/dist-python.yml b/.github/workflows/dist-python.yml new file mode 100644 index 0000000..43668ee --- /dev/null +++ b/.github/workflows/dist-python.yml @@ -0,0 +1,75 @@ +name: Python Dist + +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+" + - "[0-9]+.[0-9]+.[0-9]+.post[0-9]+" + - "[0-9]+.[0-9]+.[0-9]+[a-b][0-9]+" + - "[0-9]+.[0-9]+.[0-9]+rc[0-9]+" + workflow_dispatch: + pull_request: + workflow_call: + inputs: + ref: + required: true + type: string + +concurrency: + group: dist-${{ github.ref }} + cancel-in-progress: true + +defaults: + run: + shell: bash -eux {0} + +jobs: + make_dist: + name: Make Dist + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - uses: actions/setup-python@v5 + with: + # Build sdist on lowest supported Python + python-version: '3.9' + + - name: Install python requirements + run: | + python -m pip install uv rust-just build twine + + - name: Build Dist + run: | + python -m build . + + - name: Test SDist + run: | + python -m twine check --strict dist/*.* + python -m pip install dist/*.gz + cd .. + python -c "from flask_pymongo import PyMongo" + + - uses: actions/upload-artifact@v4 + with: + name: "dist" + path: ./dist/*.* + + collect_dist: + runs-on: ubuntu-latest + needs: [make_dist] + name: Download Dist + steps: + - name: Download all workflow run artifacts + uses: actions/download-artifact@v4 + - name: Flatten directory + working-directory: . + run: | + find . -mindepth 2 -type f -exec mv {} . \; + find . -type d -empty -delete + - uses: actions/upload-artifact@v4 + with: + name: all-dist-${{ github.run_id }} + path: "./*" diff --git a/.github/workflows/release-python.yml b/.github/workflows/release-python.yml index 519ef9d..31553b0 100644 --- a/.github/workflows/release-python.yml +++ b/.github/workflows/release-python.yml @@ -1,15 +1,28 @@ -name: Python Wheels +name: Release on: - push: - branches: ["main"] - tags: - - "**" - pull_request: workflow_dispatch: + inputs: + following_version: + description: "The post (dev) version to set" + dry_run: + description: "Dry Run?" + default: false + type: boolean + schedule: + - cron: '30 5 * * *' + +env: + # Changes per repo + PRODUCT_NAME: Flask-PyMongo + # Constant + # inputs will be empty on a scheduled run. so, we only set dry_run + # to 'false' when the input is set to 'false'. + DRY_RUN: ${{ ! contains(inputs.dry_run, 'false') }} + FOLLOWING_VERSION: ${{ inputs.following_version || '' }} concurrency: - group: wheels-${{ github.ref }} + group: release-${{ github.ref }} cancel-in-progress: true defaults: @@ -17,83 +30,78 @@ defaults: shell: bash -eux {0} jobs: - - build_dist: - name: Build Distribution Files - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - persist-credentials: false - - - uses: actions/setup-python@v5 - with: - # Build sdist on lowest supported Python - python-version: '3.9' - - - name: Install build - run: | - python -m pip install build - - - name: build the dist files - run: | - python -m build . - - - name: Upload the dist files - uses: actions/upload-artifact@v4 - with: - name: dist-${{ github.run_id }} - path: ./dist/*.* - - test_dist: - needs: [build_dist] - name: Test Distribution Files + pre-publish: + environment: release runs-on: ubuntu-latest + if: github.repository_owner == 'mongodb-labs' || github.event_name == 'workflow_dispatch' + permissions: + id-token: write + contents: write + outputs: + version: ${{ steps.pre-publish.outputs.version }} steps: - - uses: actions/checkout@v4 + - uses: mongodb-labs/drivers-github-tools/secure-checkout@v2 with: - fetch-depth: 0 - persist-credentials: false - - - uses: actions/setup-python@v5 + app_id: ${{ vars.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + - uses: mongodb-labs/drivers-github-tools/setup@v2 with: - # Build sdist on lowest supported Python - python-version: '3.9' - - - name: Download the dists - uses: actions/download-artifact@v4 + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + aws_region_name: ${{ vars.AWS_REGION_NAME }} + aws_secret_id: ${{ secrets.AWS_SECRET_ID }} + artifactory_username: ${{ vars.ARTIFACTORY_USERNAME }} + - uses: mongodb-labs/drivers-github-tools/python-labs/pre-publish@v2 + id: pre-publish with: - name: dist-${{ github.run_id }} - path: dist/ - - - name: Test the sdist - run: | - cd dist - pip install *.tar.gz - python -c "import flask_pymongo" - pip uninstall -y flask_pymongo + dry_run: ${{ env.DRY_RUN }} - - name: Test the wheel - run: | - cd dist - pip install *.whl - python -c "import flask_pymongo" - pip uninstall -y flask_pymongo + build-dist: + needs: [pre-publish] + uses: ./.github/workflows/dist-python.yml + with: + ref: ${{ needs.pre-publish.outputs.version }} publish: # https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/#publishing-the-distribution-to-pypi - needs: [test_dist] - if: startsWith(github.ref, 'refs/tags/') + needs: [build-dist] + if: (github.repository_owner == 'mongodb-labs' && github.event_name != 'pull_request') || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest environment: release permissions: id-token: write steps: - - name: Download the dists + - name: Download all the dists uses: actions/download-artifact@v4 with: - name: dist-${{ github.run_id }} + name: all-dist-${{ github.run_id }} path: dist/ - name: Publish distribution 📦 to PyPI + if: startsWith(github.ref, 'refs/tags/') uses: pypa/gh-action-pypi-publish@release/v1 + + post-publish: + needs: [publish] + runs-on: ubuntu-latest + environment: release + permissions: + id-token: write + contents: write + attestations: write + security-events: write + steps: + - uses: mongodb-labs/drivers-github-tools/secure-checkout@v2 + with: + app_id: ${{ vars.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + - uses: mongodb-labs/drivers-github-tools/setup@v2 + with: + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + aws_region_name: ${{ vars.AWS_REGION_NAME }} + aws_secret_id: ${{ secrets.AWS_SECRET_ID }} + artifactory_username: ${{ vars.ARTIFACTORY_USERNAME }} + - uses: mongodb-labs/drivers-github-tools/python-labs/post-publish@v2 + with: + following_version: ${{ env.FOLLOWING_VERSION }} + product_name: ${{ env.PRODUCT_NAME }} + token: ${{ github.token }} + dry_run: ${{ env.DRY_RUN }}