# Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. name: GitHub Release # Runs when a new tag is created that looks like a version number. # # 1. Creates a draft release on GitHub with the latest release notes # 2. On all combinations of OS, build type, and library type: # a. builds Packager # b. builds the docs # c. runs all tests # d. attaches build artifacts to the release # 3. Fully publishes the release on GitHub # # Publishing the release then triggers additional workflows for NPM, Docker # Hub, and GitHub Pages. # # Can also be run manually for debugging purposes. on: push: tags: - "v*.*" # For manual debugging: workflow_dispatch: inputs: tag: description: "An existing tag to release." required: True jobs: # TODO(joeyparrish): Switch to release-please setup: name: Setup runs-on: ubuntu-latest outputs: tag: ${{ steps.compute_tag.outputs.tag }} steps: - name: Compute tag id: compute_tag # We could be building from a workflow dispatch (manual run) # or from a pushed tag. If triggered from a pushed tag, we would like # to strip refs/tags/ off of the incoming ref and just use the tag # name. Subsequent jobs can refer to the "tag" output of this job to # determine the correct tag name in all cases. run: | # Strip refs/tags/ from the input to get the tag name, then store # that in output. echo "::set-output name=tag::${{ github.event.inputs.tag || github.ref }}" \ | sed -e 's@refs/tags/@@' # TODO(joeyparrish): Switch to release-please draft_release: name: Create GitHub release needs: setup runs-on: ubuntu-latest outputs: release_id: ${{ steps.draft_release.outputs.id }} steps: - name: Checkout code uses: actions/checkout@v2 with: ref: ${{ needs.setup.outputs.tag }} - name: Check changelog version # This check prevents releases without appropriate changelog updates. run: | VERSION=$(packager/tools/extract_from_changelog.py --version) if [[ "$VERSION" != "${{ needs.setup.outputs.tag }}" ]]; then echo "" echo "" echo "***** ***** *****" echo "" echo "Version mismatch!" echo "Workflow is targetting ${{ needs.setup.outputs.tag }}," echo "but CHANGELOG.md contains $VERSION!" exit 1 fi - name: Extract release notes run: | packager/tools/extract_from_changelog.py --release_notes \ | tee ../RELEASE_NOTES.md - name: Draft release id: draft_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ needs.setup.outputs.tag }} release_name: ${{ needs.setup.outputs.tag }} body_path: RELEASE_NOTES.md draft: true lint: needs: setup name: Lint uses: ./.github/workflows/lint.yaml with: ref: ${{ needs.setup.outputs.tag }} build_and_test: needs: [setup, lint, draft_release] name: Build and test uses: ./.github/workflows/build.yaml with: ref: ${{ needs.setup.outputs.tag }} test_supported_linux_distros: # Doesn't really "need" it, but let's not waste time on a series of docker # builds just to cancel it because of a linter error. needs: lint name: Test Linux distros uses: ./.github/workflows/test-linux-distros.yaml with: ref: ${{ needs.setup.outputs.tag }} # TODO(joeyparrish): Switch to release-please publish_release: name: Publish GitHub release needs: [draft_release, build_and_test] runs-on: ubuntu-latest steps: - name: Publish release uses: eregon/publish-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: release_id: ${{ needs.draft_release.outputs.release_id }}