From 4addfc58b165d5d7b822c821155cedd7e6a7f43a Mon Sep 17 00:00:00 2001 From: Jon Smock Date: Thu, 21 Nov 2024 18:12:54 +0000 Subject: [PATCH] Publish releases from GHA Automatically publish releases to NPM and Docker Hub from GHA. Only performs a release, when: - all tests pass on all supported platforms - a new git tag is pushed (expected format "v1.0.0") - git tag matches the version in package.json The gating of releases happens in the 'check-release' job, which all future release-* jobs depend on. This is where any final linting or sanity checking can be done. --- .github/workflows/push.yaml | 76 +++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index 7e77ed7..f1e8998 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -53,3 +53,79 @@ jobs: env: DCTEST_IMAGE: dctest run: ./test/runexamples + + # Decide if a release is necessary, do any release linting/checks + check-release: + needs: [ test-node, test-docker ] + name: Check Release + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') && contains(github.ref, '.') + outputs: + RELEASE_VERSION: ${{ steps.get-version.outputs.RELEASE_VERSION }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: { submodules: 'recursive', fetch-depth: 0 } + + - id: get-version + name: Get release version + run: | + echo "RELEASE_VERSION=$(jq -r .version package.json)" | tee "$GITHUB_ENV" | tee "$GITHUB_OUTPUT" + + - name: Check git tag matches release version + run: | + [ "refs/tags/v${RELEASE_VERSION}" == "${{ github.ref }}" ] + + release-npm: + needs: [ check-release ] + name: Release NPM + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: { submodules: 'recursive', fetch-depth: 0 } + + # Setup .npmrc file to publish to npm + - uses: actions/setup-node@v4 + with: + node-version: '20.x' + registry-url: 'https://registry.npmjs.org' + scope: '@lonocloud' + + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + release-docker-hub: + needs: [ check-release ] + name: Release Docker Hub + runs-on: ubuntu-latest + env: + RELEASE_VERSION: ${{ needs.check-release.outputs.RELEASE_VERSION }} + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Checkout Repository + uses: actions/checkout@v4 + with: { submodules: 'recursive', fetch-depth: 0 } + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + push: true + tags: lonocloud/dctest:${{ env.RELEASE_VERSION }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + push: true + tags: lonocloud/dctest:latest