diff --git a/.github/pr-welcome-community.md b/.github/pr-welcome-community.md index 1591a0e41..951fd90da 100644 --- a/.github/pr-welcome-community.md +++ b/.github/pr-welcome-community.md @@ -27,5 +27,6 @@ As needed or by request, Airbyte Maintainers can execute the following slash com - `/autofix` - Fixes most formatting and linting issues - `/poetry-lock` - Updates poetry.lock file - `/test` - Runs connector tests with the updated CDK +- `/prerelease` - Triggers a prerelease publish with default arguments If you have any questions, feel free to ask in the PR comments or join our [Slack community](https://airbytehq.slack.com/). diff --git a/.github/pr-welcome-internal.md b/.github/pr-welcome-internal.md index 0f4aa6e2c..27d1adeeb 100644 --- a/.github/pr-welcome-internal.md +++ b/.github/pr-welcome-internal.md @@ -26,6 +26,7 @@ Airbyte Maintainers can execute the following slash commands on your PR: - `/autofix` - Fixes most formatting and linting issues - `/poetry-lock` - Updates poetry.lock file - `/test` - Runs connector tests with the updated CDK +- `/prerelease` - Triggers a prerelease publish with default arguments - `/poe build` - Regenerate git-committed build artifacts, such as the pydantic models which are generated from the manifest JSON schema in YAML. - `/poe ` - Runs any poe command in the CDK environment diff --git a/.github/workflows/prerelease-command.yml b/.github/workflows/prerelease-command.yml new file mode 100644 index 000000000..e6048cb71 --- /dev/null +++ b/.github/workflows/prerelease-command.yml @@ -0,0 +1,116 @@ +name: On-Demand Prerelease + +# Minimal permissions for security (addresses GitHub Advanced Security feedback) +permissions: + contents: read + pull-requests: write + issues: write + +on: + workflow_dispatch: + inputs: + pr: + description: "PR Number" + type: string + required: false + comment-id: + description: "Comment ID (Optional)" + type: string + required: false + +jobs: + prerelease-on-demand: + name: Trigger Prerelease Publish + runs-on: ubuntu-24.04 + steps: + - name: Authenticate as GitHub App + uses: actions/create-github-app-token@v2 + id: get-app-token + with: + owner: "airbytehq" + repositories: "airbyte-python-cdk" + app-id: ${{ secrets.OCTAVIA_BOT_APP_ID }} + private-key: ${{ secrets.OCTAVIA_BOT_PRIVATE_KEY }} + + - name: Create URL to the run output + id: vars + run: echo "run-url=https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" >> $GITHUB_OUTPUT + + - name: Check that PR number is provided + if: github.event.inputs.pr == '' + run: | + echo "Error: /prerelease command must be invoked on a pull request, not an issue." + exit 1 + + - name: Get PR info + id: pr-info + run: | + PR_JSON=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.inputs.pr }}) + HEAD_REF=$(echo "$PR_JSON" | jq -r .head.ref) + HEAD_REPO=$(echo "$PR_JSON" | jq -r .head.repo.full_name) + echo "head-ref=${HEAD_REF}" >> $GITHUB_OUTPUT + echo "head-repo=${HEAD_REPO}" >> $GITHUB_OUTPUT + echo "PR branch: ${HEAD_REF} from ${HEAD_REPO}" + env: + GH_TOKEN: ${{ steps.get-app-token.outputs.token }} + + - name: Check that PR is from this repository (not a fork) + if: steps.pr-info.outputs.head-repo != github.repository + run: | + echo "Error: /prerelease only works for branches in this repository, not forks." + echo "PR is from: ${{ steps.pr-info.outputs.head-repo }}" + echo "Expected: ${{ github.repository }}" + exit 1 + + - name: Append comment with job run link + if: github.event.inputs.comment-id + id: first-comment-action + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ github.event.inputs.comment-id }} + issue-number: ${{ github.event.inputs.pr }} + body: | + > **Prerelease Job Info** + > + > This job triggers the publish workflow with default arguments to create a prerelease. + > + > Prerelease job started... [Check job output.][1] + + [1]: ${{ steps.vars.outputs.run-url }} + + - name: Trigger publish workflow + id: trigger-publish + uses: the-actions-org/workflow-dispatch@v4 + with: + workflow: publish.yml + token: ${{ steps.get-app-token.outputs.token }} + ref: ${{ steps.pr-info.outputs.head-ref }} + wait-for-completion: true + display-workflow-run-url: false + inputs: >- + { + "publish_to_pypi": "true", + "publish_to_dockerhub": "true", + "publish_manifest_server": "false", + "update_connector_builder": "false" + } + + - name: Append success comment + if: github.event.inputs.comment-id + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.first-comment-action.outputs.comment-id }} + reactions: hooray + body: | + > ✅ Prerelease workflow triggered successfully. + > + > View the publish workflow run: ${{ steps.trigger-publish.outputs.workflow-url }} + + - name: Append failure comment + if: failure() && github.event.inputs.comment-id + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.first-comment-action.outputs.comment-id }} + reactions: confused + body: | + > ❌ Failed to trigger prerelease workflow. diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 81f67efb5..31e22c6c7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,8 +20,10 @@ on: Note that this workflow is intended for prereleases. For public-facing stable releases, please use the GitHub Releases workflow instead: https://github.com/airbytehq/airbyte-python-cdk/blob/main/docs/RELEASES.md. - For prereleases, please leave the version blank to use the detected version. Alternatively, - you can override the dynamic versioning for special use cases. + For prereleases, you can use the /prerelease slash command in a PR comment to trigger + this workflow with default arguments. Alternatively, you can manually trigger this workflow + and leave the version blank to use the detected version, or override the dynamic versioning + for special use cases. required: false publish_to_pypi: description: "Publish to PyPI. If true, the workflow will publish to PyPI." diff --git a/.github/workflows/slash_command_dispatch.yml b/.github/workflows/slash_command_dispatch.yml index b42d61e64..1af77a5a8 100644 --- a/.github/workflows/slash_command_dispatch.yml +++ b/.github/workflows/slash_command_dispatch.yml @@ -35,6 +35,7 @@ jobs: test poetry-lock poe + prerelease # Notes regarding static-args: # - Slash commands can be invoked from both issues and comments. @@ -63,6 +64,7 @@ jobs: - \`/autofix\` - Corrects any linting or formatting issues - \`/test\` - Runs the test suite - \`/poetry-lock\` - Re-locks dependencies and updates the poetry.lock file + - \`/prerelease\` - Triggers a prerelease publish with default arguments - \`/help\` - Shows this help message" if [[ "${{ github.event.comment.body }}" == "/help" ]]; then