diff --git a/.github/workflows/ci.yml b/.github/workflows/build.yml similarity index 95% rename from .github/workflows/ci.yml rename to .github/workflows/build.yml index 1e6d223..657e1ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,7 @@ -name: Continuous Integration +name: Build on: + workflow_dispatch: pull_request: branches: - main diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml deleted file mode 100644 index 5c4bd8b..0000000 --- a/.github/workflows/check-dist.yml +++ /dev/null @@ -1,72 +0,0 @@ -# In TypeScript actions, `dist/` is a special directory. When you reference -# an action with the `uses:` property, `dist/index.js` is the code that will be -# run. For this project, the `dist/index.js` file is transpiled from other -# source files. This workflow ensures the `dist/` directory contains the -# expected transpiled code. -# -# If this workflow is run from a feature branch, it will act as an additional CI -# check and fail if the checked-in `dist/` directory does not match what is -# expected from the build. -name: Check Transpiled JavaScript - -on: - pull_request: - branches: - - main - push: - branches: - - main - -permissions: - contents: read - -jobs: - check-dist: - name: Check dist/ - runs-on: ubuntu-latest - - steps: - - name: Checkout - id: checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - id: setup-node - uses: actions/setup-node@v4 - with: - node-version-file: .node-version - cache: npm - - - name: Install Dependencies - id: install - run: npm ci - - - name: Build dist/ Directory - id: build - run: npm run bundle - - # This will fail the workflow if the `dist/` directory is different than - # expected. - - name: Compare Directories - id: diff - run: | - if [ ! -d dist/ ]; then - echo "Expected dist/ directory does not exist. See status below:" - ls -la ./ - exit 1 - fi - if [ "$(git diff --ignore-space-at-eol --text dist/ | wc -l)" -gt "0" ]; then - echo "Detected uncommitted changes after build. See status below:" - git diff --ignore-space-at-eol --text dist/ - exit 1 - fi - - # If `dist/` was different than expected, upload the expected version as a - # workflow artifact. - - if: ${{ failure() && steps.diff.outcome == 'failure' }} - name: Upload Artifact - id: upload - uses: actions/upload-artifact@v4 - with: - name: dist - path: dist/ diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml new file mode 100644 index 0000000..6c91a77 --- /dev/null +++ b/.github/workflows/contributors.yml @@ -0,0 +1,11 @@ +name: Update Contributors + +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + +jobs: + contributors: + uses: CodingWithCalvin/.github/.github/workflows/contributors.yml@main + secrets: inherit diff --git a/.github/workflows/preview-changelog.yml b/.github/workflows/preview-changelog.yml new file mode 100644 index 0000000..91dac6e --- /dev/null +++ b/.github/workflows/preview-changelog.yml @@ -0,0 +1,27 @@ +name: Preview Changelog + +run-name: Preview release notes for next release + +on: + workflow_dispatch: + +jobs: + generate: + name: Generate + uses: CodingWithCalvin/.github/.github/workflows/generate-changelog.yml@main + secrets: inherit + + preview: + name: Display Preview + runs-on: ubuntu-latest + needs: generate + + steps: + - name: Display changelog preview + run: | + echo "==========================================" + echo "CHANGELOG PREVIEW" + echo "==========================================" + echo "" + echo "${{ needs.generate.outputs.changelog }}" + shell: bash diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..a52cbac --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,99 @@ +name: Publish + +on: + workflow_dispatch: + inputs: + version: + description: 'Version to release (e.g., 1.2.0)' + required: true + type: string + +jobs: + changelog: + uses: CodingWithCalvin/.github/.github/workflows/generate-changelog.yml@main + secrets: inherit + + release: + needs: changelog + runs-on: ubuntu-latest + outputs: + version: ${{ inputs.version }} + + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + + - name: Install Dependencies + run: npm ci + + - name: Rebuild dist + run: npm run bundle + + - name: Commit dist changes + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add dist/ + git diff --staged --quiet || git commit -m "chore: rebuild dist for v${{ inputs.version }}" + git push + + - name: Create and push tag + run: | + git tag v${{ inputs.version }} + git push origin v${{ inputs.version }} + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + tag_name: v${{ inputs.version }} + name: v${{ inputs.version }} + body: ${{ needs.changelog.outputs.changelog }} + + notify-bluesky: + needs: release + uses: CodingWithCalvin/.github/.github/workflows/bluesky-post.yml@main + with: + post_text: | + 🚀 Visual Studio VSIX Versioner v${{ needs.release.outputs.version }} has been released! + + Version your Visual Studio extensions with ease! + + [📋 Release Notes](https://github.com/${{ github.repository }}/releases/tag/v${{ needs.release.outputs.version }}) + [📦 GitHub Marketplace](https://github.com/marketplace/actions/visual-studio-vsix-versioner) + + #github #githubactions #devops #automation + embed_url: https://github.com/marketplace/actions/visual-studio-vsix-versioner + embed_title: Visual Studio VSIX Versioner + embed_description: Version your Visual Studio extensions with ease! + secrets: + BLUESKY_USERNAME: ${{ secrets.BLUESKY_USERNAME }} + BLUESKY_APP_PASSWORD: ${{ secrets.BLUESKY_APP_PASSWORD }} + + notify-linkedin: + needs: release + uses: CodingWithCalvin/.github/.github/workflows/linkedin-post.yml@main + with: + post_text: | + 🚀 Visual Studio VSIX Versioner v${{ needs.release.outputs.version }} has been released! + + Version your Visual Studio extensions with ease! + + 📋 Release Notes: https://github.com/${{ github.repository }}/releases/tag/v${{ needs.release.outputs.version }} + 📦 GitHub Marketplace: https://github.com/marketplace/actions/visual-studio-vsix-versioner + + #github #githubactions #devops #automation + article_url: https://github.com/marketplace/actions/visual-studio-vsix-versioner + article_title: Visual Studio VSIX Versioner + article_description: Version your Visual Studio extensions with ease! + secrets: + LINKEDIN_ACCESS_TOKEN: ${{ secrets.LINKEDIN_ACCESS_TOKEN }} + LINKEDIN_CLIENT_ID: ${{ secrets.LINKEDIN_CLIENT_ID }} diff --git a/README.md b/README.md index a31ca0e..5682f8b 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,60 @@ -# CodingWithCalvin/GHA-VSVsixVersioner +# Visual Studio VSIX Versioner -GitHub Action to update your Visual Studio extension to a version that is based -off of the current date and the CI build number. +[![Build](https://img.shields.io/github/actions/workflow/status/CodingWithCalvin/GHA-VSVsixVersioner/build.yml?style=for-the-badge&label=Build)](https://github.com/CodingWithCalvin/GHA-VSVsixVersioner/actions/workflows/build.yml) +[![GitHub release](https://img.shields.io/github/v/release/CodingWithCalvin/GHA-VSVsixVersioner?style=for-the-badge)](https://github.com/CodingWithCalvin/GHA-VSVsixVersioner/releases) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge)](LICENSE) -> _This action requires your extension to utilize the -> [VSIX Synchronizer](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.VsixSynchronizer64) -> model for managing the version in the `source.extension.vsixmanifest` and the -> `source.extension.cs` code-behind file that is automatically synchronized._ +🏷️ Version your Visual Studio extensions automatically based on date and build number! + +This GitHub Action updates your Visual Studio extension to a version based on the current date and CI build number. + +## 🚀 Usage + +You can use the Visual Studio VSIX Versioner GitHub Action by configuring a YAML-based workflow file, e.g. `.github/workflows/deploy.yml`. + +> ⚠️ **Note:** This action requires your extension to utilize the [VSIX Synchronizer](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.VsixSynchronizer64) model for managing the version in the `source.extension.vsixmanifest` and the `source.extension.cs` code-behind file that is automatically synchronized. > -> _Other versioning styles will be supported in the future_ +> Other versioning styles will be supported in the future. + +> ⚠️ **Note:** This action only works on a Windows-based runner. -## Usage +## 📥 Inputs -You can use the Visual Studio VSIX Versioner GitHub Action by configuring a -YAML-based workflow file, e.g. .github/workflows/deploy.yml. +| Input | Required | Description | +|-------|----------|-------------| +| `extension-manifest-file` | Yes | Path to your `source.extension.vsixmanifest` file | +| `extension-source-file` | Yes | Path to the source file generated from the manifest (using VSIX Synchronizer) | +| `build-number` | No | Build number to use for versioning (defaults to `run_number`) | -> _This action only works on a Windows-based runner_ +## 📋 Example -## Version the VSIX _before_ building +Version the VSIX **before** building: -```yml +```yaml steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Visual Studio VSIX Versioner - uses: CodingWithCalvin/GHA-VSVsixVersioner@v2.0.0 + uses: CodingWithCalvin/GHA-VSVsixVersioner@v2 with: # REQUIRED - extension-manifest-file: './src/CodingWithCalvin.OpenBinFolder.Vsix/source.extension.vsixmanifest' - extension-source-file: './src/CodingWithCalvin.OpenBinFolder.Vsix/source.extension.cs' + extension-manifest-file: './src/MyExtension/source.extension.vsixmanifest' + extension-source-file: './src/MyExtension/source.extension.cs' # OPTIONAL build-number: ${{ github.run_number }} ``` -## Inputs +## 👥 Contributors + + + + +## 📄 License + +MIT License - see [LICENSE](LICENSE) for details. + +--- -| Input | Required | Description | -| ----------------------- | -------- | ----------------------------------------------------------------------------------------------------------- | -| extension-manifest-file | Y | Path to the manifest used for the extension | -| extension-source-file | Y | Path to the source file generated from the manifest (using VSIX Syncronizer) | -| build-number | N | Specify the build number you'd like to utilize, otherwise, defaults to the `run_number` of the build itself | +Made with ❤️ by Coding With Calvin