Skip to content

Releases: Cuvara/unity-build-workflows

v7.0.3

Choose a tag to compare

@dyCuong03 dyCuong03 released this 23 Oct 11:55
734f4fa

Fix consumer test-image builds by checking out the toolkit at toolkit-ref and building from its Docker context. The Unity MCP reconnect setting and LiveBackend test exclusion are preserved.

v7.0.2

Choose a tag to compare

@dyCuong03 dyCuong03 released this 23 Oct 11:21
ff1181a

Fixed

  • Unity test runs now receive UNITY_MCP_KEEP_CONNECTED=false inside the GameCI container.
  • Routine EditMode and PlayMode runs exclude the LiveBackend category.

v7.0.1

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 08 Oct 11:10
6d191c9

Fixed

  • A firebase-storage Production build never reached Google Play.
    fastlane android upload_internal passed release_notes: to
    upload_to_play_store, which has no such option, so every direct-to-store
    upload failed with "Could not find option 'release_notes' in the list of
    available options". The step is continue-on-error, so the build stayed
    green while nothing reached the internal track. The lane now writes the
    notes to <metadata_path>/<locale>/changelogs/default.txt, where supply
    reads them, but only when GOOGLE_PLAY_RELEASE_NOTES_LOCALE names a Play
    listing language. Without one, the release goes up without notes rather
    than failing on a language the listing lacks.
    tests/test_fastfile_play_upload.py checks every upload_to_play_store
    call against supply's options.

v7.0.0

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 08 Oct 05:31
3f02bf5

Removed — BREAKING

  • The unity-build.yml family of reusable workflows (deprecated since
    6.23.0): unity-build.yml, unity-build-android.yml,
    unity-build-webgl.yml, unity-build-linux.yml, unity-build-ios.yml,
    unity-build-gameci.yml, unity-validate.yml, unity-test.yml,
    unity-test-ios.yml, unity-nightly.yml, unity-release.yml and
    unity-release-ios.yml. Nothing in the current flow or the numbered
    consumer templates called them.
  • The templates project-workflow.yml and consumer-unity-build.yml, and
    examples/sample-unity-project-integration/.
  • The ten composite actions that only those workflows used:
    activate-unity, build-ios, build-unity, collect-container-output,
    discord-notify, resolve-unity-image, restore-docker-cache,
    run-unity-container, upload-build-report and validate-unity-project.
  • docs/ADD_NEW_PROJECT.md (onboarding for the removed flow), replaced by
    docs/CONSUMER_SETUP.md.

Migration: docs/MIGRATION_V7.md. A project that
calls only unity-pipeline.yml and pipeline-*-release.yml moves from @v6
to @v7 with no other change. @v6 stays at the last 6.x release for projects that have
not moved. The consumer templates now pin @v7.

Changed

  • With the native iOS route gone, every lane's build entry point can be
    overridden by build-method / UNITY_BUILD_METHOD. The "two iOS routes,
    two entry points" inconsistency documented in docs/ARCHITECTURE.md and
    CLAUDE.md no longer exists.

v6.25.0 — live Unity log in the build step

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 08 Oct 04:52
a0a5afd

Changed

  • The Unity log is shown live in the build step. On the native lanes
    (self-hosted macOS / Windows, the Addressables pre-step, Unity tests and the
    Windows docker container) Unity writes only to its -logFile, so "Build
    with local Unity" showed just Unity binary: … for the whole build.
    scripts/build/run_unity_player.sh now follows the log file into the step
    output while Unity runs (tail -F), keeping Unity's exit code; the file is
    still written for the steps that parse and upload it. A log left by an
    earlier run is removed first so it is not replayed. UNITY_LOG_STREAM=0
    turns streaming off. GitHub masks registered secrets in the step output.

Tests

  • A failed artifact-manifest or IPA-manifest upload (a full Actions storage
    quota) must not block the store uploads: both uploads keep
    continue-on-error, run before "Deliver the build", and the delivery step
    still receives job.status. Pinned in test_firebase_delivery_paths.py.

Upgrade: @v6 now points to this release. Pin @v6.25.0 for an exact version.

Full changelog: v6.24.2...v6.25.0

v6.24.2

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 07 Oct 11:42
16abc26

Changed

  • One SSH submodule fetch for the build and the tests job. The 50-line
    "Fetch submodules over SSH" step was copied verbatim into
    reusable-build-platform.yml and reusable-unity-tests.yml. It is now
    scripts/common/fetch_submodules_ssh.sh. To run it, both jobs check the
    toolkit out right after the project checkout: earlier than before in the
    build job, and in the tests job also when submodule-auth is ssh, not
    only on the native lanes.
  • The Windows Git Bash step stays a copy, held identical by a test. It
    runs before any checkout, because it sets core.longpaths for the project
    checkout, which would clean away a toolkit checked out first. So it cannot
    come from the toolkit. tests/test_shared_job_steps.py fails when the two
    jobs' copies differ.
  • One way to get the bot token. Seven workflows carried the same ~55
    lines of Node.js that signed a GitHub App JWT and exchanged it for an
    installation token: auto-merge, auto-release, version-bump,
    build-pr-comment, license-rotation, sync-org-variables and
    unity-generate-license. They now use actions/create-github-app-token,
    pinned to v3.2.0 by SHA, with the same scope (the whole installation on
    the repository owner). It needs no checkout (most of them mint the token
    before checking out), masks the token, and revokes it when the job ends.
    unity-generate-license still skips with a "set it by hand" warning when
    APP_ID / APP_PRIVATE_KEY are absent. The action prefers client-id
    over the deprecated app-id; switching needs an APP_CLIENT_ID secret.

v6.24.1

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 07 Oct 10:09
ab9eeda

Changed

  • Stage 01's matrix is a script. The ~300-line inline bash of
    unity-pipeline.yml's "Resolve build matrix" step is
    scripts/common/resolve_build_matrix.sh, unchanged except that it finds
    its matrix_runner_labels.py helper beside itself instead of probing five
    candidate paths. The step's env is its whole input, as before. The test
    harness runs the file rather than a bash -c of the extracted step text.
    unity-pipeline.yml is down to about 1900 lines.

v6.24.0

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 07 Oct 08:50
557f2dc

Changed

  • The build leg's result is written by a script. "Set job outputs" in
    reusable-build-platform.yml was ~100 lines of bash that built the result
    JSON with printf. It is now scripts/build/write_build_result.py: same
    file (pipeline-results/build-<Platform>.json), same fields in the same
    order, same outputs (result-json still hex). A blocked iOS leg, which has
    no toolkit checkout, still reports blocked through a short bash fallback.
  • The Windows docker lane's container script is a file. The ~90-line
    PowerShell array of bash lines (Unity serial activation, then
    run_unity_player.sh) is scripts/build/docker_windows_container.sh, run
    from the mounted workspace. It now prints the Editor.log tails when the
    build fails, which set -e had skipped.
  • The native test lanes run run_unity_player.sh --tests. The Windows
    (PowerShell) and macOS (bash) "Run tests" steps of reusable-unity-tests.yml
    are one bash step, Run tests (self-hosted). --tests EditMode|PlayMode|All
    with --results-dir writes <dir>/<mode>/results.xml and Editor.log, as
    before, and always exits 0 (the verdict is the parsed results).

Fixed

  • A Unity error message could run as shell. The first error from the
    Unity log was spliced into the "Set job outputs" script by ${{ }}, so a
    message containing $(...) or a backtick was executed by bash. Every value
    now reaches the script through env: and is serialized by json.
  • A full artifact storage quota failed an iOS build that had shipped.
    "iOS — Upload IPA artifact manifest" had no continue-on-error, unlike the
    build's own manifest upload, so a run whose IPA was archived, exported and
    delivered to Firebase went red. It is now continue-on-error, and "iOS —
    Upload signed IPA" matches the build artifact upload (tolerated on
    self-hosted runners).
  • The macOS test lane reported the wrong exit code ($? of the echo in
    its warning); --tests reports Unity's.

v6.23.2

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 07 Oct 08:23
9e6efb4

Changed

  • The report jobs share one script. Final Report and Notify Discord held
    about 400 lines of inline Python over the same build results, and the
    "fill missing results from the build outputs" block was copied into both.
    That logic is now scripts/common/pipeline_results.py (fill-missing,
    final-report, discord-status, attachable, diagnostics), tested on its
    own, and the jobs call it. unity-pipeline.yml drops from 2708 to about
    2200 lines. The report and the Discord message are unchanged.

Fixed

  • Discord lost its error and warning counts in v6.23.0. The counts were
    grepped from Editor.log in the downloaded log artifacts, and Notify
    Discord stopped downloading those when it began downloading only what it
    can attach. They now come from each build leg's own log summary (the result
    file's errorCount / warningCount), with a new logMeasured field so a
    lane that wrote no Editor log (Docker / game-ci) still shows no count,
    instead of a zero nobody measured. summarise_unity_log.py gains a
    log-found output.

v6.23.1 — iOS Pods at the project's minimum iOS

Choose a tag to compare

@CuongND-sparkon CuongND-sparkon released this 07 Oct 07:23
5d53db8

Fixed

  • iOS archive still failed on Pods below Xcode's minimum (v6.22.6). The
    deployment-target read from Unity-iPhone.xcodeproj came back empty on the
    Mac, so Pods kept 9.0-13.0. The minimum now comes from the project's
    Player Settings (iOSTargetOSVersionString, read by "iOS — Find Xcode
    project" and passed as the new ios-archive-export input
    deployment-target); xcode_archive.sh falls back to the project file
    (parsed with grep -o, portable) and then to
    xcodebuild -showBuildSettings, and its warning now says what it found.

Upgrade: @v6 now points to this release. Pin @v6.23.1 for an exact version.

Full changelog: v6.23.0...v6.23.1