GitLab CI/CD Deployment
Automated deployment with GitLab CI/CD using Gordon's push command.
Prerequisites
- Gordon server running with registry authentication enabled
- Generated deployment token
- GitLab CI/CD variables configured
Quick Setup
1. Generate Deployment Token
On your Gordon server:
gordon auth token generate \
--subject gitlab-ci \
--scopes "push,pull,admin:routes:read,admin:config:write" \
--expiry 0
2. Add CI/CD Variables
In your project: Settings > CI/CD > Variables
| Variable | Value | Protected | Masked |
|---|---|---|---|
GORDON_TOKEN |
The generated token | Yes | Yes |
GORDON_REMOTE |
https://gordon.example.com |
Yes | No |
3. Create Pipeline
Create .gitlab-ci.yml:
deploy:
stage: deploy
image: docker:24
services:
- docker:24-dind
before_script:
- apk add --no-cache curl
- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
- chmod +x /usr/local/bin/gordon
script:
- gordon push --build
--remote "$GORDON_REMOTE"
--token "$GORDON_TOKEN"
--no-confirm
only:
- tags
Gordon auto-detects the version from $CI_COMMIT_TAG.
Pipeline Examples
Deploy on Tag Push
stages:
- deploy
deploy:
stage: deploy
image: docker:24
services:
- docker:24-dind
before_script:
- apk add --no-cache curl
- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
- chmod +x /usr/local/bin/gordon
script:
- gordon push --build
--remote "$GORDON_REMOTE"
--token "$GORDON_TOKEN"
--no-confirm
rules:
- if: $CI_COMMIT_TAG
Continuous Deployment
Deploy on every push to main:
deploy:
stage: deploy
image: docker:24
services:
- docker:24-dind
before_script:
- apk add --no-cache curl
- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
- chmod +x /usr/local/bin/gordon
script:
- gordon push --build
--remote "$GORDON_REMOTE"
--token "$GORDON_TOKEN"
--no-confirm
rules:
- if: $CI_COMMIT_BRANCH == "main"
Manual Deployment
deploy:
stage: deploy
image: docker:24
services:
- docker:24-dind
before_script:
- apk add --no-cache curl
- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
- chmod +x /usr/local/bin/gordon
script:
- gordon push --build
--remote "$GORDON_REMOTE"
--token "$GORDON_TOKEN"
--no-confirm
when: manual
With Build Arguments
deploy:
stage: deploy
image: docker:24
services:
- docker:24-dind
before_script:
- apk add --no-cache curl
- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
- chmod +x /usr/local/bin/gordon
script:
- gordon push --build
--remote "$GORDON_REMOTE"
--token "$GORDON_TOKEN"
--build-arg NODE_ENV=production
--build-arg API_URL=https://api.example.com
--no-confirm
rules:
- if: $CI_COMMIT_TAG
Alternative: Docker-based Pipeline
For environments where installing the Gordon binary is not desired:
deploy:
stage: deploy
image: docker:24
services:
- docker:24-dind
script:
- echo "$GORDON_TOKEN" | docker login "$GORDON_REGISTRY" -u "$GORDON_USERNAME" --password-stdin
- docker build -t "$GORDON_REGISTRY/myapp:$CI_COMMIT_TAG" .
- docker push "$GORDON_REGISTRY/myapp:$CI_COMMIT_TAG"
rules:
- if: $CI_COMMIT_TAG
This requires additional CI/CD variables: GORDON_REGISTRY and GORDON_USERNAME.
Gordon auto-deploys when it receives the image.
Version Detection
Gordon automatically detects the version tag from GitLab CI environment variables:
| Variable | Example | Result |
|---|---|---|
$CI_COMMIT_TAG |
v1.2.0 |
Tag v1.2.0 |
| No tag | - | Falls back to git describe or latest |
Troubleshooting
Authentication Failed
Error: failed to verify token
Verify GORDON_TOKEN is correctly set and the token has not been revoked.
Docker-in-Docker Issues
If using docker:dind, ensure the service is properly configured:
services:
- docker:24-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
Build Context
GitLab CI clones your repository automatically. The build context defaults to the repository root.