diff --git a/.github/workflows/_publish_to_pypi.yaml b/.github/workflows/_publish_to_pypi.yaml index 323bc55f9..ecb80034b 100644 --- a/.github/workflows/_publish_to_pypi.yaml +++ b/.github/workflows/_publish_to_pypi.yaml @@ -3,9 +3,15 @@ name: Publish to PyPI on: workflow_call: inputs: + package_name: + required: true + type: string version_number: required: true type: string + is_prerelease: + required: true + type: string env: PYTHON_VERSION: 3.12 @@ -19,7 +25,7 @@ jobs: id-token: write # Required for OIDC authentication. environment: name: pypi - url: https://pypi.org/project/crawlee + url: https://pypi.org/project/${{ inputs.package_name }} steps: - name: Checkout repository @@ -38,10 +44,9 @@ jobs: # Updates the version number in the project's configuration. - name: Set version in pyproject.toml run: | - if [[ ${{ github.event_name }} = push ]]; then - # Make a pre-release on push + if [ -n "${{ inputs.is_prerelease }}" ]; then next_beta=$( - curl "https://pypi.org/pypi/crawlee/json" | jq --raw-output ' + curl "https://pypi.org/pypi/${{ inputs.package_name }}/json" | jq --raw-output ' [ .releases | keys | diff --git a/.github/workflows/pre_release.yaml b/.github/workflows/pre_release.yaml new file mode 100644 index 000000000..e6fa7caab --- /dev/null +++ b/.github/workflows/pre_release.yaml @@ -0,0 +1,90 @@ +name: Create a pre-release + +on: + # Trigger a beta version release (pre-release) on push to the master branch. + push: + branches: + - use-release-metadata-action # TODO + tags-ignore: + - "**" # Ignore all tags to prevent duplicate builds when tags are pushed. + +jobs: + release_metadata: + name: Prepare release metadata + runs-on: ubuntu-latest + outputs: + version_number: ${{ steps.release_metadata.version_number }} + tag_name: ${{ steps.release_metada.tag_name }} + changelog: ${{ steps.release_metadata.changelog }} + steps: + - uses: apify/workflows/release-metadata@release-metadata-action + id: release_metadata + name: Prepare release metadata + with: + release_type: prerelease + + lint_check: + name: Lint check + uses: apify/workflows/.github/workflows/python_lint_check.yaml@main + + type_check: + name: Type check + uses: apify/workflows/.github/workflows/python_type_check.yaml@main + + unit_tests: + name: Unit tests + uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main + + update_changelog: + name: Update changelog + needs: [release_metadata, lint_check, type_check, unit_tests] + runs-on: ubuntu-latest + outputs: + changelog_commitish: ${{ steps.commit.commit_long_sha || github.sha }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYTHON_VERSION: 3.12 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.APIFY_SERVICE_ACCOUNT_GITHUB_TOKEN }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Install poetry + run: pipx install --python ${{ env.PYTHON_VERSION }} poetry + + - name: Update package version in pyproject.toml + run: poetry version ${{ needs.release_metadata.outputs.version_number }} + + - name: Update CHANGELOG.md + uses: DamianReeves/write-file-action@master + with: + path: CHANGELOG.md + write-mode: overwrite + contents: ${{ needs.release_metadata.outputs.changelog }} + + - name: Commit changes + id: commit + uses: EndBug/add-and-commit@v9 + with: + author_name: Apify Release Bot + author_email: noreply@apify.com + message: "chore(release): Update changelog and package version [skip ci]" + + publish_to_pypi: + name: Publish to PyPI + needs: [release_metadata, update_changelog] + uses: ./.github/workflows/_publish_to_pypi.yaml + with: + package_name: crawlee + version_number: ${{ needs.release_metadata.outputs.version_number }} + is_prerelease: "yes" + + # TODO: add job for publish package to Conda + # https://github.com/apify/crawlee-python/issues/104 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 000000000..be08696e6 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,121 @@ +name: Create a release + +on: + # Trigger a stable version release via GitHub's UI, with the ability to specify the type of release. + workflow_dispatch: + inputs: + release_type: + description: Release type + required: true + type: choice + default: auto + options: + - auto + - custom + - patch + - minor + - major + custom_version: + description: The custom version to bump to (only for "custom" type) + required: false + type: string + default: "" + +jobs: + release_metadata: + name: Prepare release metadata + runs-on: ubuntu-latest + outputs: + version_number: ${{ steps.release_metadata.version_number }} + tag_name: ${{ steps.release_metada.tag_name }} + changelog: ${{ steps.release_metadata.changelog }} + release_notes:: ${{ steps.release_metadata.release_notes }} + if: "!startsWith(github.event.head_commit.message, 'docs') && !startsWith(github.event.head_commit.message, 'ci')" + steps: + - uses: apify/workflows/release-metadata@release-metadata-action + name: Prepare release metadata + id: release_metadata + with: + release_type: ${{ inputs.release_type }} + custom_version: ${{ inputs.custom_version }} + + lint_check: + name: Lint check + uses: apify/workflows/.github/workflows/python_lint_check.yaml@main + + type_check: + name: Type check + uses: apify/workflows/.github/workflows/python_type_check.yaml@main + + unit_tests: + name: Unit tests + uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main + + update_changelog: + name: Update changelog + needs: [release_metadata, lint_check, type_check, unit_tests] + runs-on: ubuntu-latest + outputs: + changelog_commitish: ${{ steps.commit.commit_long_sha || github.sha }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYTHON_VERSION: 3.12 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.APIFY_SERVICE_ACCOUNT_GITHUB_TOKEN }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Install poetry + run: pipx install --python ${{ env.PYTHON_VERSION }} poetry + + - name: Update package version in pyproject.toml + run: poetry version ${{ needs.release_metadata.outputs.version_number }} + + - name: Update CHANGELOG.md + uses: DamianReeves/write-file-action@master + with: + path: CHANGELOG.md + write-mode: overwrite + contents: ${{ needs.release_metadata.outputs.changelog }} + + - name: Commit changes + id: commit + uses: EndBug/add-and-commit@v9 + with: + author_name: Apify Release Bot + author_email: noreply@apify.com + message: "chore(release): Update changelog and package version [skip ci]" + + create_github_release: + name: Create github release + needs: [release_metadata, update_changelog] + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Create release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ needs.release_metadata.outputs.tag_name }} + name: ${{ needs.release_metadata.outputs.version_number }} + target_commitish: ${{ needs.update_changelog.outputs.changelog_commitish }} + body: ${{ needs.release_metadata.outputs.release_notes }} + + publish_to_pypi: + name: Publish to PyPI + needs: [release_metadata, update_changelog] + uses: ./.github/workflows/_publish_to_pypi.yaml + with: + package_name: crawlee + version_number: ${{ needs.release_metadata.outputs.version_number }} + is_prerelease: '' + + # TODO: add job for publish package to Conda + # https://github.com/apify/crawlee-python/issues/104 diff --git a/.github/workflows/run_release.yaml b/.github/workflows/run_release.yaml deleted file mode 100644 index 154616e1a..000000000 --- a/.github/workflows/run_release.yaml +++ /dev/null @@ -1,175 +0,0 @@ -name: Run release - -on: - # Trigger a beta version release (pre-release) on push to the master branch. - push: - branches: - - master - tags-ignore: - - "**" # Ignore all tags to prevent duplicate builds when tags are pushed. - - # Trigger a stable version release via GitHub's UI, with the ability to specify the type of release. - workflow_dispatch: - inputs: - release_type: - description: Release type - required: true - type: choice - default: auto - options: - - auto - - custom - custom_version: - description: The custom version to bump to (only for "custom" type) - required: false - type: string - default: "" - -jobs: - # This job determines if the conditions are met for a release to occur. It will proceed if triggered manually, - # for any published release, or if the commit on push does not begin with "docs" or "chore". - should_release: - name: Check whether to release - if: | - github.event_name == 'workflow_dispatch' || - ( - github.event_name == 'push' && - !startsWith(github.event.head_commit.message, 'docs') && - !startsWith(github.event.head_commit.message, 'ci') - ) - runs-on: ubuntu-latest - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - outputs: - version_number: ${{ steps.version_number.outputs.result }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Locally remove beta tags - run: | - git tag | grep 'b[0-9]' | xargs git tag --delete - - - name: Install git-cliff - run: pip install git-cliff - - - name: Determine version number - id: version_number - run: | - if [[ '${{ github.event_name }}' = workflow_dispatch && '${{ github.event.inputs.release_type }}' = custom ]]; then - echo result=$(echo ${{ github.event.inputs.custom_version }} | sed s/^v//) | tee -a $GITHUB_OUTPUT - else - echo result=$(git-cliff --bumped-version | sed s/^v//) | tee -a $GITHUB_OUTPUT - fi - - lint_check: - name: Lint check - needs: [should_release] - uses: apify/workflows/.github/workflows/python_lint_check.yaml@main - - type_check: - name: Type check - needs: [should_release] - uses: apify/workflows/.github/workflows/python_type_check.yaml@main - - unit_tests: - name: Unit tests - needs: [should_release] - uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main - - update_changelog: - name: Update changelog - needs: [should_release, lint_check, type_check, unit_tests] - runs-on: ubuntu-latest - permissions: - contents: write - id-token: write # Required for OIDC authentication. - outputs: - changelog_commitish: ${{ steps.commit.commit_long_sha || github.sha }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PYTHON_VERSION: 3.12 - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.APIFY_SERVICE_ACCOUNT_GITHUB_TOKEN }} - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ env.PYTHON_VERSION }} - - - name: Locally remove beta tags - run: | - git tag | grep 'b[0-9]' | xargs git tag --delete - - - name: Install git-cliff - run: pip install git-cliff - - - name: Generate changelog with git-cliff - run: | - if [[ ${{ github.event_name }} = workflow_dispatch ]]; then - git-cliff --tag v${{ needs.should_release.outputs.version_number }} > CHANGELOG.md - else - git-cliff --with-tag-message v${{ needs.should_release.outputs.version_number }} > CHANGELOG.md - fi - - - name: Install poetry - run: pipx install --python ${{ env.PYTHON_VERSION }} poetry - - - name: Update package version in pyproject.toml - run: poetry version ${{ needs.should_release.outputs.version_number }} - - - name: Commit changes - id: commit - uses: EndBug/add-and-commit@v9 - with: - author_name: Apify Release Bot - author_email: noreply@apify.com - message: "chore(release): Update changelog and package version [skip ci]" - - create_github_release: - name: Create github release - if: github.event_name == 'workflow_dispatch' - needs: [should_release, lint_check, type_check, unit_tests, update_changelog] - runs-on: ubuntu-latest - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Locally remove beta tags - run: | - git tag | grep 'b[0-9]' | xargs git tag --delete - - - name: Install git-cliff - run: pip install git-cliff - - - name: Generate release notes with git-cliff - run: git-cliff --tag "v${{ needs.should_release.outputs.version_number }}" --unreleased --strip all > release_notes.md - - - name: Create release - uses: softprops/action-gh-release@v2 - with: - tag_name: v${{ needs.should_release.outputs.version_number }} - name: ${{ needs.should_release.outputs.version_number }} - target_commitish: ${{ needs.update_changelog.outputs.changelog_commitish }} - body_path: release_notes.md - - publish_to_pypi: - name: Publish to PyPI - needs: [should_release, lint_check, type_check, unit_tests] - uses: ./.github/workflows/_publish_to_pypi.yaml - with: - version_number: ${{ needs.should_release.outputs.version_number }} - - # TODO: add job for publish package to Conda - # https://github.com/apify/crawlee-python/issues/104