From 227e2e9fe0a7da442b88c5ca920cc76e5a0d1f44 Mon Sep 17 00:00:00 2001 From: Darion Haase Date: Wed, 15 May 2024 18:07:48 +0200 Subject: [PATCH] [CI] Configure build/publishing of VSCode extension Also restructured workflow files. Unfortunately, GitHub Workflows cannot be placed into subfolders. As a workaround I use - as a separator --- ...ease.yml => build-binaries-gh_release.yml} | 54 ++------------- ...er_image.yml => build-docker-registry.yml} | 0 .github/workflows/build-vsix-gh_release.yml | 55 ++++++++++++++++ .github/workflows/build-vsix-marketplaces.yml | 51 +++++++++++++++ .github/workflows/create_nightly_release.yml | 54 +++++++++++++++ .github/workflows/create_tagged_release.yml | 30 +++++++++ .github/workflows/nightly_release.yml | 36 ---------- .../workflows/on_tagged_release_publish.yml | 21 ++++++ .github/workflows/setup_gh_release.yml | 65 +++++++++++++++++++ .github/workflows/tagged_release.yml | 14 ---- .../tagged_release_publish_docker.yml | 15 ----- vscode-ext/package.json | 6 +- 12 files changed, 287 insertions(+), 114 deletions(-) rename .github/workflows/{create_release.yml => build-binaries-gh_release.yml} (72%) rename .github/workflows/{create_docker_image.yml => build-docker-registry.yml} (100%) create mode 100644 .github/workflows/build-vsix-gh_release.yml create mode 100644 .github/workflows/build-vsix-marketplaces.yml create mode 100644 .github/workflows/create_nightly_release.yml create mode 100644 .github/workflows/create_tagged_release.yml delete mode 100644 .github/workflows/nightly_release.yml create mode 100644 .github/workflows/on_tagged_release_publish.yml create mode 100644 .github/workflows/setup_gh_release.yml delete mode 100644 .github/workflows/tagged_release.yml delete mode 100644 .github/workflows/tagged_release_publish_docker.yml diff --git a/.github/workflows/create_release.yml b/.github/workflows/build-binaries-gh_release.yml similarity index 72% rename from .github/workflows/create_release.yml rename to .github/workflows/build-binaries-gh_release.yml index 5401f6a..55d8648 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/build-binaries-gh_release.yml @@ -1,8 +1,8 @@ -# Create a release for a given Git ref. +# Build binaries for a given Git ref. # Based on: # - https://github.com/BurntSushi/ripgrep/blob/d922b7ac114c24d6800ae5f79d2967481f380c83/.github/workflows/release.yml # - https://github.com/dafny-lang/dafny/blob/beab582113744ea72e2727d934f5a03d42c4ba17/.github/workflows/publish-release-reusable.yml -name: Create Release +name: Build Binaries on: workflow_call: @@ -10,56 +10,16 @@ on: git_ref: required: true type: string + version: + required: true + type: string is_prerelease: required: true type: boolean -jobs: - # The create-release job runs purely to initialize the GitHub release itself, - # and names the release after the provided Git ref (e.g. tag). It's separate - # from building the release so that we only create the release once. - create-release: - name: create-release - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: ${{ inputs.git_ref }} - - - name: Get the release version from the tag - if: env.VERSION == '' - run: echo "VERSION=${{ inputs.git_ref }}" >> $GITHUB_ENV - - - name: Show the version - run: | - echo "version is: $VERSION" - - - name: Check that tag version and Cargo.toml version are the same - if: ${{ !inputs.is_prerelease }} - shell: bash - # Remove leading v from semantic versioning tag v.. - run: | - VERSION_WITHOUT_V=${VERSION#v} - if ! grep -q "version = \"${VERSION_WITHOUT_V}\"" Cargo.toml; then - echo "version ${VERSION_WITHOUT_V} does not match Cargo.toml" >&2 - exit 1 - fi - - - name: Create Release - uses: softprops/action-gh-release@v2 - with: - name: ${{ env.VERSION }} - tag_name: ${{ inputs.git_ref }} - draft: ${{ !inputs.is_prerelease }} - prerelease: ${{ inputs.is_prerelease }} - generate_release_notes: ${{ inputs.is_prerelease }} - - outputs: - version: ${{ env.VERSION }} +jobs: build-release: name: build-release - needs: ['create-release'] runs-on: ${{ matrix.os }} env: # For some builds, we use cross to test on 32-bit and big-endian @@ -160,7 +120,7 @@ jobs: - name: Determine archive name shell: bash run: | - version="${{ needs.create-release.outputs.version }}" + version="${{ inputs.version }}" echo "ARCHIVE=caesar-$version-${{ matrix.target }}" >> $GITHUB_ENV - name: Creating directory for archive diff --git a/.github/workflows/create_docker_image.yml b/.github/workflows/build-docker-registry.yml similarity index 100% rename from .github/workflows/create_docker_image.yml rename to .github/workflows/build-docker-registry.yml diff --git a/.github/workflows/build-vsix-gh_release.yml b/.github/workflows/build-vsix-gh_release.yml new file mode 100644 index 0000000..dba0fb0 --- /dev/null +++ b/.github/workflows/build-vsix-gh_release.yml @@ -0,0 +1,55 @@ +# Build a VSIX bundle for the VScode extension and add it to GitHub release +name: Build VSIX + +on: + workflow_call: + inputs: + git_ref: + required: true + type: string + version: + required: true + type: string + is_prerelease: + required: true + type: boolean + +env: + EXTENSION_DIRECTORY: ./vscode-ext + +jobs: + build-vsix: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ inputs.git_ref }} + + - name: Install Node.js + uses: actions/setup-node@v4 + + - name: Install NPM dependencies + working-directory: ${{ env.EXTENSION_DIRECTORY }} + run: npm install + + - name: Set npm flags (for pre-release) + if: ${{ inputs.is_prerelease }} + shell: bash + run: | + echo "NPM_EXTRA_FLAGS=--pre-release" >> $GITHUB_ENV + + - name: Package the extension + working-directory: ${{ env.EXTENSION_DIRECTORY }} + run: npm run package -- --out caesar-${{ inputs.version }}.vsix $NPM_EXTRA_FLAGS + + - name: Upload Release Files + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.git_ref }} + # Also need to specify 'draft' again, so that the action finds the correct existing (draft) release + draft: ${{ !inputs.is_prerelease }} + files: | + ${{env.EXTENSION_DIRECTORY}}/caesar-${{ inputs.version }}.vsix + \ No newline at end of file diff --git a/.github/workflows/build-vsix-marketplaces.yml b/.github/workflows/build-vsix-marketplaces.yml new file mode 100644 index 0000000..dccf585 --- /dev/null +++ b/.github/workflows/build-vsix-marketplaces.yml @@ -0,0 +1,51 @@ +# Build and publish VSIX bundle of the VScode extension to marketplaces +name: Publish VSIX to Marketplaces + +on: + workflow_call: + inputs: + git_ref: + required: true + type: string + version: + required: true + type: string + +env: + EXTENSION_DIRECTORY: ./vscode-ext + +jobs: + publish-vsix: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ inputs.git_ref }} + + - name: Install Node.js + uses: actions/setup-node@v4 + + - name: Install NPM dependencies + working-directory: ${{ env.EXTENSION_DIRECTORY }} + run: npm install + + - name: Package the extension + working-directory: ${{ env.EXTENSION_DIRECTORY }} + run: npm run package -- --out caesar-${{ inputs.version }}.vsix + + - name: Publish the extension (Visual Studio Marketplace) + uses: HaaLeo/publish-vscode-extension@v1 + with: + registryUrl: https://marketplace.visualstudio.com + pat: ${{ secrets.VSCE_PAT }} + extensionFile: ${{env.EXTENSION_DIRECTORY}}/caesar-${{ inputs.version }}.vsix + + - name: Publish the extension (Open VSX Registry) + uses: HaaLeo/publish-vscode-extension@v1 + with: + registryUrl: https://open-vsx.org + pat: ${{ secrets.OPEN_VSX_PAT }} + extensionFile: ${{env.EXTENSION_DIRECTORY}}/caesar-${{ inputs.version }}.vsix + \ No newline at end of file diff --git a/.github/workflows/create_nightly_release.yml b/.github/workflows/create_nightly_release.yml new file mode 100644 index 0000000..8493721 --- /dev/null +++ b/.github/workflows/create_nightly_release.yml @@ -0,0 +1,54 @@ +name: Nightly release (on change to main branch) +on: + push: + branches: + - main + +env: + # Name of the tag to mark current nightly build + NIGHTLY_TAG: nightly + +jobs: + create-nightly-tag: + name: create-nightly-tag + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Ensure tag exists + run: | + git tag ${{ env.NIGHTLY_TAG }} -f + git push origin ${{ env.NIGHTLY_TAG }} -f + outputs: + tag: ${{ env.NIGHTLY_TAG }} + + prepare-release: + needs: create-nightly-tag + uses: ./.github/workflows/setup_gh_release.yml + with: + git_ref: ${{ needs.create-nightly-tag.outputs.tag }} + is_prerelease: true + + build-binaries: + needs: [create-nightly-tag, prepare-release] + uses: ./.github/workflows/build-binaries-gh_release.yml + with: + git_ref: ${{ needs.create-nightly-tag.outputs.tag }} + version: ${{ needs.prepare-release.outputs.version }} + is_prerelease: true + + build-vsix: + needs: [create-nightly-tag, prepare-release] + uses: ./.github/workflows/build-vsix-gh_release.yml + with: + git_ref: ${{ needs.create-nightly-tag.outputs.tag }} + version: ${{ needs.prepare-release.outputs.version }} + is_prerelease: true + + publish-docker-image: + needs: [create-nightly-tag, prepare-release] + uses: ./.github/workflows/build-docker-registry.yml + with: + git_ref: ${{ needs.create-nightly-tag.outputs.tag }} + image_tags: | + type=raw,value=${{ needs.create-nightly-tag.outputs.tag }} diff --git a/.github/workflows/create_tagged_release.yml b/.github/workflows/create_tagged_release.yml new file mode 100644 index 0000000..1572c12 --- /dev/null +++ b/.github/workflows/create_tagged_release.yml @@ -0,0 +1,30 @@ +name: Tagged version release + +# Only do the release on semantic versioning v.. tags. +on: + push: + tags: + - "v[0-9]+.[0-9]+.[0-9]+" + +jobs: + prepare-release: + uses: ./.github/workflows/setup_gh_release.yml + with: + git_ref: ${{ github.ref_name }} + is_prerelease: false + + build-binaries: + needs: prepare-release + uses: ./.github/workflows/build-binaries-gh_release.yml + with: + git_ref: ${{ github.ref_name }} + version: ${{ needs.prepare-release.outputs.version }} + is_prerelease: false + + build-vsix: + needs: prepare-release + uses: ./.github/workflows/build-vsix-gh_release.yml + with: + git_ref: ${{ github.ref_name }} + version: ${{ needs.prepare-release.outputs.version }} + is_prerelease: false diff --git a/.github/workflows/nightly_release.yml b/.github/workflows/nightly_release.yml deleted file mode 100644 index d148f6d..0000000 --- a/.github/workflows/nightly_release.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Nightly release (on change to main branch) -on: - push: - branches: - - main - -env: - # Name of the tag to mark current nightly build - NIGHTLY_TAG: nightly - -jobs: - prepare-release: - name: prepare-release - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - name: Ensure tag exists - run: | - git tag ${{ env.NIGHTLY_TAG }} -f - git push origin ${{ env.NIGHTLY_TAG }} -f - outputs: - tag: ${{ env.NIGHTLY_TAG }} - create-release: - needs: prepare-release - uses: ./.github/workflows/create_release.yml - with: - git_ref: ${{ needs.prepare-release.outputs.tag }} - is_prerelease: true - create-docker-image: - needs: [prepare-release] - uses: ./.github/workflows/create_docker_image.yml - with: - git_ref: ${{ needs.prepare-release.outputs.tag }} - image_tags: | - type=raw,value=${{ needs.prepare-release.outputs.tag }} diff --git a/.github/workflows/on_tagged_release_publish.yml b/.github/workflows/on_tagged_release_publish.yml new file mode 100644 index 0000000..a12803e --- /dev/null +++ b/.github/workflows/on_tagged_release_publish.yml @@ -0,0 +1,21 @@ +name: Publish artifacts to external repositories when tagged version is released + +on: + release: + # Only do the release on proper releases (with semantic versioning tags). + types: [released] + +jobs: + publish-docker-image: + uses: ./.github/workflows/build-docker-registry.yml + with: + git_ref: ${{ github.ref_name }} + # Creation of semver tag also causes creation of 'latest' tag + image_tags: | + type=semver,pattern={{version}} + + publish-vsix: + uses: ./.github/workflows/build-vsix-marketplaces.yml + with: + git_ref: ${{ github.ref_name }} + version: ${{ github.ref_name }} diff --git a/.github/workflows/setup_gh_release.yml b/.github/workflows/setup_gh_release.yml new file mode 100644 index 0000000..dd66a98 --- /dev/null +++ b/.github/workflows/setup_gh_release.yml @@ -0,0 +1,65 @@ +name: Setup GitHub Release + +on: + workflow_call: + inputs: + git_ref: + required: true + type: string + is_prerelease: + required: true + type: boolean + + outputs: + version: + description: "The version of the release which can be used e.g. in artifact names." + value: ${{ jobs.create-release.outputs.version }} + +jobs: + # The create-release job runs purely to initialize the GitHub release itself, + # and names the release after the provided Git ref (e.g. tag). It's separate + # from building the release artifacts so that we only create the release once. + create-release: + name: create-release + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ inputs.git_ref }} + + - name: Get the release version from the tag + if: env.VERSION == '' + run: echo "VERSION=${{ inputs.git_ref }}" >> $GITHUB_ENV + + - name: Show the version + run: | + echo "version is: $VERSION" + + - name: Check that tag version and Cargo.toml/package.json version are the same + if: ${{ !inputs.is_prerelease }} + shell: bash + # Remove leading v from semantic versioning tag v.. + run: | + VERSION_WITHOUT_V=${VERSION#v} + if ! grep -q "version = \"${VERSION_WITHOUT_V}\"" Cargo.toml; then + echo "version ${VERSION_WITHOUT_V} does not match Cargo.toml" >&2 + exit 1 + fi + + if [ "${VERSION_WITHOUT_V}" != "$(cat vscode-ext/package.json | jq '.version' --raw-output)" ]; then + echo "version ${VERSION_WITHOUT_V} does not match vscode-ext/package.json" >&2 + exit 1 + fi + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + name: ${{ env.VERSION }} + tag_name: ${{ inputs.git_ref }} + draft: ${{ !inputs.is_prerelease }} + prerelease: ${{ inputs.is_prerelease }} + generate_release_notes: ${{ inputs.is_prerelease }} + + outputs: + version: ${{ env.VERSION }} diff --git a/.github/workflows/tagged_release.yml b/.github/workflows/tagged_release.yml deleted file mode 100644 index b543d26..0000000 --- a/.github/workflows/tagged_release.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Tagged version release - -# Only do the release on semantic versioning v.. tags. -on: - push: - tags: - - "v[0-9]+.[0-9]+.[0-9]+" - -jobs: - create-release: - uses: ./.github/workflows/create_release.yml - with: - git_ref: ${{ github.ref_name }} - is_prerelease: false diff --git a/.github/workflows/tagged_release_publish_docker.yml b/.github/workflows/tagged_release_publish_docker.yml deleted file mode 100644 index 6c6148a..0000000 --- a/.github/workflows/tagged_release_publish_docker.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Push Docker Image when tagged version is released - -# Only do the release on proper releases (with semantic versioning tags). -on: - release: - types: [released] - -jobs: - create-docker-image: - uses: ./.github/workflows/create_docker_image.yml - with: - git_ref: ${{ github.ref_name }} - # semver tag also causes creation of 'latest' tag - image_tags: | - type=semver,pattern={{version}} diff --git a/vscode-ext/package.json b/vscode-ext/package.json index fb02284..d82870a 100644 --- a/vscode-ext/package.json +++ b/vscode-ext/package.json @@ -185,7 +185,8 @@ "watch": "tsc -watch -p ./", "pretest": "npm run compile && npm run lint", "lint": "eslint .", - "test": "vscode-test" + "test": "vscode-test", + "package": "vsce package --no-dependencies" }, "devDependencies": { "@eslint/js": "^9.2.0", @@ -196,6 +197,7 @@ "@typescript-eslint/parser": "^7.0.2", "@vscode/test-cli": "^0.0.6", "@vscode/test-electron": "^2.3.9", + "@vscode/vsce": "^2.26.1", "eslint": "^8.56.0", "typescript": "^5.3.3", "typescript-eslint": "^7.9.0" @@ -203,4 +205,4 @@ "dependencies": { "vscode-languageclient": "^9.0.1" } -} \ No newline at end of file +}