5 Commits
5 changed files with 61 additions and 39 deletions
+9 -10
View File
@@ -21,12 +21,12 @@ on: [push]
jobs: jobs:
export: export:
runs-on: linux runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- id: godot-export - id: godot-export
uses: https://gitea.example.com/your-org/godot-export-action@v1 uses: https://git.omgitsalexl.me/omgitsalexl/godot-export-action@v1
with: with:
godot-version: 4.7.2-stable godot-version: 4.7.2-stable
host-os: linux host-os: linux
@@ -36,9 +36,7 @@ jobs:
export-mode: release export-mode: release
export-file-name: my-game.exe export-file-name: my-game.exe
# On Gitea Runner 2.x, use the Gitea artifact fork. Newer runners can - uses: actions/upload-artifact@v4
# use the artifact action supported by your installation.
- uses: https://github.com/christopherhx/gitea-upload-artifact@v4
with: with:
name: my-game name: my-game
path: ${{ steps.godot-export.outputs.build-directory }} path: ${{ steps.godot-export.outputs.build-directory }}
@@ -50,14 +48,14 @@ The uploaded artifact is the whole build folder, so companion files such as a `.
| Input | Required | Default | Description | | Input | Required | Default | Description |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `godot-version` | Yes | — | The Godot 4 release tag to use, without the leading `v`; for example, `4.7.2-stable`. | | `godot-version` | Yes | — | A stable Godot 4 release tag, without the leading `v`; for example, `4.7.2-stable`. Alpha, beta, RC, and dev tags are unsupported. |
| `host-os` | Yes | — | The machine running the job: `linux`, `macos`, or `windows`. The action checks this before it starts. | | `host-os` | Yes | — | The machine running the job: `linux`, `macos`, or `windows`. The action checks this before it starts. |
| `host-arch` | Yes | — | The runner's architecture. Linux supports `x86_32`, `x86_64`, `arm32`, and `arm64`; Windows supports `x86_32`, `x86_64`, and `arm64`; macOS supports `x86_64` and `arm64`. | | `host-arch` | Yes | — | The runner's architecture. Linux supports `x86_32`, `x86_64`, `arm32`, and `arm64`; Windows supports `x86_32`, `x86_64`, and `arm64`; macOS supports `x86_64` and `arm64`. |
| `export-preset` | Yes | — | The preset name exactly as it appears in `export_presets.cfg`. |
| `export-file-name` | Yes | — | The name of the exported file, such as `my-game.exe` or `my-game.zip`. Use the extension your target expects. |
| `dotnet` | No | `false` | Set this to `true` for a Godot .NET/C# project. | | `dotnet` | No | `false` | Set this to `true` for a Godot .NET/C# project. |
| `project-path` | No | `.` | Where your Godot project sits inside the checked-out repository. | | `project-path` | No | `.` | Where your Godot project sits inside the checked-out repository. |
| `export-preset` | Yes | — | The preset name exactly as it appears in `export_presets.cfg`. | | `export-mode` | No | `debug` | Choose `release` for a shipping build or `debug` for a debug build. |
| `export-mode` | No | `release` | Choose `release` for a shipping build or `debug` for a debug build. |
| `export-file-name` | Yes | — | The name of the exported file, such as `my-game.exe` or `my-game.zip`. Use the extension your target expects. |
| `cache` | No | `true` | Set to `false` if you need a completely fresh Godot download for a run. | | `cache` | No | `true` | Set to `false` if you need a completely fresh Godot download for a run. |
## Outputs ## Outputs
@@ -69,7 +67,8 @@ The uploaded artifact is the whole build folder, so companion files such as a `.
## A few helpful notes ## A few helpful notes
- Your project needs both `project.godot` and `export_presets.cfg`. Preset names with spaces, such as `Windows Desktop`, are fine. - Your project needs both `project.godot` and `export_presets.cfg`. Preset names with spaces, such as `Windows Desktop`, are fine.
- Downloads are checked against Godot's published `SHA512-SUMS.txt` file before anything is extracted. - Editor and template downloads come from the [official Godot stable-release assets](https://github.com/godotengine/godot/releases) and are checked against that release's `SHA512-SUMS.txt` before anything is extracted. If a release does not provide an editor for the requested runner architecture, the action fails before downloading either archive.
- Linux ARM downloads require Godot 4.2 or newer; Windows ARM64 downloads require Godot 4.3 or newer. macOS uses the universal editor archive on both supported architectures.
- On Linux, make sure the runner has `curl`, `unzip`, and `sha512sum`. macOS needs `curl`, `unzip`, and `shasum`. Windows uses the archive and hashing tools built into PowerShell. - On Linux, make sure the runner has `curl`, `unzip`, and `sha512sum`. macOS needs `curl`, `unzip`, and `shasum`. Windows uses the archive and hashing tools built into PowerShell.
- The cache includes the editor and the full export-template package. Gitea keeps that cache on each runner by default; an administrator can configure shared storage if several runners should reuse it. - The cache includes the editor and the full export-template package. Gitea keeps that cache on each runner by default; an administrator can configure shared storage if several runners should reuse it.
- This action installs Godot, not every SDK around it. Android, iOS, console, and other platform-specific presets may still need their own SDKs, credentials, or signing setup on the runner. - This action installs Godot, not every SDK around it. Android, iOS, console, and other platform-specific presets may still need their own SDKs, credentials, or signing setup on the runner.
+5 -5
View File
@@ -3,7 +3,7 @@ description: Download and cache Godot 4, install export templates, and export a
inputs: inputs:
godot-version: godot-version:
description: Exact Godot 4 release tag without a leading v (for example, 4.6.1-stable). description: Exact stable Godot 4 release tag without a leading v (for example, 4.6.1-stable). Prerelease tags are unsupported.
required: true required: true
host-os: host-os:
description: "Runner operating system: linux, macos, or windows." description: "Runner operating system: linux, macos, or windows."
@@ -25,7 +25,7 @@ inputs:
export-mode: export-mode:
description: "Export mode: release or debug." description: "Export mode: release or debug."
required: false required: false
default: release default: debug
export-file-name: export-file-name:
description: Output filename only, including its platform-appropriate extension. description: Output filename only, including its platform-appropriate extension.
required: true required: true
@@ -51,7 +51,7 @@ runs:
- name: Export Godot project on Linux - name: Export Godot project on Linux
id: export-linux id: export-linux
if: ${{ runner.os == 'Linux' }} if: ${{ runner.os == 'linux' }}
shell: bash shell: bash
env: env:
GODOT_VERSION: "${{ inputs.godot-version }}" GODOT_VERSION: "${{ inputs.godot-version }}"
@@ -67,7 +67,7 @@ runs:
- name: Export Godot project on macOS - name: Export Godot project on macOS
id: export-macos id: export-macos
if: ${{ runner.os == 'macOS' }} if: ${{ runner.os == 'macos' }}
shell: bash shell: bash
env: env:
GODOT_VERSION: "${{ inputs.godot-version }}" GODOT_VERSION: "${{ inputs.godot-version }}"
@@ -83,7 +83,7 @@ runs:
- name: Export Godot project on Windows - name: Export Godot project on Windows
id: export-windows id: export-windows
if: ${{ runner.os == 'Windows' }} if: ${{ runner.os == 'windows' }}
shell: powershell shell: powershell
env: env:
GODOT_VERSION: "${{ inputs.godot-version }}" GODOT_VERSION: "${{ inputs.godot-version }}"
+19 -8
View File
@@ -16,7 +16,7 @@ require_environment() {
} }
validate_common_inputs() { validate_common_inputs() {
[[ "$GODOT_VERSION" =~ ^4(\.[0-9]+){1,2}(-[0-9A-Za-z][0-9A-Za-z._-]*)?$ ]] || fail "godot-version must be a Godot 4 release tag such as 4.7.2-stable." [[ "$GODOT_VERSION" =~ ^4(\.[0-9]+){1,2}-stable$ ]] || fail "godot-version must be a stable Godot 4 tag such as 4.7.2-stable. Alpha, beta, RC, and dev tags are not supported."
[[ "$GODOT_HOST_OS" == "linux" ]] || fail "host-os must be 'linux' when this action runs on Linux." [[ "$GODOT_HOST_OS" == "linux" ]] || fail "host-os must be 'linux' when this action runs on Linux."
[[ "$GODOT_DOTNET" == "true" || "$GODOT_DOTNET" == "false" ]] || fail "dotnet must be 'true' or 'false'." [[ "$GODOT_DOTNET" == "true" || "$GODOT_DOTNET" == "false" ]] || fail "dotnet must be 'true' or 'false'."
[[ "$GODOT_EXPORT_MODE" == "release" || "$GODOT_EXPORT_MODE" == "debug" ]] || fail "export-mode must be 'release' or 'debug'." [[ "$GODOT_EXPORT_MODE" == "release" || "$GODOT_EXPORT_MODE" == "debug" ]] || fail "export-mode must be 'release' or 'debug'."
@@ -35,16 +35,23 @@ actual_architecture() {
esac esac
} }
release_asset_checksum() {
local asset="$1"
local sum_file="$2"
local expected
expected="$(awk -v asset="$asset" '$2 == asset || $2 == "*" asset { print $1; exit }' "$sum_file")"
[[ -n "$expected" ]] || fail "Godot $GODOT_VERSION does not publish required $EDITION asset '$asset' for Linux/$GODOT_HOST_ARCH at $BASE_URL. Choose a supported stable release and architecture."
printf '%s\n' "$expected"
}
download_and_verify() { download_and_verify() {
local asset="$1" local asset="$1"
local destination="$2" local destination="$2"
local sum_file="$3" local expected="$3"
local expected
local actual local actual
curl --fail --location --retry 3 --silent --show-error "$BASE_URL/$asset" --output "$destination" curl --fail --location --retry 3 --silent --show-error "$BASE_URL/$asset" --output "$destination"
expected="$(awk -v asset="$asset" '$2 == asset || $2 == "*" asset { print $1; exit }' "$sum_file")"
[[ -n "$expected" ]] || fail "Release checksum manifest does not contain $asset."
actual="$(sha512sum "$destination" | awk '{ print $1 }')" actual="$(sha512sum "$destination" | awk '{ print $1 }')"
[[ "$actual" == "$expected" ]] || fail "SHA-512 verification failed for $asset." [[ "$actual" == "$expected" ]] || fail "SHA-512 verification failed for $asset."
} }
@@ -57,12 +64,16 @@ install_godot() {
local sum_file="$CACHE_DIR/SHA512-SUMS.txt" local sum_file="$CACHE_DIR/SHA512-SUMS.txt"
local editor_archive="$CACHE_DIR/$EDITOR_ASSET" local editor_archive="$CACHE_DIR/$EDITOR_ASSET"
local templates_archive="$CACHE_DIR/$TEMPLATES_ASSET" local templates_archive="$CACHE_DIR/$TEMPLATES_ASSET"
local editor_checksum
local templates_checksum
rm -rf "$CACHE_DIR" rm -rf "$CACHE_DIR"
mkdir -p "$EDITOR_DIR" "$TEMPLATE_DIR" mkdir -p "$EDITOR_DIR" "$TEMPLATE_DIR"
curl --fail --location --retry 3 --silent --show-error "$BASE_URL/SHA512-SUMS.txt" --output "$sum_file" curl --fail --location --retry 3 --silent --show-error "$BASE_URL/SHA512-SUMS.txt" --output "$sum_file"
download_and_verify "$EDITOR_ASSET" "$editor_archive" "$sum_file" editor_checksum="$(release_asset_checksum "$EDITOR_ASSET" "$sum_file")"
download_and_verify "$TEMPLATES_ASSET" "$templates_archive" "$sum_file" templates_checksum="$(release_asset_checksum "$TEMPLATES_ASSET" "$sum_file")"
download_and_verify "$EDITOR_ASSET" "$editor_archive" "$editor_checksum"
download_and_verify "$TEMPLATES_ASSET" "$templates_archive" "$templates_checksum"
unzip -q "$editor_archive" -d "$EDITOR_DIR" unzip -q "$editor_archive" -d "$EDITOR_DIR"
unzip -q "$templates_archive" -d "$TEMPLATE_DIR" unzip -q "$templates_archive" -d "$TEMPLATE_DIR"
EDITOR_EXECUTABLE="$(find_editor)" EDITOR_EXECUTABLE="$(find_editor)"
@@ -113,7 +124,7 @@ else
TEMPLATES_ASSET="Godot_v${GODOT_VERSION}_export_templates.tpz" TEMPLATES_ASSET="Godot_v${GODOT_VERSION}_export_templates.tpz"
fi fi
BASE_URL="https://github.com/godotengine/godot-builds/releases/download/$GODOT_VERSION" BASE_URL="https://github.com/godotengine/godot/releases/download/$GODOT_VERSION"
TEMPLATE_VERSION="${GODOT_VERSION//-/.}" TEMPLATE_VERSION="${GODOT_VERSION//-/.}"
CACHE_DIR="$GODOT_ACTION_ROOT/cache/$GODOT_VERSION/$EDITION/linux-$GODOT_HOST_ARCH" CACHE_DIR="$GODOT_ACTION_ROOT/cache/$GODOT_VERSION/$EDITION/linux-$GODOT_HOST_ARCH"
EDITOR_DIR="$CACHE_DIR/editor" EDITOR_DIR="$CACHE_DIR/editor"
+19 -8
View File
@@ -16,7 +16,7 @@ require_environment() {
} }
validate_common_inputs() { validate_common_inputs() {
[[ "$GODOT_VERSION" =~ ^4(\.[0-9]+){1,2}(-[0-9A-Za-z][0-9A-Za-z._-]*)?$ ]] || fail "godot-version must be a Godot 4 release tag such as 4.7.2-stable." [[ "$GODOT_VERSION" =~ ^4(\.[0-9]+){1,2}-stable$ ]] || fail "godot-version must be a stable Godot 4 tag such as 4.7.2-stable. Alpha, beta, RC, and dev tags are not supported."
[[ "$GODOT_HOST_OS" == "macos" ]] || fail "host-os must be 'macos' when this action runs on macOS." [[ "$GODOT_HOST_OS" == "macos" ]] || fail "host-os must be 'macos' when this action runs on macOS."
[[ "$GODOT_DOTNET" == "true" || "$GODOT_DOTNET" == "false" ]] || fail "dotnet must be 'true' or 'false'." [[ "$GODOT_DOTNET" == "true" || "$GODOT_DOTNET" == "false" ]] || fail "dotnet must be 'true' or 'false'."
[[ "$GODOT_EXPORT_MODE" == "release" || "$GODOT_EXPORT_MODE" == "debug" ]] || fail "export-mode must be 'release' or 'debug'." [[ "$GODOT_EXPORT_MODE" == "release" || "$GODOT_EXPORT_MODE" == "debug" ]] || fail "export-mode must be 'release' or 'debug'."
@@ -33,16 +33,23 @@ actual_architecture() {
esac esac
} }
release_asset_checksum() {
local asset="$1"
local sum_file="$2"
local expected
expected="$(awk -v asset="$asset" '$2 == asset || $2 == "*" asset { print $1; exit }' "$sum_file")"
[[ -n "$expected" ]] || fail "Godot $GODOT_VERSION does not publish required $EDITION asset '$asset' for macOS/$GODOT_HOST_ARCH at $BASE_URL. Choose a supported stable release and architecture."
printf '%s\n' "$expected"
}
download_and_verify() { download_and_verify() {
local asset="$1" local asset="$1"
local destination="$2" local destination="$2"
local sum_file="$3" local expected="$3"
local expected
local actual local actual
curl --fail --location --retry 3 --silent --show-error "$BASE_URL/$asset" --output "$destination" curl --fail --location --retry 3 --silent --show-error "$BASE_URL/$asset" --output "$destination"
expected="$(awk -v asset="$asset" '$2 == asset || $2 == "*" asset { print $1; exit }' "$sum_file")"
[[ -n "$expected" ]] || fail "Release checksum manifest does not contain $asset."
actual="$(shasum -a 512 "$destination" | awk '{ print $1 }')" actual="$(shasum -a 512 "$destination" | awk '{ print $1 }')"
[[ "$actual" == "$expected" ]] || fail "SHA-512 verification failed for $asset." [[ "$actual" == "$expected" ]] || fail "SHA-512 verification failed for $asset."
} }
@@ -55,12 +62,16 @@ install_godot() {
local sum_file="$CACHE_DIR/SHA512-SUMS.txt" local sum_file="$CACHE_DIR/SHA512-SUMS.txt"
local editor_archive="$CACHE_DIR/$EDITOR_ASSET" local editor_archive="$CACHE_DIR/$EDITOR_ASSET"
local templates_archive="$CACHE_DIR/$TEMPLATES_ASSET" local templates_archive="$CACHE_DIR/$TEMPLATES_ASSET"
local editor_checksum
local templates_checksum
rm -rf "$CACHE_DIR" rm -rf "$CACHE_DIR"
mkdir -p "$EDITOR_DIR" "$TEMPLATE_DIR" mkdir -p "$EDITOR_DIR" "$TEMPLATE_DIR"
curl --fail --location --retry 3 --silent --show-error "$BASE_URL/SHA512-SUMS.txt" --output "$sum_file" curl --fail --location --retry 3 --silent --show-error "$BASE_URL/SHA512-SUMS.txt" --output "$sum_file"
download_and_verify "$EDITOR_ASSET" "$editor_archive" "$sum_file" editor_checksum="$(release_asset_checksum "$EDITOR_ASSET" "$sum_file")"
download_and_verify "$TEMPLATES_ASSET" "$templates_archive" "$sum_file" templates_checksum="$(release_asset_checksum "$TEMPLATES_ASSET" "$sum_file")"
download_and_verify "$EDITOR_ASSET" "$editor_archive" "$editor_checksum"
download_and_verify "$TEMPLATES_ASSET" "$templates_archive" "$templates_checksum"
unzip -q "$editor_archive" -d "$EDITOR_DIR" unzip -q "$editor_archive" -d "$EDITOR_DIR"
unzip -q "$templates_archive" -d "$TEMPLATE_DIR" unzip -q "$templates_archive" -d "$TEMPLATE_DIR"
EDITOR_EXECUTABLE="$(find_editor)" EDITOR_EXECUTABLE="$(find_editor)"
@@ -111,7 +122,7 @@ else
TEMPLATES_ASSET="Godot_v${GODOT_VERSION}_export_templates.tpz" TEMPLATES_ASSET="Godot_v${GODOT_VERSION}_export_templates.tpz"
fi fi
BASE_URL="https://github.com/godotengine/godot-builds/releases/download/$GODOT_VERSION" BASE_URL="https://github.com/godotengine/godot/releases/download/$GODOT_VERSION"
TEMPLATE_VERSION="${GODOT_VERSION//-/.}" TEMPLATE_VERSION="${GODOT_VERSION//-/.}"
CACHE_DIR="$GODOT_ACTION_ROOT/cache/$GODOT_VERSION/$EDITION/macos-$GODOT_HOST_ARCH" CACHE_DIR="$GODOT_ACTION_ROOT/cache/$GODOT_VERSION/$EDITION/macos-$GODOT_HOST_ARCH"
EDITOR_DIR="$CACHE_DIR/editor" EDITOR_DIR="$CACHE_DIR/editor"
+9 -8
View File
@@ -35,16 +35,15 @@ function Get-Checksum([string]$ManifestPath, [string]$Asset) {
$_ -match '^([0-9A-Fa-f]{128})\s+\*?(.+)$' -and $Matches[2] -eq $Asset $_ -match '^([0-9A-Fa-f]{128})\s+\*?(.+)$' -and $Matches[2] -eq $Asset
} | Select-Object -First 1 } | Select-Object -First 1
if (-not $line) { if (-not $line) {
Fail "Release checksum manifest does not contain $Asset." Fail "Godot $GodotVersion does not publish required $edition asset '$Asset' for Windows/$HostArch at $script:BaseUrl. Choose a supported stable release and architecture."
} }
return ($line -split '\s+')[0].ToLowerInvariant() return ($line -split '\s+')[0].ToLowerInvariant()
} }
function Download-AndVerify([string]$Asset, [string]$Destination, [string]$ManifestPath) { function Download-AndVerify([string]$Asset, [string]$Destination, [string]$ExpectedChecksum) {
Invoke-WebRequest -Uri "$script:BaseUrl/$Asset" -OutFile $Destination Invoke-WebRequest -Uri "$script:BaseUrl/$Asset" -OutFile $Destination
$expected = Get-Checksum $ManifestPath $Asset
$actual = (Get-FileHash -LiteralPath $Destination -Algorithm SHA512).Hash.ToLowerInvariant() $actual = (Get-FileHash -LiteralPath $Destination -Algorithm SHA512).Hash.ToLowerInvariant()
if ($actual -ne $expected) { if ($actual -ne $ExpectedChecksum) {
Fail "SHA-512 verification failed for $Asset." Fail "SHA-512 verification failed for $Asset."
} }
} }
@@ -69,7 +68,7 @@ $ActionRoot = Require-Environment 'GODOT_ACTION_ROOT'
$Workspace = Require-Environment 'GITHUB_WORKSPACE' $Workspace = Require-Environment 'GITHUB_WORKSPACE'
$GithubOutput = Require-Environment 'GITHUB_OUTPUT' $GithubOutput = Require-Environment 'GITHUB_OUTPUT'
if ($GodotVersion -notmatch '^4(\.[0-9]+){1,2}(-[0-9A-Za-z][0-9A-Za-z._-]*)?$') { Fail 'godot-version must be a Godot 4 release tag such as 4.7.2-stable.' } if ($GodotVersion -notmatch '^4(\.[0-9]+){1,2}-stable$') { Fail 'godot-version must be a stable Godot 4 tag such as 4.7.2-stable. Alpha, beta, RC, and dev tags are not supported.' }
if ($HostOs -ne 'windows') { Fail "host-os must be 'windows' when this action runs on Windows." } if ($HostOs -ne 'windows') { Fail "host-os must be 'windows' when this action runs on Windows." }
if ($Dotnet -notin @('true', 'false')) { Fail "dotnet must be 'true' or 'false'." } if ($Dotnet -notin @('true', 'false')) { Fail "dotnet must be 'true' or 'false'." }
if ($ExportMode -notin @('release', 'debug')) { Fail "export-mode must be 'release' or 'debug'." } if ($ExportMode -notin @('release', 'debug')) { Fail "export-mode must be 'release' or 'debug'." }
@@ -106,7 +105,7 @@ if ($Dotnet -eq 'true') {
$templatesAsset = "Godot_v${GodotVersion}_export_templates.tpz" $templatesAsset = "Godot_v${GodotVersion}_export_templates.tpz"
} }
$script:BaseUrl = "https://github.com/godotengine/godot-builds/releases/download/$GodotVersion" $script:BaseUrl = "https://github.com/godotengine/godot/releases/download/$GodotVersion"
$templateVersion = $GodotVersion -replace '-', '.' $templateVersion = $GodotVersion -replace '-', '.'
$cacheDirectory = Join-Path $ActionRoot "cache\$GodotVersion\$edition\windows-$HostArch" $cacheDirectory = Join-Path $ActionRoot "cache\$GodotVersion\$edition\windows-$HostArch"
$editorDirectory = Join-Path $cacheDirectory 'editor' $editorDirectory = Join-Path $cacheDirectory 'editor'
@@ -126,8 +125,10 @@ if (-not $editorExecutable) {
$editorArchive = Join-Path $cacheDirectory $editorAsset $editorArchive = Join-Path $cacheDirectory $editorAsset
$templatesArchive = Join-Path $cacheDirectory $templatesAsset $templatesArchive = Join-Path $cacheDirectory $templatesAsset
Invoke-WebRequest -Uri "$script:BaseUrl/SHA512-SUMS.txt" -OutFile $manifestPath Invoke-WebRequest -Uri "$script:BaseUrl/SHA512-SUMS.txt" -OutFile $manifestPath
Download-AndVerify $editorAsset $editorArchive $manifestPath $editorChecksum = Get-Checksum $manifestPath $editorAsset
Download-AndVerify $templatesAsset $templatesArchive $manifestPath $templatesChecksum = Get-Checksum $manifestPath $templatesAsset
Download-AndVerify $editorAsset $editorArchive $editorChecksum
Download-AndVerify $templatesAsset $templatesArchive $templatesChecksum
Expand-Archive -LiteralPath $editorArchive -DestinationPath $editorDirectory -Force Expand-Archive -LiteralPath $editorArchive -DestinationPath $editorDirectory -Force
Expand-Archive -LiteralPath $templatesArchive -DestinationPath $templateDirectory -Force Expand-Archive -LiteralPath $templatesArchive -DestinationPath $templateDirectory -Force
$editorExecutable = Find-Editor $editorDirectory $editorExecutable = Find-Editor $editorDirectory