Skip to content
Snippets Groups Projects
.gitlab-ci.yml 4.26 KiB
Newer Older
workflow:
  rules:
    # NOTE: don't run pipeline if commit is a Merge/Pull-Request
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: 'never'
    # Otherwise:
    - when: 'always'

variables:
  version: '0.0.$CI_PIPELINE_IID'
  k8sVersion: '1.20.5'

stages:
  - build
  - test
  - deploy
  - release

job_build-image:
s80984's avatar
s80984 committed
  
  stage: build
  tags:
    - docker-privileged
s80984's avatar
s80984 committed
  image: docker:20.10.12
  services:
s80984's avatar
s80984 committed
    - name: docker:20.10.12-dind
s80984's avatar
s80984 committed
  before_script:
s80984's avatar
s80984 committed
    - apk add --no-cache docker-compose
s80984's avatar
s80984 committed
    - apk add yarn
s80984's avatar
s80984 committed
    - yarn
s80984's avatar
s80984 committed
    # - docker info
    # - docker-compose --version
  script:
s80984's avatar
s80984 committed
    - docker-compose up -d --build
s80984's avatar
s80984 committed
  cache:
    paths:
      - /app/server/node_modules/
  artifacts:
    expire_in: 1 days
    when: on_success
    paths:
      - app/server/node_modules/
  after_script:
s80984's avatar
s80984 committed
    - docker-compose down

job_test-image:
  stage: test
s80984's avatar
s80984 committed
  image: docker:20.10.12
  services:
s80984's avatar
s80984 committed
    - name: docker:20.10.12-dind
      alias: containerhost
  variables:
    # NOTE: some random port that hopefully is free on the runner
    outerPort: '38080'
  before_script:
s80984's avatar
s80984 committed
    - apk add --no-cache docker-compose
  script:
s80984's avatar
s80984 committed
    - 'jest --ci --reporters=default --reporters=jest-junit'
  artifacts:
    when: always
    reports:
      junit:
        - junit.xml
s80984's avatar
s80984 committed

s80984's avatar
s80984 committed
  # stage: test
  # tags:
  #   - docker-privileged
  # image: docker:20.10.12
  # services:
  #   - name: docker:20.10.12-dind
  #     alias: containerhost
  # variables:
  #   # NOTE: some random port that hopefully is free on the runner
  #   outerPort: '38080'
  # before_script:
  #   - apk add --no-cache docker-compose
  #   # - yarn add --dev jest-junit

  # script:
  #   - docker-compose -f docker-compose.test.yml up --build
  #   - if [$(grep "exited with code 0")]; then exit 0; else exit 1; fi || true
  #   # - grep 'exited with code 0'
  #   #   exit 0

  # after_script:
  #   # NOTE: clean up after test run (stop and remove container)
  #   # - docker rm --force "${CI_PROJECT_ID}-${CI_PIPELINE_IID}"
  #   - docker-compose down


job_deploy-new-version:
  stage: deploy
  needs:
    - job_build-image
    - job_test-image
  tags:
    - docker
  image:
    name: quay.io/bitnami/kubectl:1.20.5
    entrypoint: ['']
  script:
    - VERSION="${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}"
    - IMAGE="${CI_REGISTRY_IMAGE}:${VERSION}"
    - DEPLOYMENT_MANIFEST=$(sed -e "s,{{image}},${IMAGE},g" ./infra/deployment.yaml.tmpl)
    - echo "${DEPLOYMENT_MANIFEST}" | kubectl apply
        --kubeconfig ${SECRET_KUBECONFIG_PATH}
        --namespace devops-lecture-showcase
        --filename -


job_create-release:
  stage: release
  only:
    - stable
  needs:
    - job_build-image
  tags:
    - docker-privileged
  image: docker:20.10.12
  services:
    - name: docker:20.10.12-dind
  before_script:
    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
    - docker pull "${CI_REGISTRY_IMAGE}:${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}"
  script:
    - VERSION=$(cat ./src/package.json | docker run --interactive stedolan/jq --raw-output '.version')
    - docker tag "${CI_REGISTRY_IMAGE}:${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}" "${CI_REGISTRY_IMAGE}:${VERSION}"
    - docker push "${CI_REGISTRY_IMAGE}:${VERSION}"
    - git tag "v${VERSION}" && git push origin "v${VERSION}"
  after_script:
    - docker image rm --force
        $(docker images --format '{{.Repository}}{{.Tag}}' | grep '${CI_REGISTRY_IMAGE}')

job_deploy-new-release:
  only:
    - stable
  tags:
    - docker-privileged
  image: docker:20.10.12
  services:
    - name: docker:20.10.12-dind
  script:
    - VERSION=$(cat ./src/package.json | docker run --interactive stedolan/jq --raw-output '.version')
    - IMAGE="${CI_REGISTRY_IMAGE}:${VERSION}"
    - DEPLOYMENT_MANIFEST=$(sed -e "s/{{image}}/${IMAGE}/g" infra/deployment.yaml.tmpl)
    - echo "${DEPLOYMENT_MANIFEST}" | docker run
        --rm
        --volume ${SECRET_KUBECONFIG_PATH}:/.kube/config
        quay.io/bitnami/kubectl:1.20.5
        apply --namespace devops-lecture-showcase --filename -


job_update-infra:
  stage: deploy
  rules:
    - changes:
        - infra/*
  tags:
    - docker
  image:
    name: quay.io/bitnami/kubectl:1.20.5
    entrypoint: ['']
  script:
    - kubectl apply
        --kubeconfig ${SECRET_KUBECONFIG_PATH}
        --namespace devops-lecture-showcase
        --filename ./infra