Skip to main content

Features

Versioning​

record-release supports semantic version bumping and explicit version specification.

Version Bumping​

Automatically increment from the last deployed version:

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
bump: patch # or: minor, major
BumpExample
patch1.0.0 → 1.0.1
minor1.0.0 → 1.1.0
major1.0.0 → 2.0.0

Explicit Version​

Specify an exact version:

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
version: 2.0.0

Get Current Version​

Query the current deployed version without recording:

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
get-version: true

Outputs:

  • version: Current version
  • deployed-at: Deployment timestamp
  • commit-hash: Commit hash

Release Artifacts​

Upload build artifacts to your GitHub releases.

Single Job​

Specify glob patterns to include in the release:

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
bump: patch
artifacts: |
dist/*.zip
dist/*.tar.gz

Multi-Job Workflows​

Artifacts are automatically transferred between jobs:

jobs:
build:
steps:
- name: Build
run: npm run build # Creates dist/app.zip

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
dry-run: true
artifacts: dist/*.zip # Uploaded to GitHub artifacts

deploy:
needs: build
steps:
- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
# Automatically downloads and attaches artifacts from build job

Parallel Build Jobs​

For parallel builds, use upload-only mode:

jobs:
build-linux:
steps:
- run: npm run build:linux
- uses: groo-dev/record-release@v1
with:
artifacts: dist/linux-*.tar.gz

build-windows:
steps:
- run: npm run build:windows
- uses: groo-dev/record-release@v1
with:
artifacts: dist/windows-*.zip

finalize:
needs: [build-linux, build-windows]
steps:
- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
# Collects and deduplicates artifacts from all jobs

GitHub Releases​

record-release can automatically create GitHub releases with your deployments.

Basic Usage​

GitHub releases are created automatically when recording a deployment:

permissions:
contents: write # Required

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
bump: patch

Custom Release Notes​

Inline notes:

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
bump: patch
body: |
## What's New
- Feature A
- Bug fix B

From a file:

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
bump: patch
body-file: CHANGELOG.md

Draft and Prerelease​

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: staging
bump: patch
draft: true # Create as draft
prerelease: true # Mark as prerelease

Tag Prefix (Monorepos)​

For monorepos, use a tag prefix to namespace versions:

- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}
environment: production
bump: patch
release-prefix: api # Creates tags like api-v1.0.0

Secrets & Variables​

Store environment-specific secrets and variables in the Groo Ops Dashboard with end-to-end encryption.

How It Works​

  1. Secrets are encrypted in your browser before being sent to the server
  2. Each environment has its own encryption key (production, staging, development)
  3. Only your workflow can decrypt - the server never sees plaintext values
  4. Secrets are automatically masked in GitHub Actions logs

Setup​

  1. Go to ops.groo.dev → Your Application → Config
  2. Select an environment (e.g., Production)
  3. Click Enable Secrets
  4. Copy the private key - this is shown only once
  5. Add the key as a GitHub secret (e.g., OPS_SECRET_KEY_PRODUCTION)

Using Secrets in Workflows​

Provide the secret-key input to decrypt secrets:

- uses: groo-dev/record-release@v1
id: release
with:
token: ${{ secrets.OPS_API_TOKEN }}
secret-key: ${{ secrets.OPS_SECRET_KEY_PRODUCTION }}
environment: production
bump: patch

- name: Deploy
run: npm publish
env:
NPM_TOKEN: ${{ steps.release.outputs.config.NPM_TOKEN }}

Accessing Config Values​

All config values (secrets and variables) are available as outputs with the config. prefix:

steps:
- uses: groo-dev/record-release@v1
id: release
with:
token: ${{ secrets.OPS_API_TOKEN }}
secret-key: ${{ secrets.OPS_SECRET_KEY }}
environment: production

- name: Use secrets
run: |
echo "Deploying to ${{ steps.release.outputs.config.DEPLOY_URL }}"
env:
API_KEY: ${{ steps.release.outputs.config.API_KEY }}
DATABASE_URL: ${{ steps.release.outputs.config.DATABASE_URL }}

Multi-Job Workflows with Secrets​

In multi-job workflows, fetch secrets in the init job:

jobs:
init:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.release.outputs.version }}
npm-token: ${{ steps.release.outputs.config.NPM_TOKEN }}
steps:
- uses: groo-dev/record-release@v1
id: release
with:
token: ${{ secrets.OPS_API_TOKEN }}
secret-key: ${{ secrets.OPS_SECRET_KEY }}
environment: production
dry-run: true

build:
needs: init
runs-on: ubuntu-latest
steps:
- run: npm publish
env:
NPM_TOKEN: ${{ needs.init.outputs.npm-token }}

finalize:
needs: [init, build]
runs-on: ubuntu-latest
steps:
- uses: groo-dev/record-release@v1
with:
token: ${{ secrets.OPS_API_TOKEN }}

Variables vs Secrets​

TypeEncryptedUse Case
VariablesNoPublic config like URLs, feature flags
SecretsYesAPI keys, tokens, passwords

Both are accessed the same way via config.* outputs.

Security Notes​

  • Private keys are generated in your browser and never sent to the server
  • Secrets use hybrid encryption (RSA-OAEP + AES-256-GCM)
  • Each environment can have its own encryption key
  • Decryption only happens in your GitHub Actions workflow
  • Secrets are automatically masked in logs via core.setSecret()