A comprehensive collection of reusable GitHub Actions workflows designed specifically for game development pipelines. These workflows provide seamless automation for building, testing, formatting, and releasing Unity, Godot, and .NET projects across multiple platforms including Android, iOS, Windows, macOS, and Linux.
Key Differentiators:
- Game Engine Focused: Purpose-built workflows for Unity and Godot with deep integration support
- Cross-Platform: Native support for mobile (Android, iOS), desktop (Windows, macOS, Linux), and web platforms
- Production Ready: Battle-tested workflows with extensive error handling, caching, and retry logic
- Unified Workflows: Single workflows handle Godot and Unity projects with consistent inputs
Ideal For:
- Game studios automating their CI/CD pipeline
- Independent developers needing reliable build automation
- Teams requiring consistent cross-platform builds
- Projects targeting mobile platforms with automated distribution
- Multi-Engine Support: Seamless integration with Unity, Godot, and .NET projects
- Mobile Builds: Full Android and iOS build support with code signing
- Automated Testing: Run unit tests and validation across all platforms
- Code Formatting: Automatic formatting for C#, YAML, JSON, Markdown, and Shell scripts
- Package Management: Create NuGet packages, Unity packages, and Godot addons
- Distribution: Publish to Firebase, TestFlight, NuGet, and GitHub Releases
- Smart Caching: Intelligent caching for Unity, Godot, .NET, and build dependencies
- Version Management: Automatic version bumping and changelog generation
GitHub Runners:
ubuntu-latest- For .NET, Android, Godot, and package buildsmacos-latest- Required for iOS and macOS builds
Additional Requirements:
- Secrets configured for signing (keystores, certificates, provisioning profiles)
- Unity license keys for engine-specific builds
global.jsonfile for .NET and Godot C# projects
These workflows are designed to be used directly in your GitHub repositories. No installation is required - simply reference the workflows in your workflow files.
Add workflows to your .github/workflows directory:
name: Release
on:
push:
branches: [main]
jobs:
release:
uses: grovegs/workflows/.github/workflows/project-release.yml@v1.0.0
with:
project-name: "My Game"
godot-project: games/MyGame
version-type: minor
global-json-file: global.json
secrets:
github-token: ${{ secrets.GITHUB_TOKEN }}
firebase-credentials: ${{ secrets.FIREBASE_CREDENTIALS }}
firebase-app-id-android: ${{ secrets.FIREBASE_APP_ID_ANDROID }}
android-keystore: ${{ secrets.ANDROID_KEYSTORE }}
android-keystore-user: ${{ secrets.ANDROID_KEYSTORE_USER }}
android-keystore-password: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}Build and release a Godot project:
name: Release Godot Game
on:
workflow_dispatch:
inputs:
version-type:
description: "Version bump type"
required: true
type: choice
options:
- major
- minor
- patch
permissions:
contents: write
jobs:
release:
uses: grovegs/workflows/.github/workflows/project-release.yml@v1.0.0
with:
project-name: My Game
godot-project: games/MyGame
version-type: ${{ inputs.version-type }}
global-json-file: global.json
tester-groups: qa-team
publish-github: true
publish-firebase: true
publish-discord: true
secrets:
github-token: ${{ secrets.GITHUB_TOKEN }}
discord-webhook: ${{ secrets.DISCORD_WEBHOOK }}
firebase-credentials: ${{ secrets.FIREBASE_CREDENTIALS }}
firebase-app-id-android: ${{ secrets.FIREBASE_APP_ID_ANDROID }}
firebase-app-id-ios: ${{ secrets.FIREBASE_APP_ID_IOS }}
android-keystore: ${{ secrets.ANDROID_KEYSTORE }}
android-keystore-user: ${{ secrets.ANDROID_KEYSTORE_USER }}
android-keystore-password: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ios-team-id: ${{ secrets.IOS_TEAM_ID }}
ios-certificate: ${{ secrets.IOS_CERTIFICATE }}
ios-certificate-password: ${{ secrets.IOS_CERTIFICATE_PASSWORD }}
ios-provisioning-profile: ${{ secrets.IOS_PROVISIONING_PROFILE }}
ios-api-key: ${{ secrets.IOS_API_KEY }}
ios-api-key-id: ${{ secrets.IOS_API_KEY_ID }}
ios-api-issuer-id: ${{ secrets.IOS_API_ISSUER_ID }}Build and release a Unity project:
name: Release Unity Game
on:
workflow_dispatch:
inputs:
version-type:
required: true
type: choice
options: [major, minor, patch]
permissions:
contents: write
jobs:
release:
uses: grovegs/workflows/.github/workflows/project-release.yml@v1.0.0
with:
project-name: My Unity Game
unity-project: projects/MainGame
version-type: ${{ inputs.version-type }}
publish-github: true
publish-firebase: true
publish-testflight: true
secrets:
github-token: ${{ secrets.GITHUB_TOKEN }}
unity-email: ${{ secrets.UNITY_EMAIL }}
unity-password: ${{ secrets.UNITY_PASSWORD }}
unity-license-key: ${{ secrets.UNITY_LICENSE }}
firebase-credentials: ${{ secrets.FIREBASE_CREDENTIALS }}
firebase-app-id-android: ${{ secrets.FIREBASE_APP_ID_ANDROID }}
firebase-app-id-ios: ${{ secrets.FIREBASE_APP_ID_IOS }}
android-keystore: ${{ secrets.ANDROID_KEYSTORE }}
android-keystore-user: ${{ secrets.ANDROID_KEYSTORE_USER }}
android-keystore-password: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ios-team-id: ${{ secrets.IOS_TEAM_ID }}
ios-certificate: ${{ secrets.IOS_CERTIFICATE }}
ios-certificate-password: ${{ secrets.IOS_CERTIFICATE_PASSWORD }}
ios-provisioning-profile: ${{ secrets.IOS_PROVISIONING_PROFILE }}
ios-api-key: ${{ secrets.IOS_API_KEY }}
ios-api-key-id: ${{ secrets.IOS_API_KEY_ID }}
ios-api-issuer-id: ${{ secrets.IOS_API_ISSUER_ID }}Build and publish a NuGet package:
name: Release Package
on:
workflow_dispatch:
inputs:
version-type:
required: true
type: choice
options: [major, minor, patch]
permissions:
contents: write
jobs:
release:
uses: grovegs/workflows/.github/workflows/package-release.yml@v1.0.0
with:
package-name: My Library
dotnet-project: src/Core
version-type: ${{ inputs.version-type }}
global-json-file: global.json
publish-github: true
publish-nuget: true
secrets:
github-token: ${{ secrets.GITHUB_TOKEN }}
nuget-api-key: ${{ secrets.NUGET_API_KEY }}Package and release a Godot addon:
name: Release Godot Package
on:
workflow_dispatch:
inputs:
version-type:
required: true
type: choice
options: [major, minor, patch]
permissions:
contents: write
jobs:
release:
uses: grovegs/workflows/.github/workflows/package-release.yml@v1.0.0
with:
package-name: My Godot Plugin
dotnet-project: src/Core
godot-addon: addons/my-plugin
version-type: ${{ inputs.version-type }}
global-json-file: global.json
publish-github: true
publish-nuget: true
secrets:
github-token: ${{ secrets.GITHUB_TOKEN }}
nuget-api-key: ${{ secrets.NUGET_API_KEY }}project-release.yml - Build and release game projects
- Supports: Godot and Unity projects
- Platforms: Android (APK/AAB), iOS (IPA)
- Publishing: Firebase, TestFlight, GitHub Releases
- Inputs:
project-name- Project nameversion-type- major, minor, or patchgodot-project- Path to Godot projectunity-project- Path to Unity projectglobal-json-file- Path to global.jsontester-groups- Firebase tester groupsbuild-android- Enable Android buildsbuild-ios- Enable iOS buildspublish-github- Publish to GitHubpublish-firebase- Publish to Firebasepublish-testflight- Publish to TestFlightpublish-discord- Send Discord notifications
project-tests.yml - Run tests for game projects
- Inputs:
dotnet-project- Path to .NET test projectgodot-project- Path to Godot projectunity-project- Path to Unity projectglobal-json-file- Path to global.json
project-format.yml - Format game project code
- Inputs:
files- File patterns to format using Prettierdotnet-project- Path to .NET projectglobal-json-file- Path to global.json
package-release.yml - Build and publish packages
- Supports: .NET projects, Godot addons, Unity packages
- Publishing: NuGet, GitHub Releases
- Inputs:
package-name- Package nameversion-type- major, minor, or patchdotnet-project- Path to .NET projectgodot-addon- Path to Godot addonunity-package- Path to Unity packageglobal-json-file- Path to global.jsondirectory-build-props- Path to Directory.Build.propspublish-github- Publish to GitHubpublish-nuget- Publish to NuGetpublish-discord- Send Discord notifications
package-tests.yml - Run tests for packages
- Inputs:
dotnet-project- Path to .NET test projectglobal-json-file- Path to global.json
package-format.yml - Format package code
- Inputs:
files- File patterns to format using Prettierdotnet-project- Path to .NET projectglobal-json-file- Path to global.json
Disable specific platforms:
jobs:
release:
uses: grovegs/workflows/.github/workflows/project-release.yml@v1.0.0
with:
project-name: My Game
godot-project: games/MyGame
version-type: patch
build-android: true
build-ios: falseChoose specific publishing targets:
jobs:
release:
uses: grovegs/workflows/.github/workflows/project-release.yml@v1.0.0
with:
project-name: My Game
godot-project: games/MyGame
version-type: minor
publish-firebase: true
publish-testflight: falsejobs:
release:
uses: grovegs/workflows/.github/workflows/package-release.yml@v1.0.0
with:
package-name: My SDK
dotnet-project: src/Core
godot-addon: addons/my-plugin
unity-package: Packages/com.example.package
version-type: minor
global-json-file: global.jsonname: Test
on:
pull_request:
branches: [main, develop]
jobs:
test:
uses: grovegs/workflows/.github/workflows/project-tests.yml@v1.0.0
with:
godot-project: games/MyGame
dotnet-project: tests/MyGame.Tests
global-json-file: global.jsonname: Format
on:
push:
branches: [main, develop]
permissions:
contents: write
jobs:
format:
uses: grovegs/workflows/.github/workflows/project-format.yml@v1.0.0
with:
dotnet-project: src/MyProject
global-json-file: global.jsonRequired for all .NET-based projects (Godot C#, .NET packages):
{
"sdk": {
"rollForward": "major",
"version": "8.0.401"
},
"msbuild-sdks": {
"Godot.NET.Sdk": "4.3.0"
}
}Unity projects must use Build Profiles for each platform and environment:
Android DevelopmentAndroid ProductioniOS DevelopmentiOS Production
Godot projects must have export presets configured in export_presets.cfg:
Android DevelopmentAndroid ProductioniOS DevelopmentiOS Production
All workflows follow a consistent pattern:
- Prepare Release - Bump version and generate changelog
- Build Projects - Build each project for each platform using matrix strategy
- Upload Artifacts - Upload build files to GitHub artifacts
- Publish - Distribute builds to Firebase/TestFlight and create GitHub release
- Notify - Send Discord notifications
- Prepare Release - Bump version and generate changelog
- Pack Projects - Build and package each project using matrix strategy
- Upload Artifacts - Upload packages to GitHub artifacts
- Publish - Publish packages to NuGet and create GitHub release
- Commit Changes - Commit version changes back to repository
- Notify - Send Discord notifications
Keystore must be base64 encoded:
base64 -i your-keystore.jks | pbcopy # macOS
base64 -i your-keystore.jks # LinuxThen add as a secret: ANDROID_KEYSTORE
Missing or incorrect provisioning profile configuration.
Ensure all iOS secrets are properly configured:
IOS_TEAM_ID: Your Apple Developer Team ID
IOS_CERTIFICATE: Base64-encoded .p12 certificate
IOS_CERTIFICATE_PASSWORD: Certificate password
IOS_PROVISIONING_PROFILE: Base64-encoded .mobileprovision fileFor TestFlight uploads, also configure:
IOS_API_KEY: Base64-encoded App Store Connect API .p8 key
IOS_API_KEY_ID: API Key ID
IOS_API_ISSUER_ID: API Issuer IDMissing or incorrect Git tags.
Ensure your repository has at least one Git tag in semantic versioning format:
git tag v0.1.0
git push origin v0.1.0Caching is automatically enabled for main/develop branches. Ensure your branch name matches:
cache: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop' }}If you encounter issues not listed here:
- Check existing issues
- Open a new issue with:
- Workflow name and version
- Complete workflow file
- Error logs
- Contact us at support@grove.gs
Contributions are welcome! We appreciate your help in making this project better.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Write or update tests in
tests.yml - Test against sandbox applications
- Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow existing code style and conventions
- Test workflows against sandbox applications
- Update documentation as needed
- Keep commits focused and atomic
- Write clear commit messages following Conventional Commits
- Ensure bash scripts are compatible with bash 3.2+ (macOS compatibility)
# Clone the repository
git clone https://github.com/grovegs/workflows.git
# Navigate to directory
cd workflows
# Test workflows using sandbox applications
gh workflow run tests.ymlAll workflow changes must be tested using the sandbox applications:
sandbox/GodotApplication/- Godot C# projectsandbox/ConsoleApplication/- .NET console application
The tests.yml workflow validates all workflows automatically.
- 🐛 Issue Tracker - Report bugs or request features
- 📧 support@grove.gs - Email support
- 🌐 grove.gs - Official website
This project is licensed under the MIT License - see the LICENSE file for details.