diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml new file mode 100644 index 00000000..9580b6c8 --- /dev/null +++ b/.github/workflows/prerelease.yml @@ -0,0 +1,174 @@ +name: CI-prerelease + +on: + push: + branches: + - prerelease + paths-ignore: + - "docs/**" + - ".vscode/**" + - ".github/**" + - "*.md" + - "**/*.md" + pull_request: + branches: + - prerelease + release: + branches: + - prerelease + types: + - released +jobs: + build: + timeout-minutes: 10 + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + steps: + - uses: actions/checkout@v2 + - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* + - name: Set an output + id: set-version + if: runner.os == 'Linux' + run: | + set -x + VERSION=$(jq -r '.version' package.json | cut -d- -f1) + [ $GITHUB_EVENT_NAME == 'release' ] && VERSION=${{ github.event.release.tag_name }} && VERSION=${VERSION/v/} + CHANGELOG=$(cat CHANGELOG.md | sed -n "/## \[${VERSION}\]/,/## /p" | sed '/^$/d;1d;$d') + CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" + echo ::set-output name=changelog::$CHANGELOG + git tag -l | cat + [ $GITHUB_EVENT_NAME == 'push' ] && VERSION+=-beta && VERSION+=.$(($(git tag -l "v$VERSION.*" | sort -nt. -k4 2>/dev/null | tail -1 | cut -d. -f4)+1)) + [ $GITHUB_EVENT_NAME == 'pull_request' ] && VERSION+=-dev.${{ github.event.pull_request.number }} + echo ::set-output name=version::$VERSION + NAME=$(jq -r '.name' package.json)-$VERSION + echo ::set-output name=name::$NAME + tmp=$(mktemp) + jq --arg version "$VERSION" '.version = $version' package.json > "$tmp" && mv "$tmp" package.json + mkdir dist + echo $VERSION > .version + echo $NAME > .name + - name: Use Node.js + uses: actions/setup-node@v1 + with: + node-version: 14.x + - run: npm install + - name: lint + if: runner.os == 'Linux' + run: npm run lint + - run: npm run compile + - name: npm test + uses: GabrielBB/xvfb-action@v1.0 + with: + run: npm run test + - name: Build pre-release package + if: runner.os == 'Linux' + run: | + npx vsce package --pre-release -o ${{ steps.set-version.outputs.name }}.vsix + - uses: actions/upload-artifact@v2 + if: runner.os == 'Linux' + with: + name: ${{ steps.set-version.outputs.name }}.vsix + path: ${{ steps.set-version.outputs.name }}.vsix + - uses: actions/upload-artifact@v2 + if: runner.os == 'Linux' + with: + name: meta + path: | + .name + .version + beta: + if: (github.event_name == 'push') + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/download-artifact@v2 + with: + name: meta + path: . + - name: Set an output + id: set-version + if: runner.os == 'Linux' + run: | + set -x + echo ::set-output name=version::`cat .version` + echo ::set-output name=name::`cat .name` + - uses: actions/download-artifact@v2 + with: + name: ${{ steps.set-version.outputs.name }}.vsix + - name: Create Pre-Release + id: create_release + uses: actions/create-release@v1 + if: runner.os == 'Linux' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ steps.set-version.outputs.version }} + release_name: v${{ steps.set-version.outputs.version }} + prerelease: ${{ github.event_name != 'release' }} + body: | + Changes in this pre-release + ${{ steps.set-version.outputs.changelog }} + - name: Upload Pre-Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + if: runner.os == 'Linux' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ${{ steps.set-version.outputs.name }}.vsix + asset_name: ${{ steps.set-version.outputs.name }}.vsix + asset_content_type: application/zip + publish: + if: github.event_name == 'release' + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v2 + with: + ref: prerelease + token: ${{ secrets.TOKEN }} + - uses: actions/download-artifact@v2 + with: + name: meta + path: . + - name: Use Node.js + uses: actions/setup-node@v1 + with: + node-version: 14.x + - name: Prepare pre-release build + id: set-version + run: | + VERSION=`cat .version` + NEXT_VERSION=`cat .version | awk -F. '/[0-9]+\./{$NF++;print}' OFS=.` + echo ::set-output name=name::`cat .name` + tmp=$(mktemp) + git config --global user.name 'ProjectBot' + git config --global user.email 'bot@users.noreply.github.com' + jq --arg version "${NEXT_VERSION}-SNAPSHOT" '.version = $version' package.json > "$tmp" && mv "$tmp" package.json + git add package.json + git commit -m 'auto bump version after pre-release' + jq --arg version "$VERSION" '.version = $version' package.json > "$tmp" && mv "$tmp" package.json + npm install + jq 'del(.enableProposedApi,.enabledApiProposals)' package.json > "$tmp" && mv "$tmp" package.json + git push + - name: Build pre-release package + run: | + npx vsce package --pre-release -o ${{ steps.set-version.outputs.name }}.vsix + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + if: runner.os == 'Linux' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ${{ steps.set-version.outputs.name }}.vsix + asset_name: ${{ steps.set-version.outputs.name }}.vsix + asset_content_type: application/zip + - name: Publish to VSCode Marketplace + run: | + [ -n "${{ secrets.VSCE_TOKEN }}" ] && \ + npx vsce publish --pre-release --packagePath ${{ steps.set-version.outputs.name }}.vsix -p ${{ secrets.VSCE_TOKEN }} || true