7.8 KiB
GitHub Actions Workflows
Docker Image Publishing
The publish-docker.yml workflow automatically builds and publishes Docker images for the backend service using Nix.
Triggers and Tagging Strategy
| Event | Condition | Published Tags | Example |
|--------------+-----------------------------+------------------------+-------------------|
| Tag push | Tag pushed to main branch | latest + version tag | latest, 1.0.0 |
| Branch push | Push to develop branch | develop | develop |
| Pull request | PR opened or updated | pr<number> | pr12 |
| Branch push | Push to main (no tag) | latest | latest |
Required Secrets
Configure these secrets in your repository settings (Settings → Secrets and variables → Actions):
| Secret Name | Description | Example Value |
|---------------------+---------------------------------------------+-----------------------------------------|
| DOCKER_USERNAME | Username for Docker registry authentication | phundrak |
| DOCKER_PASSWORD | Password or token for Docker registry | Personal Access Token (PAT) or password |
| CACHIX_AUTH_TOKEN | (Optional) Token for Cachix caching | Your Cachix auth token |
For GitHub Container Registry (ghcr.io)
-
Create a Personal Access Token (PAT):
- Go to GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)
- Click "Generate new token (classic)"
- Select scopes:
write:packages,read:packages,delete:packages - Copy the generated token
-
Add secrets:
DOCKER_USERNAME: Your GitHub usernameDOCKER_PASSWORD: The PAT you just created
For Docker Hub
-
Create an access token:
- Go to Docker Hub → Account Settings → Security → Access Tokens
- Click "New Access Token"
- Set permissions to "Read, Write, Delete"
- Copy the generated token
-
Add secrets:
DOCKER_USERNAME: Your Docker Hub usernameDOCKER_PASSWORD: The access token you just created
For Gitea Registry (e.g., labs.phundrak.com)
-
Create an access token in Gitea:
- Log in to your Gitea instance
- Go to Settings (click your avatar → Settings)
- Navigate to Applications → Manage Access Tokens
- Click "Generate New Token"
- Give it a descriptive name (e.g., "Phundrak Labs Docker Registry")
- Select the required permissions:
write:package- Required to publish packagesread:package- Required to pull packages
- Click "Generate Token"
- Copy the generated token immediately (it won't be shown again)
-
Add secrets:
DOCKER_USERNAME: Your Gitea usernameDOCKER_PASSWORD: The access token you just created
Note: Gitea's container registry is accessed at https://your-gitea-instance/username/-/packages
For Other Custom Registries
-
Obtain credentials from your registry administrator
-
Add secrets:
DOCKER_USERNAME: Your registry usernameDOCKER_PASSWORD: Your registry password or token
Configuring Cachix (Build Caching)
Cachix is a Nix binary cache that dramatically speeds up builds by caching build artifacts. The workflow supports configurable Cachix settings.
Environment Variables
Configure these in the workflow's env section or as repository variables:
| Variable | Description | Default Value | Example |
|--------------------+------------------------------------------------+---------------+--------------------|
| CACHIX_NAME | Name of the Cachix cache to use | devenv | phundrak-dot-com |
| CACHIX_SKIP_PUSH | Whether to skip pushing artifacts to the cache | true | false |
Option 1: Pull from Public Cache Only
If you only want to pull from a public cache (no pushing):
-
Set environment variables in the workflow:
env: CACHIX_NAME: devenv # or any public cache name CACHIX_SKIP_PUSH: true -
No
CACHIX_AUTH_TOKENsecret is needed
This is useful when using public caches like devenv or nix-community.
Option 2: Use Your Own Cache (Recommended for Faster Builds)
To cache your own build artifacts for faster subsequent builds:
-
Create a Cachix cache:
- Go to https://app.cachix.org
- Sign up and create a new cache (e.g.,
your-project-name) - Free for public/open-source projects
-
Get your auth token:
- In Cachix, go to your cache settings
- Find your auth token under "Auth tokens"
- Copy the token
-
Add your cache configuration to
flake.nix:nixConfig = { extra-trusted-public-keys = [ "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=" "your-cache-name.cachix.org-1:YOUR_PUBLIC_KEY_HERE" ]; extra-substituters = [ "https://devenv.cachix.org" "https://your-cache-name.cachix.org" ]; }; -
Configure the workflow:
- Edit
.github/workflows/publish-docker.yml:env: CACHIX_NAME: your-cache-name CACHIX_SKIP_PUSH: false - Or set as repository variables in GitHub/Gitea
- Edit
-
Add your auth token as a secret:
- Go to repository
Settings→Secrets and variables→Actions - Add secret
CACHIX_AUTH_TOKENwith your token
- Go to repository
Benefits of Using Your Own Cache
- Faster builds: Subsequent builds reuse cached artifacts (Rust dependencies, compiled binaries)
- Reduced CI time: Can reduce build time from 10+ minutes to under 1 minute
- Cost savings: Less compute time means lower CI costs
- Shared across branches: All branches benefit from the same cache
Configuring the Docker Registry
The target registry is set via the DOCKER_REGISTRY environment variable in the workflow file. To change it:
- Edit
.github/workflows/publish-docker.yml - Modify the
envsection:
env:
DOCKER_REGISTRY: ghcr.io # Change to your registry (e.g., docker.io, labs.phundrak.com)
IMAGE_NAME: phundrak/phundrak-dot-com-backend
Or set it as a repository variable:
- Go to
Settings→Secrets and variables→Actions→Variablestab - Add
DOCKER_REGISTRYwith your desired registry URL
Image Naming
Images are published with the name: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${TAG}
For example:
labs.phundrak.com/phundrak/phundrak-dot-com-backend:latestlabs.phundrak.com/phundrak/phundrak-dot-com-backend:1.0.0labs.phundrak.com/phundrak/phundrak-dot-com-backend:developlabs.phundrak.com/phundrak/phundrak-dot-com-backend:pr12
Local Testing
To test the Docker image build locally:
# Build the image with Nix
nix build .#backendDockerLatest
# Load it into Docker
docker load < result
# Run the container (image name comes from Cargo.toml package.name)
docker run -p 3100:3100 phundrak/phundrak-dot-com-backend:latest
Troubleshooting
Authentication Failures
If you see authentication errors:
- Verify your
DOCKER_USERNAMEandDOCKER_PASSWORDsecrets are correct - For ghcr.io, ensure your PAT has the correct permissions
- Check that the
DOCKER_REGISTRYmatches your credentials
Build Failures
If the Nix build fails:
- Test the build locally first:
nix build .#backendDockerLatest - Check the GitHub Actions logs for specific error messages
- Ensure all dependencies in
flake.nixare correctly specified
Image Not Appearing in Registry
- Verify the workflow completed successfully in the Actions tab
- Check that the registry URL is correct
- For ghcr.io, images appear at:
https://github.com/users/USERNAME/packages/container/IMAGE_NAME - Ensure your token has write permissions