stages: - test - build - deploy variables: DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" # Lint and Test .test: image: golang:1.21-alpine before_script: - apk add --no-cache git curl - go version lint: stage: test extends: .test script: - go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest - golangci-lint run ./... test: stage: test extends: .test script: - go test -v -race ./... coverage: '/coverage: \d+\.\d+%/' artifacts: reports: coverage_report: coverage_format: golang path: coverage.out # Build Docker Image build: stage: build image: docker:24-dind services: - docker:24-dind before_script: - docker info - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker build -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - docker push $CI_REGISTRY_IMAGE:latest only: - main - develop needs: - test # Deploy to Staging deploy-staging: stage: deploy image: bitnami/kubectl:latest environment: name: staging url: https://staging.myapp.com before_script: - kubectl version --client - echo "$KUBE_CONFIG_STAGING" | base64 -d > kubeconfig - export KUBECONFIG=kubeconfig script: - kubectl set image deployment/myapp app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n staging - kubectl rollout status deployment/myapp -n staging - curl -f https://staging.myapp.com/health || exit 1 only: - develop needs: - build # Deploy to Production deploy-production: stage: deploy image: bitnami/kubectl:latest environment: name: production url: https://myapp.com before_script: - kubectl version --client - echo "$KUBE_CONFIG_PRODUCTION" | base64 -d > kubeconfig - export KUBECONFIG=kubeconfig script: - kubectl set image deployment/myapp app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n production - kubectl rollout status deployment/myapp -n production only: - main needs: - build # Deploy with Helm deploy-helm: stage: deploy image: alpine/helm:latest environment: name: production before_script: - kubectl version --client - echo "$KUBE_CONFIG_PRODUCTION" | base64 -d > kubeconfig - export KUBECONFIG=kubeconfig script: - helm repo add bitnami https://charts.bitnami.com/bitnami - helm upgrade --install myapp ./charts/myapp --namespace production --set image.repository=$CI_REGISTRY_IMAGE --set image.tag=$CI_COMMIT_SHA --wait --atomic only: - main needs: - build