Safeguard
Developer Tools•

What should a game build pipeline check about dependencies?

A CI checklist for game builds: committed lock files, pinned engine and plugins, LFS fetched, scan on pull requests, and a record of what shipped.

Safeguard Security Team
4 min read

A game build pipeline should build from committed lock files and pinned plugins, fetch large files fully, scan declared dependencies on every pull request and store a record of what shipped. The checklist below turns that into eight checks you can add one at a time.

The checklist

CheckWhat it protectsSource of truth
Lock file committed and usedSame packages every buildUnity lock file
Git dependencies pinned to full hashNo moving branchmanifest.json
Plugins in the repositoryVisible, reviewable codeProject Plugins folder
LFS content fetchedScanner sees real files.gitattributes
Declared dependencies scannedKnown flaws caughtManifests and lock files
Pull request gateNew risk is visibleCI status check
Build record storedYou can answer what shippedBuild artifacts
Third party scripts reviewedWeb builds stay cleanTemplate folder

Why each check exists

Unity says its Package Manager saves its resolution in a lock file so that the same packages install reliably every time. If the lock file is not committed, or CI ignores it, two builds of the same commit can differ. See why versions differ.

Unity's Git dependency documentation says branches and tags can point to different commits over time, while a full commit hash names one commit. See how to pin a Git package.

Epic's documentation says plugins with Source folders are compiled automatically when you compile the project. Keeping them under the project's Plugins folder means the code that builds is the code in your repository.

Git LFS stores text pointers in the repository, so a scan on an unfetched checkout reads pointers. See the LFS post.

Order of adoption

  1. Commit the lock file and make CI fail if it changes during the build.
  2. Replace branch based Git URLs with hashes.
  3. Move plugins into the repository.
  4. Fetch LFS content in the build job.
  5. Add a scan step in report-only mode.
  6. Turn the scan into a pull request check with a narrow blocking rule.
  7. Store the build record: engine version, lock file, plugin versions, scan report and build number.
  8. Add a template script review for web builds.

What not to put in the pipeline

Do not give a scan step your signing keys or platform credentials. Run it before those secrets exist in the job. Keep any console SDK material out of shared runners unless your agreements allow it, as covered in the NDA post.

A sample record for one build

For build 1042 of a mobile game, the record might hold the engine version, the lock file as committed, the list of plugins with tags, a note that two native libraries were listed by hand, the scan date, the tool used, zero blocking findings and two accepted findings with owners. That is a page, not a project, and it is produced by the pipeline.

When the next advisory arrives, you open the record for the live builds, search for the package and know within minutes whether to act. That is the payoff of every check in the table.

Try it yourself

Click through it at your own pace, or open it full screen.

Watch what the pull request check reports and where the merge decision sits. That is your step six.

Quick check

Why fail the build if the lock file changes?

A change during the build means the build resolved different packages than the ones reviewed. Fail it and review the change.

Should the scan block merges immediately?

Start in report-only mode, then block on one narrow rule.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.