Skip to content

Remmik/steam-deploy

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Steam Deploy

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.

Usage

- 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 }}

Single depot (simplest case)

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 }}

Inputs

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

Outputs

Output Description
buildId Steam BuildID of the uploaded build

Authentication

This action uses Steam's config.vdf for authentication, the same approach used by most CI/CD Steam deploy setups.

Generating config.vdf

  1. Install steamcmd locally
  2. Log in with your Steam builder account:
    steamcmd +login <username> <password> +quit
    
  3. Complete the SteamGuard prompt
  4. Base64-encode the generated config file:
    base64 -w 0 ~/Steam/config/config.vdf
    
  5. Store the output as a GitHub secret (STEAM_CONFIG_VDF)

Note: The config.vdf contains your cached login token. It expires periodically. You'll need to regenerate it when deploys start failing with auth errors.

Why not game-ci/steam-deploy?

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/tar permission denied, files that can't be cleaned up)
  • Pull failures: docker pull can 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.

Migrating from game-ci/steam-deploy

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.

License

MIT

About

Deploy game builds to Steam via steamcmd on any Linux runner

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages