Gitlab CI Example Pipeline File
Gitlab CI file to deploy Spring application with MongoDB using Helm to OpenShift
## variables
.env-dev: &env-dev
OPENSHIFT_URL: ${OPENSHIFT4_URL_NONPROD}
OPENSHIFT_TOKEN: ${OPENSHIFT4_TOKEN_DEV}
OPENSHIFT_PROJECT: "poi-lim-dev"
## rules
# This job will only run on the master branch
.on-master: &on-master $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $GITLAB_USER_EMAIL != "weblate@company.com"
# branches with 'feature/' prefix
.on-feature: &on-feature $CI_COMMIT_BRANCH =~ /^feature\/.+/i
## caching
.cache: &npm_cache
key:
files: # compute the cache key from the lock file
- frontend/package-lock.json
paths:
- frontend/.npm
## helper functions
.docker-init: &docker-init
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PASSWORD} ${DOCKER_REGISTRY_URL}
.docker-tag: &docker-tag
- echo "docker pull ${DOCKER_IMG}:${DOCKER_TAG_OLD}"
- docker pull ${DOCKER_IMG}:${DOCKER_TAG_OLD}
- echo "tag ${DOCKER_IMG}:${DOCKER_TAG_OLD} ${DOCKER_IMG}:${DOCKER_TAG_NEW}"
- docker tag ${DOCKER_IMG}:${DOCKER_TAG_OLD} ${DOCKER_IMG}:${DOCKER_TAG_NEW}
- echo "docker push ${DOCKER_IMG}:${DOCKER_TAG_NEW}"
- docker push ${DOCKER_IMG}:${DOCKER_TAG_NEW}
.helm-init: &helm-init
- helm3 repo add company ${HELM_REPO_URL} --username ${HELM_REPO_USER} --password ${HELM_REPO_PASSWORD}
- helm3 repo add bitnami ${CHART_REPO_BITNAMI}
- helm3 repo update
.helm-deploy: &helm-deploy
# deploy database
- cd ${CHART_DB_DIR}
- helm3 upgrade ${HELM_CLI_OPTS}
--namespace ${OPENSHIFT_PROJECT} ${LIM_PROJECT}-mongodb
-f values.yaml
${HELM_ARGS}
bitnami/mongodb --version "${CHART_DB_VERSION}"
# deploy web application
- cd - && cd ${CHART_LIM_DIR}
- helm3 upgrade ${HELM_CLI_OPTS}
--namespace ${OPENSHIFT_PROJECT} ${LIM_PROJECT}
-f values.yaml
${HELM_ARGS}
my-web-application --set appVersion="${RELEASE_VERSION}"
## jobs
build:
stage: build
needs:
- job: init
cache: *npm_cache
rules:
- if: $SKIP_BUILD || $DEPLOY
when: never
- if: *on-master
- if: *on-feature
services:
- docker:stable-dind
before_script:
- *docker-init
script:
- mvn clean install
- mvn sonar:sonar
- cd app
- mvn docker:build docker:push
artifacts: # upload test artifacts
when: always
reports:
junit: backend/target/surefire-reports/TEST-*.xml
lint:
stage: build
needs:
- job: build
artifacts: false
allow_failure: true
cache: *npm_cache
rules:
- if: $SKIP_BUILD || $DEPLOY
when: never
- if: *on-master
- if: *on-feature
before_script:
- cd frontend
- npm ci --cache .npm --prefer-offline --no-audit
script:
- npm run lint
deploy-feature:
stage: deploy-feature
extends: .deploy
rules:
- if: $SKIP_DEPLOY_FEATURE || $DEPLOY
when: never
- if: *on-master
- if: *on-feature
environment:
name: $CI_COMMIT_REF_NAME
url: https://$CI_COMMIT_REF_SLUG.my-app.company.com
on_stop: undeploy-feature
auto_stop_in: 1 week
variables:
<<: *env-dev
DOCKER_TAG_OLD: ${RELEASE_VERSION}
DOCKER_TAG_NEW: ${CI_COMMIT_REF_SLUG}-snapshot
LIM_PROJECT: ${CI_COMMIT_REF_SLUG}
HELM_CLI_OPTS: "--install --history-max 5"
HELM_ARGS: "-f values-feature.yaml"
SPRING_PROFILES: auth-password, auth-ldap
script:
# prepare feature configuration
- sed -i "s/<<RELEASE_NAME>>/${PROJECT}/g" ${CHART_DB_DIR}/values-feature.yaml
- sed -i "s/<<RELEASE_NAME>>/${PROJECT}/g" ${CHART_LIM_DIR}/values-feature.yaml
- sed -i "s/<<DOCKER_IMG>>/${DOCKER_TAG_NEW}/g" ${CHART_LIM_DIR}/values-feature.yaml
- sed -i "s/<<SPRING_PROFILES>>/${SPRING_PROFILES}/g" ${CHART_LIM_DIR}/values-feature.yaml
- *docker-tag
- *helm-deploy