GitLab CI integration
Automate deployments and server management with Alpacon in GitLab CI/CD pipelines using the official Docker container.
Quick start
1. Generate API token
In your Alpacon workspace settings:
- Go to Settings → API Tokens
- Click “Create Token”
- Add allowed commands for your deployment needs
- Copy the generated token
2. Add CI/CD variables
Add these variables to your GitLab project (Settings → CI/CD → Variables):
ALPACON_WORKSPACE_URL: Your workspace URL (e.g.,https://your-workspace.us1.alpacon.io)ALPACON_API_TOKEN: Your API token (mark as Masked and Protected)
3. Create .gitlab-ci.yml
IMPORTANT: The alpacax/alpacon-cli image has ENTRYPOINT ["alpacon"] set, so you must override it with entrypoint: [""] in GitLab CI.
stages:
- deploy
deploy:
stage: deploy
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
script:
- alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
- alpacon websh -r prod-server "docker ps"
only:
- main
Usage examples
Deploy with docker-compose.yml
deploy-compose:
stage: deploy
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
script:
- alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
- alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
- alpacon websh -r prod-server "docker compose -f /tmp/app-compose.yml up -d"
- alpacon websh -r prod-server "docker ps"
only:
- main
Deploy with environment file
Note: When uploading multiple files to a directory, you need to create the directory first and set proper permissions:
deploy-with-env:
stage: deploy
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
script:
- alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
# Create directory with proper permissions
- alpacon websh -r prod-server "mkdir -p /tmp/myapp && chown $USER:$USER /tmp/myapp"
# Upload files
- alpacon cp docker-compose.yml prod-server:/tmp/myapp/
- alpacon cp .env prod-server:/tmp/myapp/
# Deploy
- alpacon websh -r prod-server "docker compose -f /tmp/myapp/docker-compose.yml up -d"
- alpacon websh -r prod-server "docker ps"
only:
- main
Deploy with image tag
deploy-tagged:
stage: deploy
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
script:
- alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
- alpacon websh -r prod-server "docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD"
- alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
- alpacon websh -r --env="IMAGE_TAG=$CI_COMMIT_SHORT_SHA" prod-server "docker compose -f /tmp/app-compose.yml up -d"
only:
- main
Multi-environment deployment
deploy-staging:
stage: deploy
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
script:
- alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
- alpacon cp docker-compose.yml staging-server:/tmp/app-compose.yml
- alpacon websh -r staging-server "docker compose -f /tmp/app-compose.yml up -d"
only:
- develop
environment:
name: staging
deploy-production:
stage: deploy
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
script:
- alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
- alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
- alpacon websh -r prod-server "docker compose -f /tmp/app-compose.yml up -d"
only:
- main
environment:
name: production
when: manual
Complete CI/CD pipeline
stages:
- build
- deploy
build-image:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
- docker build -t $DOCKER_USERNAME/myapp:$CI_COMMIT_SHORT_SHA .
- docker push $DOCKER_USERNAME/myapp:$CI_COMMIT_SHORT_SHA
only:
- main
deploy:
stage: deploy
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
script:
- alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
- alpacon websh -r --env="DOCKER_USERNAME=$DOCKER_USERNAME" --env="DOCKER_PASSWORD=$DOCKER_PASSWORD" prod-server "docker login -u \$DOCKER_USERNAME -p \$DOCKER_PASSWORD"
- alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
- alpacon websh -r --env="IMAGE_TAG=$CI_COMMIT_SHORT_SHA" --env="DOCKER_USERNAME=$DOCKER_USERNAME" prod-server "docker compose -f /tmp/app-compose.yml pull"
- alpacon websh -r --env="IMAGE_TAG=$CI_COMMIT_SHORT_SHA" --env="DOCKER_USERNAME=$DOCKER_USERNAME" prod-server "docker compose -f /tmp/app-compose.yml up -d"
- alpacon websh -r prod-server "docker ps"
only:
- main
needs:
- build-image
Troubleshooting
Entrypoint error
Symptom: Error: unknown command "sh" for "alpacon"
Solution:
You forgot to add entrypoint: [""] to the image configuration. Use:
image:
name: alpacax/alpacon-cli:latest
entrypoint: [""]
Permission denied
Symptom: permission denied when running Docker commands
Solution:
Add -r flag to run as root: alpacon websh -r server-name "docker ps"
File not found after upload
Symptom: File uploaded successfully but not found when executing commands
Solution: The directory may not exist or you don’t have permissions. Create the directory with proper ownership:
- alpacon websh -r server "mkdir -p /path/to/dir && chown username:username /path/to/dir"
- alpacon cp file.txt server:/path/to/dir/