GitHub Action to deploy game builds to Steam via steamcmd. Runs directly on the runner. Works on ubuntu-latest, self-hosted Linux, Kubernetes runner pods, and ARM machines.
- uses: remmik/steam-deploy@v0
with:
appId: '4663600'
buildDescription: 'v1.0.0'
rootPath: steampipe-content
depots: |
4663601 windows
4663602 macos
4663603 linux
releaseBranch: develop
username: ${{ secrets.STEAM_USERNAME }}
configVdf: ${{ secrets.STEAM_CONFIG_VDF }}If you have a single build directory, skip depots entirely. The action uploads rootPath as depot appId + 1:
- uses: remmik/steam-deploy@v0
with:
appId: '4663600'
rootPath: build/output
releaseBranch: main
username: ${{ secrets.STEAM_USERNAME }}
configVdf: ${{ secrets.STEAM_CONFIG_VDF }}| Input | Required | Description |
|---|---|---|
appId |
Yes | Steam Application ID |
buildDescription |
No | Description shown in Steamworks |
rootPath |
Yes | Root path to the build content directory |
depots |
No | Newline-separated depotId path mappings (path relative to rootPath) |
releaseBranch |
Yes | Steam branch to set live after upload |
username |
Yes | Steam username |
configVdf |
Yes | Base64-encoded config.vdf for authentication |
| Output | Description |
|---|---|
buildId |
Steam BuildID of the uploaded build |
This action uses Steam's config.vdf for authentication, the same approach used by most CI/CD Steam deploy setups.
- Install steamcmd locally
- Log in with your Steam builder account:
steamcmd +login <username> <password> +quit - Complete the SteamGuard prompt
- Base64-encode the generated config file:
base64 -w 0 ~/Steam/config/config.vdf - Store the output as a GitHub secret (
STEAM_CONFIG_VDF)
Note: The
config.vdfcontains your cached login token. It expires periodically. You'll need to regenerate it when deploys start failing with auth errors.
game-ci/steam-deploy is a Docker-based action. This causes real problems:
- Self-hosted runners: Docker isn't always available (Kubernetes pods, ARM machines, hardened hosts)
- Permission errors: Docker volume mounts cause file permission issues across runs (
/usr/bin/tarpermission denied, files that can't be cleaned up) - Pull failures:
docker pullcan fail with "Pull access denied" errors - Windows: Docker Linux containers don't run on Windows runners
This action runs steamcmd directly on the runner, avoiding all of these.
Replace the numbered depot*Path/depot*Id inputs with the depots input:
# Before (game-ci/steam-deploy)
- uses: game-ci/steam-deploy@v3
with:
appId: '4663600'
rootPath: steampipe-content
depot1Path: windows
depot2Path: macos
depot3Path: linux
releaseBranch: develop
username: ${{ secrets.STEAM_USERNAME }}
configVdf: ${{ secrets.STEAM_CONFIG_VDF }}
# After (remmik/steam-deploy)
- uses: remmik/steam-deploy@v0
with:
appId: '4663600'
rootPath: steampipe-content
depots: |
4663601 windows
4663602 macos
4663603 linux
releaseBranch: develop
username: ${{ secrets.STEAM_USERNAME }}
configVdf: ${{ secrets.STEAM_CONFIG_VDF }}The depots format makes the depot-to-directory mapping explicit rather than relying on positional numbering.
MIT