Skip to content

Commit 4ae6370

Browse files
feat(tag_release): add script for automatically tagging and releasing modules (#250)
## Description This PR introduces a script `.github/scripts/tag_release.sh` which allows the maintainer and other org members to automatically tag and release modules based on the checked out commit id. This script relies on the README's for the updated modules to accurately reflect the version bump to work properly. <!-- Briefly describe what this PR does and why --> ## Type of Change - [ ] New module - [ ] Bug fix - [ ] Feature/enhancement - [ ] Documentation - [X] Other ## Testing & Validation - [NA] Tests pass (`bun test`) - [X] Code formatted (`bun run fmt`) - [X] Changes tested locally ## Reference Run on this Commit: 9ed5084 ### Script Output: ``` coder@tagging-test:~/workspace/registry$ ./.github/scripts/tag_release.sh 🚀 Coder Registry Tag Release Script Operating on commit: 9ed5084 🔍 Scanning all modules for missing release tags... find: warning: you have specified the global option -mindepth after the argument -type, but global options are not positional, i.e., -mindepth affects tests specified before it as well as those specified after it. Please specify global options before other arguments. find: warning: you have specified the global option -maxdepth after the argument -type, but global options are not positional, i.e., -maxdepth affects tests specified before it as well as those specified after it. Please specify global options before other arguments. 📦 coder/agentapi: v1.0.1 (needs tag) 📦 coder/aider: v1.1.1 (needs tag) 📦 coder/amazon-dcv-windows: v1.1.1 (needs tag) 📦 coder/amazon-q: v1.1.1 (needs tag) 📦 coder/aws-region: v1.0.31 (needs tag) 📦 coder/azure-region: v1.0.31 (needs tag) ✅ coder/claude-code: v2.0.3 (already tagged) 📦 coder/coder-login: v1.0.31 (needs tag) 📦 coder/code-server: v1.3.1 (needs tag) 📦 coder/cursor: v1.2.1 (needs tag) 📦 coder/devcontainers-cli: v1.0.31 (needs tag) 📦 coder/dotfiles: v1.2.1 (needs tag) 📦 coder/filebrowser: v1.1.2 (needs tag) 📦 coder/fly-region: v1.0.31 (needs tag) 📦 coder/gcp-region: v1.0.31 (needs tag) 📦 coder/git-clone: v1.1.1 (needs tag) 📦 coder/git-commit-signing: v1.0.31 (needs tag) 📦 coder/git-config: v1.0.31 (needs tag) 📦 coder/github-upload-public-key: v1.0.31 (needs tag) 📦 coder/goose: v2.0.1 (needs tag) 📦 coder/hcp-vault-secrets: v1.0.33 (needs tag) 📦 coder/jetbrains: v1.0.1 (needs tag) ✅ coder/jetbrains-fleet: v1.0.1 (already tagged) 📦 coder/jetbrains-gateway: v1.2.2 (needs tag) 📦 coder/jfrog-oauth: v1.0.31 (needs tag) 📦 coder/jfrog-token: v1.0.31 (needs tag) 📦 coder/jupyterlab: v1.1.1 (needs tag) 📦 coder/jupyter-notebook: v1.1.1 (needs tag) 📦 coder/kasmvnc: v1.2.1 (needs tag) ✅ coder/kiro: v1.0.0 (already tagged) 📦 coder/local-windows-rdp: v1.0.2 (needs tag) 📦 coder/personalize: v1.0.31 (needs tag) 📦 coder/slackme: v1.0.31 (needs tag) 📦 coder/vault-github: v1.0.31 (needs tag) 📦 coder/vault-jwt: v1.1.1 (needs tag) 📦 coder/vault-token: v1.2.1 (needs tag) 📦 coder/vscode-desktop: v1.1.1 (needs tag) 📦 coder/vscode-web: v1.3.1 (needs tag) 📦 coder/windows-rdp: v1.2.3 (needs tag) 📦 coder/windsurf: v1.1.1 (needs tag) 📦 coder/zed: v1.0.1 (needs tag) ✅ nataindata/apache-airflow: v1.0.14 (already tagged) ✅ thezoker/nodejs: v1.0.11 (already tagged) ✅ whizus/exoscale-instance-type: v1.0.13 (already tagged) ✅ whizus/exoscale-zone: v1.0.13 (already tagged) 📊 Summary: 38 of 45 modules need tagging ## Tags to be created: - `release/coder/agentapi/v1.0.1` - `release/coder/aider/v1.1.1` - `release/coder/amazon-dcv-windows/v1.1.1` - `release/coder/amazon-q/v1.1.1` - `release/coder/aws-region/v1.0.31` - `release/coder/azure-region/v1.0.31` - `release/coder/coder-login/v1.0.31` - `release/coder/code-server/v1.3.1` - `release/coder/cursor/v1.2.1` - `release/coder/devcontainers-cli/v1.0.31` - `release/coder/dotfiles/v1.2.1` - `release/coder/filebrowser/v1.1.2` - `release/coder/fly-region/v1.0.31` - `release/coder/gcp-region/v1.0.31` - `release/coder/git-clone/v1.1.1` - `release/coder/git-commit-signing/v1.0.31` - `release/coder/git-config/v1.0.31` - `release/coder/github-upload-public-key/v1.0.31` - `release/coder/goose/v2.0.1` - `release/coder/hcp-vault-secrets/v1.0.33` - `release/coder/jetbrains/v1.0.1` - `release/coder/jetbrains-gateway/v1.2.2` - `release/coder/jfrog-oauth/v1.0.31` - `release/coder/jfrog-token/v1.0.31` - `release/coder/jupyterlab/v1.1.1` - `release/coder/jupyter-notebook/v1.1.1` - `release/coder/kasmvnc/v1.2.1` - `release/coder/local-windows-rdp/v1.0.2` - `release/coder/personalize/v1.0.31` - `release/coder/slackme/v1.0.31` - `release/coder/vault-github/v1.0.31` - `release/coder/vault-jwt/v1.1.1` - `release/coder/vault-token/v1.2.1` - `release/coder/vscode-desktop/v1.1.1` - `release/coder/vscode-web/v1.3.1` - `release/coder/windows-rdp/v1.2.3` - `release/coder/windsurf/v1.1.1` - `release/coder/zed/v1.0.1` ❓ Do you want to proceed with creating and pushing these release tags? This will create git tags and push them to the remote repository. Continue? [y/N]: y 🏷️ Creating release tags for commit: 9ed5084 Creating tag: release/coder/agentapi/v1.0.1 ✅ Created: release/coder/agentapi/v1.0.1 Creating tag: release/coder/aider/v1.1.1 ✅ Created: release/coder/aider/v1.1.1 Creating tag: release/coder/amazon-dcv-windows/v1.1.1 ✅ Created: release/coder/amazon-dcv-windows/v1.1.1 Creating tag: release/coder/amazon-q/v1.1.1 ✅ Created: release/coder/amazon-q/v1.1.1 Creating tag: release/coder/aws-region/v1.0.31 ✅ Created: release/coder/aws-region/v1.0.31 Creating tag: release/coder/azure-region/v1.0.31 ✅ Created: release/coder/azure-region/v1.0.31 Creating tag: release/coder/coder-login/v1.0.31 ✅ Created: release/coder/coder-login/v1.0.31 Creating tag: release/coder/code-server/v1.3.1 ✅ Created: release/coder/code-server/v1.3.1 Creating tag: release/coder/cursor/v1.2.1 ✅ Created: release/coder/cursor/v1.2.1 Creating tag: release/coder/devcontainers-cli/v1.0.31 ✅ Created: release/coder/devcontainers-cli/v1.0.31 Creating tag: release/coder/dotfiles/v1.2.1 ✅ Created: release/coder/dotfiles/v1.2.1 Creating tag: release/coder/filebrowser/v1.1.2 ✅ Created: release/coder/filebrowser/v1.1.2 Creating tag: release/coder/fly-region/v1.0.31 ✅ Created: release/coder/fly-region/v1.0.31 Creating tag: release/coder/gcp-region/v1.0.31 ✅ Created: release/coder/gcp-region/v1.0.31 Creating tag: release/coder/git-clone/v1.1.1 ✅ Created: release/coder/git-clone/v1.1.1 Creating tag: release/coder/git-commit-signing/v1.0.31 ✅ Created: release/coder/git-commit-signing/v1.0.31 Creating tag: release/coder/git-config/v1.0.31 ✅ Created: release/coder/git-config/v1.0.31 Creating tag: release/coder/github-upload-public-key/v1.0.31 ✅ Created: release/coder/github-upload-public-key/v1.0.31 Creating tag: release/coder/goose/v2.0.1 ✅ Created: release/coder/goose/v2.0.1 Creating tag: release/coder/hcp-vault-secrets/v1.0.33 ✅ Created: release/coder/hcp-vault-secrets/v1.0.33 Creating tag: release/coder/jetbrains/v1.0.1 ✅ Created: release/coder/jetbrains/v1.0.1 Creating tag: release/coder/jetbrains-gateway/v1.2.2 ✅ Created: release/coder/jetbrains-gateway/v1.2.2 Creating tag: release/coder/jfrog-oauth/v1.0.31 ✅ Created: release/coder/jfrog-oauth/v1.0.31 Creating tag: release/coder/jfrog-token/v1.0.31 ✅ Created: release/coder/jfrog-token/v1.0.31 Creating tag: release/coder/jupyterlab/v1.1.1 ✅ Created: release/coder/jupyterlab/v1.1.1 Creating tag: release/coder/jupyter-notebook/v1.1.1 ✅ Created: release/coder/jupyter-notebook/v1.1.1 Creating tag: release/coder/kasmvnc/v1.2.1 ✅ Created: release/coder/kasmvnc/v1.2.1 Creating tag: release/coder/local-windows-rdp/v1.0.2 ✅ Created: release/coder/local-windows-rdp/v1.0.2 Creating tag: release/coder/personalize/v1.0.31 ✅ Created: release/coder/personalize/v1.0.31 Creating tag: release/coder/slackme/v1.0.31 ✅ Created: release/coder/slackme/v1.0.31 Creating tag: release/coder/vault-github/v1.0.31 ✅ Created: release/coder/vault-github/v1.0.31 Creating tag: release/coder/vault-jwt/v1.1.1 ✅ Created: release/coder/vault-jwt/v1.1.1 Creating tag: release/coder/vault-token/v1.2.1 ✅ Created: release/coder/vault-token/v1.2.1 Creating tag: release/coder/vscode-desktop/v1.1.1 ✅ Created: release/coder/vscode-desktop/v1.1.1 Creating tag: release/coder/vscode-web/v1.3.1 ✅ Created: release/coder/vscode-web/v1.3.1 Creating tag: release/coder/windows-rdp/v1.2.3 ✅ Created: release/coder/windows-rdp/v1.2.3 Creating tag: release/coder/windsurf/v1.1.1 ✅ Created: release/coder/windsurf/v1.1.1 Creating tag: release/coder/zed/v1.0.1 ✅ Created: release/coder/zed/v1.0.1 📊 Tag creation summary: Created: 38 Failed: 0 🚀 Pushing tags to origin... Pushing: release/coder/agentapi/v1.0.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 26.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/agentapi/v1.0.1 -> release/coder/agentapi/v1.0.1 ✅ Pushed: release/coder/agentapi/v1.0.1 Pushing: release/coder/aider/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 184 bytes | 26.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/aider/v1.1.1 -> release/coder/aider/v1.1.1 ✅ Pushed: release/coder/aider/v1.1.1 Pushing: release/coder/amazon-dcv-windows/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 195 bytes | 65.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/amazon-dcv-windows/v1.1.1 -> release/coder/amazon-dcv-windows/v1.1.1 ✅ Pushed: release/coder/amazon-dcv-windows/v1.1.1 Pushing: release/coder/amazon-q/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 26.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/amazon-q/v1.1.1 -> release/coder/amazon-q/v1.1.1 ✅ Pushed: release/coder/amazon-q/v1.1.1 Pushing: release/coder/aws-region/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 190 bytes | 23.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/aws-region/v1.0.31 -> release/coder/aws-region/v1.0.31 ✅ Pushed: release/coder/aws-region/v1.0.31 Pushing: release/coder/azure-region/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 192 bytes | 27.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/azure-region/v1.0.31 -> release/coder/azure-region/v1.0.31 ✅ Pushed: release/coder/azure-region/v1.0.31 Pushing: release/coder/coder-login/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 189 bytes | 31.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/coder-login/v1.0.31 -> release/coder/coder-login/v1.0.31 ✅ Pushed: release/coder/coder-login/v1.0.31 Pushing: release/coder/code-server/v1.3.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 188 bytes | 31.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/code-server/v1.3.1 -> release/coder/code-server/v1.3.1 ✅ Pushed: release/coder/code-server/v1.3.1 Pushing: release/coder/cursor/v1.2.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 186 bytes | 62.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/cursor/v1.2.1 -> release/coder/cursor/v1.2.1 ✅ Pushed: release/coder/cursor/v1.2.1 Pushing: release/coder/devcontainers-cli/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 194 bytes | 32.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/devcontainers-cli/v1.0.31 -> release/coder/devcontainers-cli/v1.0.31 ✅ Pushed: release/coder/devcontainers-cli/v1.0.31 Pushing: release/coder/dotfiles/v1.2.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 31.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/dotfiles/v1.2.1 -> release/coder/dotfiles/v1.2.1 ✅ Pushed: release/coder/dotfiles/v1.2.1 Pushing: release/coder/filebrowser/v1.1.2 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 190 bytes | 63.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/filebrowser/v1.1.2 -> release/coder/filebrowser/v1.1.2 ✅ Pushed: release/coder/filebrowser/v1.1.2 Pushing: release/coder/fly-region/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 190 bytes | 63.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/fly-region/v1.0.31 -> release/coder/fly-region/v1.0.31 ✅ Pushed: release/coder/fly-region/v1.0.31 Pushing: release/coder/gcp-region/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 190 bytes | 63.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/gcp-region/v1.0.31 -> release/coder/gcp-region/v1.0.31 ✅ Pushed: release/coder/gcp-region/v1.0.31 Pushing: release/coder/git-clone/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 93.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/git-clone/v1.1.1 -> release/coder/git-clone/v1.1.1 ✅ Pushed: release/coder/git-clone/v1.1.1 Pushing: release/coder/git-commit-signing/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 194 bytes | 38.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/git-commit-signing/v1.0.31 -> release/coder/git-commit-signing/v1.0.31 ✅ Pushed: release/coder/git-commit-signing/v1.0.31 Pushing: release/coder/git-config/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 190 bytes | 38.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/git-config/v1.0.31 -> release/coder/git-config/v1.0.31 ✅ Pushed: release/coder/git-config/v1.0.31 Pushing: release/coder/github-upload-public-key/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 200 bytes | 40.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/github-upload-public-key/v1.0.31 -> release/coder/github-upload-public-key/v1.0.31 ✅ Pushed: release/coder/github-upload-public-key/v1.0.31 Pushing: release/coder/goose/v2.0.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 185 bytes | 46.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/goose/v2.0.1 -> release/coder/goose/v2.0.1 ✅ Pushed: release/coder/goose/v2.0.1 Pushing: release/coder/hcp-vault-secrets/v1.0.33 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 195 bytes | 39.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/hcp-vault-secrets/v1.0.33 -> release/coder/hcp-vault-secrets/v1.0.33 ✅ Pushed: release/coder/hcp-vault-secrets/v1.0.33 Pushing: release/coder/jetbrains/v1.0.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 46.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/jetbrains/v1.0.1 -> release/coder/jetbrains/v1.0.1 ✅ Pushed: release/coder/jetbrains/v1.0.1 Pushing: release/coder/jetbrains-gateway/v1.2.2 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 194 bytes | 97.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/jetbrains-gateway/v1.2.2 -> release/coder/jetbrains-gateway/v1.2.2 ✅ Pushed: release/coder/jetbrains-gateway/v1.2.2 Pushing: release/coder/jfrog-oauth/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 191 bytes | 47.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/jfrog-oauth/v1.0.31 -> release/coder/jfrog-oauth/v1.0.31 ✅ Pushed: release/coder/jfrog-oauth/v1.0.31 Pushing: release/coder/jfrog-token/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 191 bytes | 47.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/jfrog-token/v1.0.31 -> release/coder/jfrog-token/v1.0.31 ✅ Pushed: release/coder/jfrog-token/v1.0.31 Pushing: release/coder/jupyterlab/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 188 bytes | 47.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/jupyterlab/v1.1.1 -> release/coder/jupyterlab/v1.1.1 ✅ Pushed: release/coder/jupyterlab/v1.1.1 Pushing: release/coder/jupyter-notebook/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 192 bytes | 96.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/jupyter-notebook/v1.1.1 -> release/coder/jupyter-notebook/v1.1.1 ✅ Pushed: release/coder/jupyter-notebook/v1.1.1 Pushing: release/coder/kasmvnc/v1.2.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 46.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/kasmvnc/v1.2.1 -> release/coder/kasmvnc/v1.2.1 ✅ Pushed: release/coder/kasmvnc/v1.2.1 Pushing: release/coder/local-windows-rdp/v1.0.2 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 194 bytes | 97.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/local-windows-rdp/v1.0.2 -> release/coder/local-windows-rdp/v1.0.2 ✅ Pushed: release/coder/local-windows-rdp/v1.0.2 Pushing: release/coder/personalize/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 191 bytes | 63.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/personalize/v1.0.31 -> release/coder/personalize/v1.0.31 ✅ Pushed: release/coder/personalize/v1.0.31 Pushing: release/coder/slackme/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 62.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/slackme/v1.0.31 -> release/coder/slackme/v1.0.31 ✅ Pushed: release/coder/slackme/v1.0.31 Pushing: release/coder/vault-github/v1.0.31 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 192 bytes | 64.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/vault-github/v1.0.31 -> release/coder/vault-github/v1.0.31 ✅ Pushed: release/coder/vault-github/v1.0.31 Pushing: release/coder/vault-jwt/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 188 bytes | 62.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/vault-jwt/v1.1.1 -> release/coder/vault-jwt/v1.1.1 ✅ Pushed: release/coder/vault-jwt/v1.1.1 Pushing: release/coder/vault-token/v1.2.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 190 bytes | 63.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/vault-token/v1.2.1 -> release/coder/vault-token/v1.2.1 ✅ Pushed: release/coder/vault-token/v1.2.1 Pushing: release/coder/vscode-desktop/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 191 bytes | 191.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/vscode-desktop/v1.1.1 -> release/coder/vscode-desktop/v1.1.1 ✅ Pushed: release/coder/vscode-desktop/v1.1.1 Pushing: release/coder/vscode-web/v1.3.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 188 bytes | 47.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/vscode-web/v1.3.1 -> release/coder/vscode-web/v1.3.1 ✅ Pushed: release/coder/vscode-web/v1.3.1 Pushing: release/coder/windows-rdp/v1.2.3 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 190 bytes | 63.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/windows-rdp/v1.2.3 -> release/coder/windows-rdp/v1.2.3 ✅ Pushed: release/coder/windows-rdp/v1.2.3 Pushing: release/coder/windsurf/v1.1.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 187 bytes | 93.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/windsurf/v1.1.1 -> release/coder/windsurf/v1.1.1 ✅ Pushed: release/coder/windsurf/v1.1.1 Pushing: release/coder/zed/v1.0.1 Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 183 bytes | 91.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To https://github.com/coder/registry * [new tag] release/coder/zed/v1.0.1 -> release/coder/zed/v1.0.1 ✅ Pushed: release/coder/zed/v1.0.1 📊 Push summary: Pushed: 38 Failed: 0 🎉 Successfully created and pushed 38 release tags! 📝 Next steps: - Tags will be automatically published to registry.coder.com - Monitor the registry website for updates - Check GitHub releases for any issues ```
1 parent 9ed5084 commit 4ae6370

File tree

1 file changed

+275
-0
lines changed

1 file changed

+275
-0
lines changed

.github/scripts/tag_release.sh

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
#!/bin/bash
2+
3+
# Tag Release Script
4+
# Automatically detects modules that need tagging and creates release tags
5+
# Usage: ./tag_release.sh
6+
# Operates on the current checked-out commit
7+
8+
set -euo pipefail
9+
10+
MODULES_TO_TAG=()
11+
12+
usage() {
13+
echo "Usage: $0"
14+
echo ""
15+
echo "This script will:"
16+
echo " 1. Scan all modules in the registry"
17+
echo " 2. Check which modules need new release tags"
18+
echo " 3. Extract version information from README files"
19+
echo " 4. Generate a report for confirmation"
20+
echo " 5. Create and push release tags after confirmation"
21+
echo ""
22+
echo "The script operates on the current checked-out commit."
23+
echo "Make sure you have checked out the commit you want to tag before running."
24+
exit 1
25+
}
26+
27+
validate_version() {
28+
local version="$1"
29+
if ! [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
30+
echo "❌ Invalid version format: '$version'. Expected X.Y.Z format." >&2
31+
return 1
32+
fi
33+
return 0
34+
}
35+
36+
extract_version_from_readme() {
37+
local readme_path="$1"
38+
local namespace="$2"
39+
local module_name="$3"
40+
41+
[ ! -f "$readme_path" ] && return 1
42+
43+
local version_line
44+
version_line=$(grep -E "source\s*=\s*\"registry\.coder\.com/${namespace}/${module_name}" "$readme_path" | head -1 || echo "")
45+
46+
if [ -n "$version_line" ]; then
47+
local version
48+
version=$(echo "$version_line" | sed -n 's/.*version\s*=\s*"\([^"]*\)".*/\1/p')
49+
if [ -n "$version" ]; then
50+
echo "$version"
51+
return 0
52+
fi
53+
fi
54+
55+
local fallback_version
56+
fallback_version=$(grep -E 'version\s*=\s*"[0-9]+\.[0-9]+\.[0-9]+"' "$readme_path" | head -1 | sed 's/.*version\s*=\s*"\([^"]*\)".*/\1/' || echo "")
57+
58+
if [ -n "$fallback_version" ]; then
59+
echo "$fallback_version"
60+
return 0
61+
fi
62+
63+
return 1
64+
}
65+
66+
check_module_needs_tagging() {
67+
local namespace="$1"
68+
local module_name="$2"
69+
local readme_version="$3"
70+
71+
local tag_name="release/${namespace}/${module_name}/v${readme_version}"
72+
73+
if git rev-parse --verify "$tag_name" > /dev/null 2>&1; then
74+
return 1
75+
else
76+
return 0
77+
fi
78+
}
79+
80+
detect_modules_needing_tags() {
81+
MODULES_TO_TAG=()
82+
83+
echo "🔍 Scanning all modules for missing release tags..."
84+
echo ""
85+
86+
local all_modules
87+
all_modules=$(find registry -mindepth 3 -maxdepth 3 -type d -path "*/modules/*" | sort -u || echo "")
88+
89+
[ -z "$all_modules" ] && {
90+
echo "❌ No modules found to check"
91+
return 1
92+
}
93+
94+
local total_checked=0
95+
local needs_tagging=0
96+
97+
while IFS= read -r module_path; do
98+
if [ -z "$module_path" ]; then continue; fi
99+
100+
local namespace
101+
namespace=$(echo "$module_path" | cut -d'/' -f2)
102+
local module_name
103+
module_name=$(echo "$module_path" | cut -d'/' -f4)
104+
105+
total_checked=$((total_checked + 1))
106+
107+
local readme_path="$module_path/README.md"
108+
local readme_version
109+
110+
if ! readme_version=$(extract_version_from_readme "$readme_path" "$namespace" "$module_name"); then
111+
echo "⚠️ $namespace/$module_name: No version found in README, skipping"
112+
continue
113+
fi
114+
115+
if ! validate_version "$readme_version"; then
116+
echo "⚠️ $namespace/$module_name: Invalid version format '$readme_version', skipping"
117+
continue
118+
fi
119+
120+
if check_module_needs_tagging "$namespace" "$module_name" "$readme_version"; then
121+
echo "📦 $namespace/$module_name: v$readme_version (needs tag)"
122+
MODULES_TO_TAG+=("$module_path:$namespace:$module_name:$readme_version")
123+
needs_tagging=$((needs_tagging + 1))
124+
else
125+
echo "$namespace/$module_name: v$readme_version (already tagged)"
126+
fi
127+
128+
done <<< "$all_modules"
129+
130+
echo ""
131+
echo "📊 Summary: $needs_tagging of $total_checked modules need tagging"
132+
echo ""
133+
134+
[ $needs_tagging -eq 0 ] && {
135+
echo "🎉 All modules are up to date! No tags needed."
136+
return 0
137+
}
138+
139+
echo "## Tags to be created:"
140+
for module_info in "${MODULES_TO_TAG[@]}"; do
141+
IFS=':' read -r module_path namespace module_name version <<< "$module_info"
142+
echo "- \`release/$namespace/$module_name/v$version\`"
143+
done
144+
echo ""
145+
146+
return 0
147+
}
148+
149+
create_and_push_tags() {
150+
[ ${#MODULES_TO_TAG[@]} -eq 0 ] && {
151+
echo "❌ No modules to tag found"
152+
return 1
153+
}
154+
155+
local current_commit
156+
current_commit=$(git rev-parse HEAD)
157+
158+
echo "🏷️ Creating release tags for commit: $current_commit"
159+
echo ""
160+
161+
local created_tags=0
162+
local failed_tags=0
163+
164+
for module_info in "${MODULES_TO_TAG[@]}"; do
165+
IFS=':' read -r module_path namespace module_name version <<< "$module_info"
166+
167+
local tag_name="release/$namespace/$module_name/v$version"
168+
local tag_message="Release $namespace/$module_name v$version"
169+
170+
echo "Creating tag: $tag_name"
171+
172+
if git tag -a "$tag_name" -m "$tag_message" "$current_commit"; then
173+
echo "✅ Created: $tag_name"
174+
created_tags=$((created_tags + 1))
175+
else
176+
echo "❌ Failed to create: $tag_name"
177+
failed_tags=$((failed_tags + 1))
178+
fi
179+
done
180+
181+
echo ""
182+
echo "📊 Tag creation summary:"
183+
echo " Created: $created_tags"
184+
echo " Failed: $failed_tags"
185+
echo ""
186+
187+
[ $created_tags -eq 0 ] && {
188+
echo "❌ No tags were created successfully"
189+
return 1
190+
}
191+
192+
echo "🚀 Pushing tags to origin..."
193+
194+
local tags_to_push=()
195+
for module_info in "${MODULES_TO_TAG[@]}"; do
196+
IFS=':' read -r module_path namespace module_name version <<< "$module_info"
197+
local tag_name="release/$namespace/$module_name/v$version"
198+
199+
if git rev-parse --verify "$tag_name" > /dev/null 2>&1; then
200+
tags_to_push+=("$tag_name")
201+
fi
202+
done
203+
204+
local pushed_tags=0
205+
local failed_pushes=0
206+
207+
if [ ${#tags_to_push[@]} -eq 0 ]; then
208+
echo "❌ No valid tags found to push"
209+
else
210+
if git push --atomic origin "${tags_to_push[@]}"; then
211+
echo "✅ Successfully pushed all ${#tags_to_push[@]} tags"
212+
pushed_tags=${#tags_to_push[@]}
213+
else
214+
echo "❌ Failed to push tags"
215+
failed_pushes=${#tags_to_push[@]}
216+
fi
217+
fi
218+
219+
echo ""
220+
echo "📊 Push summary:"
221+
echo " Pushed: $pushed_tags"
222+
echo " Failed: $failed_pushes"
223+
echo ""
224+
225+
if [ $pushed_tags -gt 0 ]; then
226+
echo "🎉 Successfully created and pushed $pushed_tags release tags!"
227+
echo ""
228+
echo "📝 Next steps:"
229+
echo " - Tags will be automatically published to registry.coder.com"
230+
echo " - Monitor the registry website for updates"
231+
echo " - Check GitHub releases for any issues"
232+
fi
233+
234+
return 0
235+
}
236+
237+
main() {
238+
[ $# -gt 0 ] && usage
239+
240+
echo "🚀 Coder Registry Tag Release Script"
241+
echo "Operating on commit: $(git rev-parse HEAD)"
242+
echo ""
243+
244+
if ! git rev-parse --git-dir > /dev/null 2>&1; then
245+
echo "❌ Not in a git repository"
246+
exit 1
247+
fi
248+
249+
detect_modules_needing_tags || exit 1
250+
251+
[ ${#MODULES_TO_TAG[@]} -eq 0 ] && {
252+
echo "✨ No modules need tagging. All done!"
253+
exit 0
254+
}
255+
256+
echo ""
257+
echo "❓ Do you want to proceed with creating and pushing these release tags?"
258+
echo " This will create git tags and push them to the remote repository."
259+
echo ""
260+
read -p "Continue? [y/N]: " -r response
261+
262+
case "$response" in
263+
[yY] | [yY][eE][sS])
264+
echo ""
265+
create_and_push_tags
266+
;;
267+
*)
268+
echo ""
269+
echo "🚫 Operation cancelled by user"
270+
exit 0
271+
;;
272+
esac
273+
}
274+
275+
main "$@"

0 commit comments

Comments
 (0)