浏览代码

ci: delete release if e2e tests fail

Nicolas Meienberger 1 年之前
父节点
当前提交
35bdfee701
共有 3 个文件被更改,包括 186 次插入33 次删除
  1. 39 18
      .github/workflows/beta-release.yml
  2. 7 0
      .github/workflows/e2e.yml
  3. 140 15
      .github/workflows/release.yml

+ 39 - 18
.github/workflows/beta-release.yml

@@ -8,28 +8,28 @@ on:
         required: true
 
 jobs:
-  create-tag:
+  get-tag:
     runs-on: ubuntu-latest
     outputs:
-      tagname: ${{ steps.create_tag.outputs.tagname }}
-
+      tag: ${{ steps.get_tag.outputs.tag }}
     steps:
       - name: Checkout code
         uses: actions/checkout@v3
 
-      - name: Create Tag
-        id: create_tag
-        uses: butlerlogic/action-autotag@stable
-        env:
-          GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
+      - name: Install Node.js
+        uses: actions/setup-node@v3
         with:
-          tag_prefix: 'v'
-          tag_suffix: '-beta.${{ github.event.inputs.tag }}'
+          node-version: 18
+
+      - name: Get tag from VERSION file
+        id: get_tag
+        run: |
+          VERSION=$(npm run version --silent)
+          echo "tag=v${VERSION}-beta.${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT
 
   build-images:
+    needs: get-tag
     runs-on: ubuntu-latest
-    needs: create-tag
-
     steps:
       - name: Checkout code
         uses: actions/checkout@v3
@@ -52,14 +52,13 @@ jobs:
           context: .
           platforms: linux/amd64,linux/arm64
           push: true
-          tags: meienberger/runtipi:${{ needs.create-tag.outputs.tagname }}
+          tags: meienberger/runtipi:${{ needs.get-tag.outputs.tag }}
           cache-from: type=registry,ref=meienberger/runtipi:buildcache
           cache-to: type=registry,ref=meienberger/runtipi:buildcache,mode=max
 
   build-cli:
     runs-on: ubuntu-latest
-    needs: create-tag
-
+    needs: get-tag
     steps:
       - name: Checkout code
         uses: actions/checkout@v3
@@ -93,7 +92,7 @@ jobs:
         run: pnpm install
 
       - name: Set version
-        run: pnpm -r --filter cli set-version ${{ needs.create-tag.outputs.tagname }}
+        run: pnpm -r --filter cli set-version ${{ needs.get-tag.outputs.tag }}
 
       - name: Build CLI
         run: pnpm -r --filter cli package
@@ -104,10 +103,30 @@ jobs:
           name: cli
           path: packages/cli/dist
 
+  create-tag:
+    needs: [build-images, build-cli]
+    runs-on: ubuntu-latest
+    outputs:
+      tagname: ${{ steps.create_tag.outputs.tagname }}
+
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v3
+
+      - name: Create Tag
+        id: create_tag
+        uses: butlerlogic/action-autotag@stable
+        env:
+          GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
+        with:
+          tag_prefix: 'v'
+          tag_suffix: '-beta.${{ github.event.inputs.tag }}'
+
   publish-release:
     runs-on: ubuntu-latest
     needs: [create-tag, build-images, build-cli]
-
+    outputs:
+      id: ${{ steps.create_release.outputs.id }}
     steps:
       - name: Download CLI
         uses: actions/download-artifact@v2
@@ -121,6 +140,8 @@ jobs:
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         with:
+          body: |
+            **${{ needs.create-tag.outputs.tagname }}**
           tag_name: ${{ needs.create-tag.outputs.tagname }}
           release_name: ${{ needs.create-tag.outputs.tagname }}
           draft: false
@@ -147,7 +168,7 @@ jobs:
           asset_content_type: application/octet-stream
 
   e2e-tests:
-    needs: [create-tag, build-images, build-cli, publish-release]
+    needs: [create-tag, publish-release]
     uses: './.github/workflows/e2e.yml'
     secrets: inherit
     with:

+ 7 - 0
.github/workflows/e2e.yml

@@ -7,6 +7,10 @@ on:
         required: true
         type: string
         description: 'Version to test (e.g. v1.6.0-beta.1)'
+    outputs:
+      page_url:
+        description: 'URL of the deployed report'
+        value: ${{ jobs.report-deployment.outputs.page_url }}
   workflow_dispatch:
     inputs:
       version:
@@ -144,6 +148,7 @@ jobs:
         run: npx playwright install --with-deps
 
       - name: Run Playwright tests
+        id: run-e2e
         run: npm run test:e2e
 
       - uses: actions/upload-artifact@v3
@@ -156,6 +161,8 @@ jobs:
   report-deployment:
     runs-on: ubuntu-latest
     needs: [e2e]
+    outputs:
+      page_url: ${{ steps.deployment.outputs.page_url }}
     permissions:
       pages: write # to deploy to Pages
       id-token: write # to verify the deployment originates from an appropriate source

+ 140 - 15
.github/workflows/release.yml

@@ -3,8 +3,28 @@ on:
   workflow_dispatch:
 
 jobs:
-  release:
+  get-tag:
+    runs-on: ubuntu-latest
+    outputs:
+      tag: ${{ steps.get_tag.outputs.tag }}
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v3
+
+      - name: Install Node.js
+        uses: actions/setup-node@v3
+        with:
+          node-version: 18
+
+      - name: Get tag from VERSION file
+        id: get_tag
+        run: |
+          VERSION=$(npm run version --silent)
+          echo "tag=v${VERSION}" >> $GITHUB_OUTPUT
+
+  build-images:
     if: github.repository == 'meienberger/runtipi'
+    needs: get-tag
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
@@ -22,23 +42,69 @@ jobs:
           username: ${{ secrets.DOCKERHUB_USERNAME }}
           password: ${{ secrets.DOCKERHUB_TOKEN }}
 
-      - name: Get tag from VERSION file
-        id: meta
-        run: |
-          VERSION=$(npm run version --silent)
-          TAG=${VERSION}
-          echo "tag=${TAG}" >> $GITHUB_OUTPUT
-
       - name: Build and push images
         uses: docker/build-push-action@v4
         with:
           context: .
           platforms: linux/amd64,linux/arm64
           push: true
-          tags: meienberger/runtipi:latest,meienberger/runtipi:${{ steps.meta.outputs.TAG }}
+          tags: meienberger/runtipi:latest,meienberger/runtipi:${{ needs.get-tag.outputs.tag }}
           cache-from: type=registry,ref=meienberger/runtipi:buildcache
           cache-to: type=registry,ref=meienberger/runtipi:buildcache,mode=max
 
+  build-cli:
+    runs-on: ubuntu-latest
+    needs: get-tag
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v3
+
+      - name: Install Node.js
+        uses: actions/setup-node@v3
+        with:
+          node-version: 18
+
+      - uses: pnpm/action-setup@v2.2.4
+        name: Install pnpm
+        id: pnpm-install
+        with:
+          version: 8
+          run_install: false
+
+      - name: Get pnpm store directory
+        id: pnpm-cache
+        run: |
+          echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+      - uses: actions/cache@v3
+        name: Setup pnpm cache
+        with:
+          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
+          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+          restore-keys: |
+            ${{ runner.os }}-pnpm-store-
+
+      - name: Install dependencies
+        run: pnpm install
+
+      - name: Set version
+        run: pnpm -r --filter cli set-version ${{ needs.get-tag.outputs.tag }}
+
+      - name: Build CLI
+        run: pnpm -r --filter cli package
+
+      - name: Upload CLI
+        uses: actions/upload-artifact@v2
+        with:
+          name: cli
+          path: packages/cli/dist
+
+  create-tag:
+    runs-on: ubuntu-latest
+    needs: [build-images, build-cli]
+    outputs:
+      tagname: ${{ steps.create_tag.outputs.tagname }}
+    steps:
       - name: Create Tag
         id: create_tag
         uses: butlerlogic/action-autotag@stable
@@ -47,14 +113,73 @@ jobs:
         with:
           tag_prefix: 'v'
 
-      - name: Create Release
+  publish-release:
+    runs-on: ubuntu-latest
+    needs: [create-tag]
+    outputs:
+      id: ${{ steps.create_release.outputs.id }}
+    steps:
+      - name: Download CLI
+        uses: actions/download-artifact@v2
+        with:
+          name: cli
+          path: cli
+
+      - name: Create beta release
         id: create_release
-        uses: actions/create-release@latest
-        if: steps.create_tag.outputs.tagcreated == 'yes'
+        uses: actions/create-release@v1
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         with:
-          tag_name: ${{ steps.create_tag.outputs.tagname }}
-          release_name: ${{ steps.create_tag.outputs.tagname }}
+          body: |
+            **${{ needs.create-tag.outputs.tagname }}**
+          tag_name: ${{ needs.create-tag.outputs.tagname }}
+          release_name: ${{ needs.create-tag.outputs.tagname }}
           draft: false
-          prerelease: false
+          prerelease: true
+
+      - name: Upload X64 Linux CLI binary to release
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: cli/bin/cli-x64
+          asset_name: runtipi-cli-linux-x64
+          asset_content_type: application/octet-stream
+
+      - name: Upload ARM64 Linux CLI binary to release
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: cli/bin/cli-arm64
+          asset_name: runtipi-cli-linux-arm64
+          asset_content_type: application/octet-stream
+
+  e2e-tests:
+    needs: [create-tag, publish-release]
+    uses: './.github/workflows/e2e.yml'
+    secrets: inherit
+    with:
+      version: ${{ needs.create-tag.outputs.tagname }}
+
+  # Promote release if e2e tests succeed
+  promote:
+    needs: [publish-release, e2e-tests]
+    runs-on: ubuntu-latest
+    steps:
+      - name: Promote release
+        uses: actions/github-script@v4
+        with:
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+          script: |
+            const id = '${{ needs.publish-release.outputs.id }}';
+            github.repos.updateRelease({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              release_id: id,
+              draft: false,
+              prerelease: false
+            });