GitLab CI Pipeline Generator#

Generate a complete .gitlab-ci.yml for your project in a single command. The generator creates multi-stage pipelines with language-specific test jobs, Docker build, and Kubernetes deployment.


Basic Usage#

python -m cli.devopsos scaffold gitlab --name my-app --languages python --type complete

Output: .gitlab-ci.yml (default)
Change the output path with --output <path>.


Options#

OptionDefaultDescription
--name NAMEmy-appApplication / pipeline name
--type TYPEcompletebuild | test | deploy | complete
--languages LANGSpythonComma-separated: python, java, javascript, go
--kubernetesoffAdd a Kubernetes deploy stage
--k8s-method METHODkubectlkubectl | kustomize | argocd | flux
--output FILE.gitlab-ci.ymlOutput file path
--image IMAGEdocker:24Default Docker image for pipeline jobs
--branches BRANCHESmainBranches that trigger deploy jobs
--kube-namespace NS(empty)Kubernetes namespace (empty = use $KUBE_NAMESPACE variable)
--custom-values FILE(none)Path to custom values JSON file

All options can be set via environment variables prefixed DEVOPS_OS_GITLAB_.


Generated Pipeline Stages#

build stage#

  • Logs in to the GitLab Container Registry
  • Runs language-specific compile / install steps (detected from project files)
  • Builds and pushes a Docker image tagged with $CI_COMMIT_SHORT_SHA and latest

test stage#

LanguageImageTest command
Pythonpython:3.11-slimpytest --cov
Javamaven:3.9-eclipse-temurin-17mvn test / gradle test
JavaScriptnode:20-slimnpm test
Gogolang:1.21go test ./...

Each test job uploads JUnit / coverage artifacts automatically.

deploy stage (requires --kubernetes)#

MethodWhat happens
kubectlkubectl set image + rollout status check
kustomizekustomize edit set image + kubectl apply
argocdargocd app set + sync + wait
fluxflux reconcile image repository + kustomization

Examples#

Python + Docker + kubectl deploy#

python -m cli.devopsos scaffold gitlab \
  --name flask-api \
  --languages python \
  --type complete \
  --kubernetes \
  --k8s-method kubectl \
  --branches main,production
# Output: .gitlab-ci.yml

Generated stages:

stages:
  - build
  - test
  - deploy

variables:
  APP_NAME: flask-api
  IMAGE_TAG: $CI_COMMIT_SHORT_SHA

build:
  stage: build
  image: docker:24
  script:
    - docker login $CI_REGISTRY ...
    - docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG .
    - docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG

test:python:
  stage: test
  image: python:3.11-slim
  script:
    - pip install -r requirements.txt pytest pytest-cov
    - pytest --cov=./ --cov-report=xml -v

deploy:kubernetes:
  stage: deploy
  image: bitnami/kubectl:1.29
  script:
    - kubectl set image deployment/flask-api app=$CI_REGISTRY_IMAGE:$IMAGE_TAG
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

Java build + test (no deploy)#

python -m cli.devopsos scaffold gitlab --name java-api --languages java --type test
# Output: .gitlab-ci.yml

Multi-language with ArgoCD deploy#

python -m cli.devopsos scaffold gitlab \
  --name my-app \
  --languages python,go \
  --kubernetes --k8s-method argocd
# Output: .gitlab-ci.yml

Environment Variables#

export DEVOPS_OS_GITLAB_NAME=my-app
export DEVOPS_OS_GITLAB_TYPE=complete
export DEVOPS_OS_GITLAB_LANGUAGES=python,javascript
export DEVOPS_OS_GITLAB_KUBERNETES=true
export DEVOPS_OS_GITLAB_K8S_METHOD=kustomize

python -m cli.devopsos scaffold gitlab
# Output: .gitlab-ci.yml

Required GitLab CI/CD Variables#

Set these in GitLab → Settings → CI/CD → Variables:

VariableDescription
CI_REGISTRY_USERGitLab registry username (auto-set for GitLab)
CI_REGISTRY_PASSWORDGitLab registry password (auto-set for GitLab)
KUBE_CONTEXTkubectl context name
KUBE_NAMESPACETarget Kubernetes namespace
ARGOCD_SERVERArgoCD server hostname (if using ArgoCD)
ARGOCD_TOKENArgoCD API token (if using ArgoCD)