NuGet package
Add via NuGetForUnity (recommended for Unity), a <PackageReference> in your .csproj,
or the dotnet CLI. Click Install for the full instructions.
CysharpActions README
Rendered from GitHubActions
Cysharp OSS repository uses and maintained GitHub Actions "reusable workflows" and "composite actions".
📖 Table of Contents
♻️ Reusable workflows
clean-packagejson-branch
Delete specic github branch. Mainly used for cleanup branch created by update-packagejson workflow. Action has following limitation to prevent accidental deletion.
- Branch is NOT default branch.
- Branch is created & commited by github-actions[bot].
Sample usage
name: Build-Release
on:
workflow_dispatch:
jobs:
cleanup:
permissions:
contents: write
uses: Cysharp/Actions/.github/workflows/clean-packagejson-branch.yaml@main
with:
branch: branch_name_to_delete
create-release
Create GitHub Release, upload NuGet and upload artifact to release assets. Mainly used for NuGet and Unity release workflow.
Required secrets.
| SecretKey | When | Description |
|---|---|---|
NUGET_KEY |
with.nuget-push is true |
This secret is required to push nupkg, snupkg to NuGet.org |
Sample usage
Create release only.
name: Build-Release
on:
workflow_dispatch:
inputs:
tag:
description: "tag: git tag you want create. (sample 1.0.0)"
required: true
dry-run:
description: "dry_run: true will never create release/nuget."
required: true
default: false
type: boolean
jobs:
create-release:
uses: Cysharp/Actions/.github/workflows/create-release.yaml@main
with:
commit-id: ''
tag: ${{ inputs.tag }}
dry-run: ${{ inputs.dry-run }} # if true, delete tag after Release creation & 60s later.
nuget-push: false
release-upload: false
secrets: inherit
Change release name not to use Ver. prefix.
name: Build-Release
on:
workflow_dispatch:
inputs:
tag:
description: "tag: git tag you want create. (sample 1.0.0)"
required: true
dry-run:
description: "dry_run: true will never create release/nuget."
required: true
default: false
type: boolean
jobs:
create-release:
uses: Cysharp/Actions/.github/workflows/create-release.yaml@main
with:
commit-id: ''
tag: ${{ inputs.tag }}
dry-run: ${{ inputs.dry-run }} # if true, delete tag after Release creation & 60s later.
nuget-push: false
release-upload: false
release-format: '{0}'
secrets: inherit
Download other workflows artifacts to upload to release assets.
name: Build-Release
on:
workflow_dispatch:
inputs:
tag:
description: "tag: git tag you want create. (sample 1.0.0)"
required: true
dry-run:
description: "dry_run: true will never create release/nuget."
required: true
default: false
type: boolean
jobs:
create-release:
uses: Cysharp/Actions/.github/workflows/create-release.yaml@main
with:
commit-id: ''
tag: ${{ inputs.tag }}
dry-run: ${{ inputs.dry-run }} # if true, delete tag after Release creation & 60s later.
nuget-push: false
release-upload: true
release-asset-path: |
./FooBar/win-amd64/FooBar.pdb
./FooBar/win-arm64/FooBar.pdb
download-run-id: '123456789' # specify run id to download artifacts from.
secrets: inherit
Build .NET then create release. create-release will push nuget packages.
name: Build-Release
on:
workflow_dispatch:
inputs:
tag:
description: "tag: git tag you want create. (sample 1.0.0)"
required: true
dry-run:
description: "dry_run: true will never create release/nuget."
required: true
default: false
type: boolean
jobs:
build-dotnet:
runs-on: ubuntu-24.04
timeout-minutes: 3
defaults:
run:
working-directory: ./Sandbox
steps:
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
- run: dotnet build -c Release -p:Version=${{ inputs.tag }}
- run: dotnet pack --no-build -c Release -p:Version=${{ inputs.tag }} -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -o ./publish
- name: upload artifacts
uses: Cysharp/Actions/.github/actionsupload-artifact@main
with:
name: nuget
path: ./Sandbox/publish
retention-days: 1
create-release:
needs: [build-dotnet]
uses: Cysharp/Actions/.github/workflows/create-release.yaml@main
with:
commit-id: ''
tag: ${{ inputs.tag }}
dry-run: ${{ inputs.dry-run }} # if true, delete tag after Release creation & 60s later.
nuget-push: true
release-upload: false
secrets: inherit # to allow workflow to access NUGET_KEY secret
Build .NET and Unity, then create release. create-release will push nuget packages and upload unitypackage to release assets.
name: Build-Release
on:
workflow_dispatch:
inputs:
tag:
description: "tag: git tag you want create. (sample 1.0.0)"
required: true
dry-run:
description: "dry_run: true will never create release/nuget."
required: true
default: false
type: boolean
jobs:
update-packagejson:
if: ${{ github.actor != 'dependabot[bot]' }}
permissions:
actions: read
contents: write
uses: Cysharp/Actions/.github/workflows/update-packagejson.yaml@main
with:
file-path: |
./Sandbox/Sandbox.Unity/Assets/Plugins/Foo/package.json
./Sandbox/Sandbox.Unity/Assets/Plugins/Foo.Plugin/package.json
./Sandbox/Sandbox.Godot/addons/Foo/plugin.cfg
./Sandbox/Directory.Build.props
tag: ${{ inputs.tag }}
use-bot-token: false # false to use GITHUB_TOKEN, true to use GitHub App token
dry-run: false
build-dotnet:
runs-on: ubuntu-24.04
timeout-minutes: 3
defaults:
run:
working-directory: ./Sandbox
steps:
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
- run: dotnet build -c Release -p:Version=${{ inputs.tag }}
- run: dotnet pack --no-build -c Release -p:Version=${{ inputs.tag }} -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -o ./publish
- name: upload artifacts
uses: Cysharp/Actions/.github/actionsupload-artifact@main
with:
name: nuget
path: ./Sandbox/publish
retention-days: 1
build-unity:
needs: [update-packagejson]
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- run: echo ${{ needs.update-packagejson.outputs.sha }}
- uses: actions/checkout@v4
with:
ref: ${{ needs.update-packagejson.outputs.sha }}
# Store artifacts.
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
with:
name: Sandbox.Unity.unitypackage
path: ./Sandbox/Sandbox.Unity/output/Sandbox.Unity.unitypackage
if-no-files-found: error
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
with:
name: Sandbox.Unity.Plugin.unitypackage
path: ./Sandbox/Sandbox.Unity/output/Sandbox.Unity.Plugin.unitypackage
if-no-files-found: error
create-release:
needs: [update-packagejson, build-dotnet, build-unity]
uses: Cysharp/Actions/.github/workflows/create-release.yaml@main
with:
commit-id: ${{ needs.update-packagejson.outputs.sha }}
tag: ${{ inputs.tag }}
dry-run: ${{ inputs.dry-run }} # if true, delete tag after Release creation & 60s later.
nuget-push: true
release-upload: true
release-asset-path: |
./Sandbox.Unity.unitypackage/Sandbox.Unity.unitypackage
./Sandbox.Unity.Plugin.unitypackage/Sandbox.Unity.Plugin.unitypackage
./nuget/ClassLibrary.${{ inputs.tag }}.nupkg
./nuget/ClassLibrary.${{ inputs.tag }}.snupkg
secrets: inherit # to allow workflow to access NUGET_KEY secret
cleanup:
if: ${{ needs.update-packagejson.outputs.is-branch-created == 'true' }}
needs: [update-packagejson]
permissions:
contents: write
uses: Cysharp/Actions/.github/workflows/clean-packagejson-branch.yaml@main
with:
branch: ${{ needs.update-packagejson.outputs.branch-name }}
dd-event-post
Post Datadog event.
- Use for Pull Request Merge event.
Sample usage
name: PR Merged
on:
pull_request:
types: [closed]
jobs:
post:
if: ${{ github.event.pull_request.merged == true }}
uses: Cysharp/Actions/.github/workflows/dd-event-post.yaml@main
secrets: inherit
increment-version
Update specified version file with incremented version. Mainly used for post-release workflow.
Sample usage
Following workflow will increment patch version from released tag and update specified package.json, plugin.cfg and Directory.Build.props files with new version with -dev suffix.
name: Post Release
on:
release:
types: [published]
jobs:
new-version:
permissions:
actions: read
contents: read
uses: Cysharp/Actions/.github/workflows/increment-version.yaml@main
with:
ref: ${{ github.event.repository.default_branch }}
tag: ${{ github.ref_name }} # tag value will here. 1.2.1
type: patch
suffix: "-dev"
update-packagejson:
needs: [new-version]
permissions:
actions: read
contents: write
uses: Cysharp/Actions/.github/workflows/update-packagejson.yaml@main
with:
ref: ${{ github.event.repository.default_branch }}
file-path: |
./Sandbox/Sandbox.Unity/Assets/Plugins/Foo/package.json
./Sandbox/Sandbox.Unity/Assets/Plugins/Foo.Plugin/package.json
./Sandbox/Sandbox.Godot/addons/Foo/plugin.cfg
./Sandbox/Directory.Build.props
tag: ${{ needs.new-version.outputs.version }}
use-bot-token: false # false to use GITHUB_TOKEN, true to use GitHub App token
dry-run: false
prevent-github-change
Prevent fork users to change files triggered by. Only Organization contributors can change these files.
Sample usage
name: Prevent github change
on:
pull_request:
paths:
- ".github/**/*.yaml"
- ".github/**/*.yml"
jobs:
detect:
permissions:
contents: read
uses: Cysharp/Actions/.github/workflows/prevent-github-change.yaml@main
stale-issue
Stale issue and PRs. Mainly used for Issue/PR management.
Sample usage
name: "Close stale issues"
on:
schedule:
- cron: "0 0 * * *"
jobs:
stale:
permissions:
contents: read
pull-requests: write
issues: write
uses: Cysharp/Actions/.github/workflows/stale-issue.yaml@main
update-packagejson
Update specified Unity package.json and Godot plugin.cfg version with tag version. Mainly used for UPM and Godot plugin release workflow.
Consider use GitHub App token, when your repository want's restrict direct push to default branch.
jobs:
use-bot-token:
permissions:
actions: read
contents: write
uses: Cysharp/Actions/.github/workflows/update-packagejson.yaml@main
with:
file-path: ./Sandbox/Sandbox.Unity/Assets/Plugins/Foo/package.json
tag: ${{ inputs.tag }}
use-bot-token: true # <-- Use GitHub App token
dry-run: ${{ inputs.dry-run }}
If you want to run dotnet run during workflow, you can specify dotnet-run-path input. Make sure arguments are always --version "{tag}".
jobs:
update-packagejson:
permissions:
actions: read
contents: write
uses: Cysharp/Actions/.github/workflows/update-packagejson.yaml@main
with:
file-path: ./Sandbox/Sandbox.Unity/Assets/Plugins/Foo/package.json
# you can write multi path.
dotnet-run-path: |
./Sandbox/Sandbox.Console/Sandbox.Console.csproj
tag: ${{ inputs.tag }}
use-bot-token: false
dry-run: ${{ inputs.dry-run }}
Sample usage
name: Build-Release
on:
workflow_dispatch:
inputs:
tag:
description: "tag: git tag you want create. (sample 1.0.0)"
required: true
dry-run:
description: "dry_run: true will never create release/nuget."
required: true
default: false
type: boolean
jobs:
update-packagejson:
permissions:
actions: read
contents: write
uses: Cysharp/Actions/.github/workflows/update-packagejson.yaml@main
with:
# you can write multi path.
file-path: |
./Sandbox/Sandbox.Unity/Assets/Plugins/Foo/package.json
./Sandbox/Sandbox.Godot/addons/Foo/plguin.cfg
./Sandbox/Directory.Build.props
tag: ${{ inputs.tag }}
use-bot-token: false # false to use GITHUB_TOKEN, true to use GitHub App token
dry-run: ${{ inputs.dry-run }}
build-unity:
needs: [update-packagejson]
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.update-packagejson.outputs.sha }} # use updated package.json
# use clean-packagejson-branch.yaml to delete dry-run branch.
cleanup:
if: ${{ needs.update-packagejson.outputs.is-branch-created == 'true' }}
needs: [update-packagejson]
permissions:
contents: write
uses: Cysharp/Actions/.github/workflows/clean-packagejson-branch.yaml@main
with:
branch: ${{ needs.update-packagejson.outputs.branch-name }}
validate-tag
Validate tag is newer than latest release tag.
Sample usage
name: "Validate release tag"
on:
workflow_dispatch:
inputs:
tag:
description: "tag: git tag you want create. (sample 1.0.0)"
required: true
require-validation:
description: "require-validation: true require validation must pass, false to keep going even validation failed."
required: false
type: boolean
default: true
jobs:
validate:
uses: Cysharp/Actions/.github/workflows/validate-tag.yaml@main
with:
tag: ${{ inputs.tag }}
require-validation: ${{ inputs.require-validation }} # true = exit 1 if tag is older than current release. false = keep going even failed.
test:
needs: [validate]
runs-on: ubuntu-24.04
steps:
- run: echo "${{ needs.validate.outputs.validated }}" # true or false
🎬 Actions
check-benchmarkable
Check if GitHub User is allow to run benchmark. Mainly used for benchmark CI workflow.
[!NOTE] This action is workaround for current
github.event.comment.author_associationinconsistence behavior.github.event.comment.author_associationshould returnOWNER,MEMBERorCORABORATORfor organization member, however currently it returnsCONTRIBUTOReven actor is Org member. It meansgithub.event.comment.author_associationcan't be used to check if actor is Org member == "benchmark command allowed user" or not. This action checks if actor is Benchmark allowd by statically defined list, lol.
sample usage
name: benchmark
jobs:
# is actor is benchmarkable
verify:
if: ${{ github.event_name == 'workflow_dispatch' || contains(github.event.comment.body, '/benchmark') }}
outputs:
is-benchmarkable: ${{ steps.is-benchmarkable.outputs.authorized }} # true or false
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Check actor is benchmarkable
id: is-benchmarkable
uses: Cysharp/Actions/.github/actions/check-benchmarkable@main
with:
username: ${{ github.actor }}
# run benchmark
benchmark:
needs: [verify]
if: ${{ needs.verify.outputs.is-benchmarkable == 'true' }}
environment: benchmark # required for Azure login
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- run: echo "run benchmark"
check-metas
Check Unity .meta files are not generated. Mainly used for Unity CI workflow.
Sample usage
name: build-debug
on:
push:
branches:
- main
jobs:
build-unity:
name: "Build Unity package"
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
# Any actions that create .meta when it was not comitted.
- name: Unity Build
run: touch ./Sandbox/Sandbox.Unity/Assets/Scene1.unity.meta
- name: Check all .meta is comitted
uses: Cysharp/Actions/.github/actions/check-metas@main
with:
directory: ./Sandbox/Sandbox.Unity
checkout
Wrapper of actions/checkout to offer centrlral managed checkout by sha pinning.
Sample usage
name: build-debug
on:
push:
branches:
- main
jobs:
build-unity:
name: "Build Unity package"
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
# - uses: actions/checkout@v4
- use: Cysharp/Actions/.github/actions/checkout@main
# Any actions that create .meta when it was not comitted.
- name: Unity Build
run: touch ./Sandbox/Sandbox.Unity/Assets/Scene1.unity.meta
- name: Check all .meta is comitted
uses: Cysharp/Actions/.github/actions/check-metas@main
with:
directory: ./Sandbox/Sandbox.Unity
download-artifact
Wrapper of actions/download-artifact to offer default value and consistent action versioning. Mainly used for Release artifact.
[!TIP] See upload-artifact for upload.
Sample usage
name: build-debug
on:
push:
branches:
- main
jobs:
# must prepare upload-artifact
download-artifact:
needs: [upload-artifact]
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/download-artifact@main
with:
name: my-artifact
- name: Display structure of downloaded files
run: ls -R
setup-dotnet
Wrapper of actions/setup-dotnet to offer default value and consistent action versioning and Environment variables. Mainly used for .NET CI workflow.
Sample usage
name: build-debug
on:
push:
branches:
- main
jobs:
dotnet-build:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
unity-builder
Build Unity projects for different platforms.
Sample usage
name: build-debug
on:
push:
branches:
- main
jobs:
dotnet-build:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
# execute scripts/Export Package
# /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export
- name: Build Unity (.unitypacakge)
uses: Cysharp/Actions/.github/actions/unity-builder@main
with:
projectPath: src/MyProject.Unity
unityVersion: "2020.3.33f1"
targetPlatform: StandaloneLinux64
buildMethod: PackageExporter.Export
versioning: None
upload-artifact
Wrapper of actions/upload-artifact to offer default value and consistent action versioning. Mainly used for Release artifact.
[!TIP] See download-artifact for download.
Sample usage
name: build-debug
on:
push:
branches:
- main
jobs:
upload-artifact:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: mkdir -p path/to/artifact
- run: echo hello > path/to/artifact/world.txt
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
with:
name: my-artifact
path: path/to/artifact/world.txt
Versions 0
No versions tracked yet.
Dependencies 0
No dependencies.
Changelog 0 releases
No changelog entries yet. Run the admin Changelog & Version Scanner to pull from the repository's CHANGELOG.md.
README Markdown
Copy this to your project's README.md
## Installation
Add **CysharpActions** to your Unity project via Package Manager:
1. Open **Window > Package Manager**
2. Click **+** > **Add package from git URL**
3. Enter:
```
https://www.pkglnk.dev/actions.git
```
[](https://www.pkglnk.dev/pkg/actions)Embed badge README snippet
[](https://www.pkglnk.dev/pkg/actions) <a href="https://www.pkglnk.dev/pkg/actions"><img src="https://www.pkglnk.dev/badge/actions.svg" alt="pkglnk installs"></a> https://www.pkglnk.dev/badge/actions.svg Comments
No comments yet. Be the first!


Sign in to join the conversation
Sign In