diff --git a/.github/workflows/web-release.yml b/.github/workflows/web-release.yml new file mode 100644 index 000000000..4dedff923 --- /dev/null +++ b/.github/workflows/web-release.yml @@ -0,0 +1,79 @@ +name: create web release +on: + workflow_dispatch: + inputs: + version: + description: 'Version number for the release (x.x.x)' + required: true + type: string + +jobs: + run-tests: + uses: ./.github/workflows/web-tests.yml + + build-and-release: + needs: run-tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set release name + run: echo "RELEASE_NAME=capa-explorer-web-v${{ github.event.inputs.version }}-${GITHUB_SHA::7}" >> $GITHUB_ENV + + - name: Check if release already exists + run: | + if ls web/explorer/releases/capa-explorer-web-v${{ github.event.inputs.version }}-* 1> /dev/null 2>&1; then + echo "::error:: A release with version ${{ github.event.inputs.version }} already exists" + exit 1 + fi + + - name: Set up Node.js + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 + with: + node-version: 20 + cache: 'npm' + cache-dependency-path: 'web/explorer/package-lock.json' + + - name: Install dependencies + run: npm ci + working-directory: web/explorer + + - name: Build offline bundle + run: npm run build:bundle + working-directory: web/explorer + + - name: Compress bundle + run: zip -r ${{ env.RELEASE_NAME }}.zip capa-explorer-web + working-directory: web/explorer + + - name: Create releases directory + run: mkdir -vp web/explorer/releases + + - name: Move release to releases folder + run: mv web/explorer/${{ env.RELEASE_NAME }}.zip web/explorer/releases + + - name: Compute release SHA256 hash + run: | + echo "RELEASE_SHA256=$(sha256sum web/explorer/releases/${{ env.RELEASE_NAME }}.zip | awk '{print $1}')" >> $GITHUB_ENV + + - name: Update CHANGELOG.md + run: | + echo "## ${{ env.RELEASE_NAME }}" >> web/explorer/releases/CHANGELOG.md + echo "- Release Date: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> web/explorer/releases/CHANGELOG.md + echo "- SHA256: ${{ env.RELEASE_SHA256 }}" >> web/explorer/releases/CHANGELOG.md + echo "" >> web/explorer/releases/CHANGELOG.md + cat web/explorer/releases/CHANGELOG.md + + - name: Remove older releases + # keep only the latest 3 releases + run: ls -t capa-explorer-web-v*.zip | tail -n +4 | xargs -r rm -- + working-directory: web/explorer/releases + + - name: Commit and push release + run: | + git config --local user.email "capa-dev@mandiant.com" + git config --local user.name "Capa Bot" + git add -f web/explorer/releases/${{ env.RELEASE_NAME }}.zip web/explorer/releases/CHANGELOG.md + git add -u web/explorer/releases/ + git commit -m ":robot: explorer web: add release ${{ env.RELEASE_NAME }}" + git push diff --git a/.github/workflows/web-tests.yml b/.github/workflows/web-tests.yml index 8a8a63312..22016a3a5 100644 --- a/.github/workflows/web-tests.yml +++ b/.github/workflows/web-tests.yml @@ -1,10 +1,11 @@ -name: Capa Explorer Web tests +name: capa Explorer Web tests on: pull_request: branches: [ master ] paths: - 'web/explorer/**' + workflow_call: # this allows the workflow to be called by other workflows jobs: test: @@ -23,20 +24,20 @@ jobs: with: node-version: 20 cache: 'npm' - cache-dependency-path: './web/explorer/package-lock.json' + cache-dependency-path: 'web/explorer/package-lock.json' - name: Install dependencies run: npm ci - working-directory: ./web/explorer + working-directory: web/explorer - name: Lint run: npm run lint - working-directory: ./web/explorer + working-directory: web/explorer - name: Format run: npm run format:check - working-directory: ./web/explorer + working-directory: web/explorer - name: Run unit tests run: npm run test - working-directory: ./web/explorer + working-directory: web/explorer diff --git a/CHANGELOG.md b/CHANGELOG.md index 54fcd9e1f..74586ab84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -183,6 +183,7 @@ Special thanks to our repeat and new contributors: - CI: update Binary Ninja version to 4.1 and use Python 3.9 to test it #2211 @xusheng6 - CI: update tests.yml workflow to exclude web and documentation files #2263 @s-ff - CI: update build.yml workflow to exclude web and documentation files #2270 @s-ff +- CI: add web releases workflow #2455 @s-ff ### Raw diffs diff --git a/web/explorer/.gitignore b/web/explorer/.gitignore index 064b5fed8..c734baff7 100644 --- a/web/explorer/.gitignore +++ b/web/explorer/.gitignore @@ -7,6 +7,9 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* +# capa Explorer Web Releases +releases/ + # Dependencies, build results, and other generated files node_modules .DS_Store