Skip to main content

GitHub Create Release Action

Overview

The actions/github/createRelease action creates GitHub releases with automated changelog generation and configurable release options. This Docker-based action provides comprehensive release management capabilities including pre-release flags, draft releases, and Dependabot PR inclusion control.

Language/Tool Support

  • GitHub: Release management and API integration
  • Docker: Containerized execution for consistent behavior
  • Changelog: Automated release notes generation
  • Semantic Versioning: Tag-based release naming

Features

  • Automated Release Creation: Creates GitHub releases from tags
  • Release Notes Generation: Automatically generates changelog from commits
  • Pre-release Support: Mark releases as pre-release versions
  • Draft Releases: Create draft releases for review before publishing
  • Dependabot Integration: Option to include/exclude Dependabot PRs from notes
  • Docker-based: Consistent execution environment

Usage

- name: Create github Release
uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ github.ref_name }}
preRelease: false
generateReleaseNotes: true
isDraft: false
includeDependabot: false

Inputs

InputTypeRequiredDefaultDescription
tokenstring-GitHub token with repository write permissions
repositorystring-GitHub repository in format "owner/repo"
tagNamestring-Git tag name for the release
preReleasebooleanfalseMark release as pre-release
generateReleaseNotesbooleantrueGenerate automatic release notes
isDraftbooleanfalseCreate release as draft
includeDependabotbooleanfalseInclude Dependabot PRs in release notes

Action Implementation

This action runs in a Docker container:

  • Image: ghcr.io/encoredigitalgroup/gh-action-create-github-release:latest
  • Environment: All inputs are passed as environment variables
  • Execution: Containerized Go application

Usage Examples

Basic Release Creation

name: Create Release
on:
push:
tags:
- 'v*'

jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create Release
uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ github.ref_name }}

Pre-release Creation

name: Create Pre-release
on:
push:
tags:
- 'v*-rc*'
- 'v*-beta*'
- 'v*-alpha*'

jobs:
prerelease:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create Pre-release
uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ github.ref_name }}
preRelease: true
generateReleaseNotes: true

Draft Release for Review

name: Create Draft Release
on:
workflow_dispatch:
inputs:
tag:
description: 'Release tag'
required: true
type: string

jobs:
draft-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create Draft Release
uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ inputs.tag }}
isDraft: true
generateReleaseNotes: true
includeDependabot: false

Release with Dependabot Changes

name: Release with Dependencies
on:
push:
tags:
- 'v*'

jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create Release with Dependabot
uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ github.ref_name }}
generateReleaseNotes: true
includeDependabot: true

Integration Patterns

Automated Release Pipeline

name: Release Pipeline
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Build Application
run: echo "Building..."

test:
runs-on: ubuntu-latest
steps:
- name: Run Tests
run: echo "Testing..."

release:
needs: [build, test]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create Release
uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ github.ref_name }}

deploy:
needs: release
runs-on: ubuntu-latest
steps:
- name: Deploy to Production
run: echo "Deploying..."

Multi-Environment Release

name: Multi-Environment Release
on:
push:
tags:
- 'v*'

jobs:
determine-release-type:
runs-on: ubuntu-latest
outputs:
is-prerelease: ${{ steps.check.outputs.prerelease }}
steps:
- id: check
run: |
if [[ "${{ github.ref_name }}" =~ (alpha|beta|rc) ]]; then
echo "prerelease=true" >> $GITHUB_OUTPUT
else
echo "prerelease=false" >> $GITHUB_OUTPUT
fi

create-release:
needs: determine-release-type
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Create Release
uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ github.ref_name }}
preRelease: ${{ needs.determine-release-type.outputs.is-prerelease }}

Release Notes Generation

The action automatically generates release notes when generateReleaseNotes: true:

Generated Content Includes

  • All Pull Requests: All pull requests are automatically included.
  • Dependencies: Dependabot updates (if includeDependabot: true), otherwise dependabot PR's are excluded.
  • Contributors: List of contributors to the release

Required Permissions

The GitHub token must have the following permissions:

permissions:
contents: write # Required for creating releases
pull-requests: read # Required for generating release notes

Use Cases

Version Release Management

# Semantic version releases
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- '!v[0-9]+.[0-9]+.[0-9]+-*' # Exclude pre-releases

Hotfix Releases

# Hotfix releases
on:
push:
tags:
- 'hotfix-*'

jobs:
hotfix-release:
steps:
- uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: ${{ github.ref_name }}
generateReleaseNotes: false # Manual notes for hotfixes

Feature Branch Releases

# Feature preview releases
on:
workflow_dispatch:
inputs:
branch:
description: 'Feature branch'
required: true

jobs:
feature-release:
steps:
- name: Create Feature Tag
run: git tag "feature-${{ inputs.branch }}-$(date +%s)"

- uses: ./actions/github/createRelease
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
tagName: "feature-${{ inputs.branch }}-$(date +%s)"
preRelease: true
isDraft: true

Troubleshooting

Common Issues

Release Creation Fails

  • Verify token has contents: write permission
  • Ensure tag exists and is accessible
  • Check repository exists and is accessible

Release Notes Generation Issues

  • Verify token has pull-requests: read permission
  • Check if repository has sufficient commit history
  • Ensure pull requests are properly labeled

Error Resolution

Permission Denied

# Ensure proper permissions
permissions:
contents: write
pull-requests: read

Tag Not Found

# Verify tag exists
git tag -l
git push origin --tags

Release Already Exists

The action will fail if a release for the tag already exists. Consider:

  • Using different tag names
  • Deleting existing releases if recreating
  • Implementing idempotent release logic

Best Practices

Tag Management

  1. Semantic Versioning: Use consistent version tagging (v1.2.3)
  2. Tag Protection: Protect release tags from deletion
  3. Automated Tagging: Use workflow automation for tag creation
  4. Tag Validation: Validate tag format before release creation

Security Considerations

  1. Token Security: Use repository secrets for tokens
  2. Permission Minimization: Use minimal required permissions
  3. Audit Trail: Monitor release creation activities
  4. Access Control: Limit who can create releases