Release to GitHub, PyPI, and Docker #120
This file contains 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
# **what?** | ||
# Release workflow provides the following steps: | ||
# - checkout the given commit; | ||
# - validate version in sources and changelog file for given version; | ||
# - bump the version and generate a changelog if needed; | ||
# - merge all changes to the target branch if needed; | ||
# - run unit and integration tests against given commit; | ||
# - build and package that SHA; | ||
# - release it to GitHub and PyPI with that specific build; | ||
# | ||
# **why?** | ||
# Ensure an automated and tested release process | ||
# | ||
# **when?** | ||
# This workflow can be run manually on demand or can be called by other workflows | ||
name: "Release to GitHub, PyPI, and Docker" | ||
run-name: "Release ${{ inputs.version_number }} to GitHub, PyPI, and Docker" | ||
on: | ||
workflow_dispatch: | ||
inputs: | ||
sha: | ||
description: "The last commit sha in the release" | ||
type: string | ||
required: true | ||
target_branch: | ||
description: "The branch to release from" | ||
type: string | ||
required: true | ||
version_number: | ||
description: "The release version number (i.e. 1.0.0b1)" | ||
type: string | ||
required: true | ||
build_script_path: | ||
description: "Build script path" | ||
type: string | ||
default: "scripts/build-dist.sh" | ||
required: true | ||
env_setup_script_path: | ||
description: "Environment setup script path" | ||
type: string | ||
default: "scripts/env-setup.sh" | ||
required: false | ||
s3_bucket_name: | ||
description: "AWS S3 bucket name" | ||
type: string | ||
default: "core-team-artifacts" | ||
required: true | ||
package_test_command: | ||
description: "Package test command" | ||
type: string | ||
default: "dbt --version" | ||
required: true | ||
test_run: | ||
description: "Test run (Publish release as draft)" | ||
type: boolean | ||
default: true | ||
required: false | ||
nightly_release: | ||
description: "Nightly release to dev environment" | ||
type: boolean | ||
default: false | ||
required: false | ||
only_docker: | ||
description: "Only release Docker image, skip GitHub & PyPI" | ||
type: boolean | ||
default: false | ||
required: false | ||
workflow_call: | ||
inputs: | ||
sha: | ||
description: "The last commit sha in the release" | ||
type: string | ||
required: true | ||
target_branch: | ||
description: "The branch to release from" | ||
type: string | ||
required: true | ||
version_number: | ||
description: "The release version number (i.e. 1.0.0b1)" | ||
type: string | ||
required: true | ||
build_script_path: | ||
description: "Build script path" | ||
type: string | ||
default: "scripts/build-dist.sh" | ||
required: true | ||
env_setup_script_path: | ||
description: "Environment setup script path" | ||
type: string | ||
default: "scripts/env-setup.sh" | ||
required: false | ||
s3_bucket_name: | ||
description: "AWS S3 bucket name" | ||
type: string | ||
default: "core-team-artifacts" | ||
required: true | ||
package_test_command: | ||
description: "Package test command" | ||
type: string | ||
default: "dbt --version" | ||
required: true | ||
test_run: | ||
description: "Test run (Publish release as draft)" | ||
type: boolean | ||
default: true | ||
required: false | ||
nightly_release: | ||
description: "Nightly release to dev environment" | ||
type: boolean | ||
default: false | ||
required: false | ||
permissions: | ||
contents: write # this is the permission that allows creating a new release | ||
defaults: | ||
run: | ||
shell: bash | ||
jobs: | ||
release-prep: | ||
name: "Release prep: generate changelog, bump version" | ||
uses: ./.github/workflows/release_prep_hatch.yml | ||
with: | ||
branch: ${{ inputs.branch }} | ||
version: ${{ inputs.version }} | ||
deploy-to: ${{ inputs.deploy-to }} | ||
secrets: inherit | ||
build-release: | ||
name: "Build release" | ||
needs: release-prep | ||
runs-on: ubuntu-latest | ||
outputs: | ||
archive-name: ${{ steps.archive.outputs.name }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
ref: ${{ needs.release-prep.outputs.release-branch }} | ||
persist-credentials: false | ||
- uses: actions/setup-python@v5 | ||
with: | ||
python-version: ${{ inputs.python_version }} | ||
- uses: pypa/hatch@install | ||
- id: archive | ||
run: | | ||
archive_name=${{ github.event.repository.name }}-${{ inputs.version }}-${{ inputs.deploy-to }} | ||
echo "name=$archive_name" >> $GITHUB_OUTPUT | ||
- run: hatch build && hatch run build:check-all | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
name: ${{ steps.archive.outputs.name }} | ||
path: dist/ | ||
retention-days: 3 | ||
github-release: | ||
name: GitHub Release | ||
if: ${{ !failure() && !cancelled() && !inputs.only_docker }} | ||
needs: [build-release, release-prep] | ||
uses: dbt-labs/dbt-adapters/.github/workflows/github-release.yml@main | ||
Check failure on line 161 in .github/workflows/release.yml
|
||
with: | ||
sha: ${{ needs.bump-version-generate-changelog.outputs.final_sha }} | ||
version_number: ${{ inputs.version_number }} | ||
changelog_path: ${{ needs.bump-version-generate-changelog.outputs.changelog_path }} | ||
test_run: ${{ inputs.test_run }} | ||
archive_name: ${{ needs.build-release.outputs.archive-name }} | ||
pypi-release: | ||
name: PyPI Release | ||
if: ${{ !failure() && !cancelled() && !inputs.only_docker }} | ||
needs: build-release | ||
runs-on: ubuntu-latest | ||
environment: | ||
name: ${{ inputs.deploy-to }} | ||
url: ${{ vars.PYPI_PROJECT_URL }} | ||
permissions: | ||
# this permission is required for trusted publishing | ||
# see https://github.com/marketplace/actions/pypi-publish | ||
id-token: write | ||
steps: | ||
- uses: dbt-labs/dbt-adapters/.github/actions/publish-pypi@main | ||
with: | ||
repository-url: ${{ vars.PYPI_REPOSITORY_URL }} | ||
archive-name: ${{ needs.build-release.outputs.archive-name }} | ||
docker-release: | ||
name: "Docker Release" | ||
# We cannot release to docker on a test run because it uses the tag in GitHub as | ||
# what we need to release but draft releases don't actually tag the commit so it | ||
# finds nothing to release | ||
if: ${{ !failure() && !cancelled() && (!inputs.test_run || inputs.only_docker) }} | ||
needs: github-release | ||
permissions: | ||
packages: write | ||
uses: dbt-labs/dbt-release/.github/workflows/release-docker.yml@main | ||
with: | ||
version_number: ${{ inputs.version_number }} | ||
test_run: ${{ inputs.test_run }} | ||
slack-notification: | ||
name: Slack Notification | ||
if: ${{ failure() && (!inputs.test_run || inputs.nightly_release) }} | ||
needs: | ||
[ | ||
github-release, | ||
pypi-release, | ||
docker-release, | ||
] | ||
uses: dbt-labs/dbt-release/.github/workflows/slack-post-notification.yml@main | ||
with: | ||
status: "failure" | ||
secrets: | ||
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_DEV_ADAPTER_ALERTS }} |