Skip to content
Snippets Groups Projects
.gitlab-ci.yml 7.23 KiB
Newer Older
variables:
  DOCKER_TLS_CERTDIR: "" # HACK: see https://gitlab.com/gitlab-org/gitlab-runner/issues/4501

stages:
  - setup
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  - check
  - build
  - deploy

Paolo.Brasolin's avatar
Paolo.Brasolin committed
# TODO: maybe stup some notifications as a last stage?

#==[ JOB TEMPLATES ]============================================================
.node-job: &node-job
  image: node:16-alpine
Paolo Brasolin's avatar
Paolo Brasolin committed
  # tags:
  #   - shared
  only:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - pushes

.fe-node-job:
  <<: *node-job
  cache:
    key:
      files:
        - frontend/package-lock.json
    paths:
      - frontend/.npm/
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  before_script:
    - cd frontend
    - npm ci --cache .npm --prefer-offline --production=false
Paolo.Brasolin's avatar
Paolo.Brasolin committed
.be-node-job:
  <<: *node-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  cache:
    key:
      files:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
        - backend/package-lock.json
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    paths:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
      - backend/.npm/
  before_script:
    - cd backend
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - npm ci --cache .npm --prefer-offline

Paolo.Brasolin's avatar
Paolo.Brasolin committed
#==[ SETUP STAGE ]==============================================================

#--[ Frontend ]-----------------------------------------------------------------
Paolo Brasolin's avatar
Paolo Brasolin committed
fe-cache-job:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .fe-node-job
  stage: setup
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
    - echo "Done!"
Paolo.Brasolin's avatar
Paolo.Brasolin committed
#--[ Backend ]------------------------------------------------------------------
Paolo Brasolin's avatar
Paolo Brasolin committed
be-cache-job:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .be-node-job
  stage: setup
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
    - echo "Done!"
Paolo Brasolin's avatar
Paolo Brasolin committed
#--[ Cetera ]-------------------------------------------------------------------

app-tagger-job:
Paolo Brasolin's avatar
Paolo Brasolin committed
  stage: setup
  variables:
    GIT_STRATEGY: clone
    GIT_DEPTH: 0
Paolo Brasolin's avatar
Paolo Brasolin committed
  script:
    - GIT_DESCRIPTOR=$(git describe --tags --always)
    - echo Detected app version ${GIT_DESCRIPTOR}
    - echo "APP_VERSION=${GIT_DESCRIPTOR#v}" >> build.env
Paolo Brasolin's avatar
Paolo Brasolin committed
  artifacts:
    reports:
      dotenv: build.env
  only:
    - tags
    - development
Paolo.Brasolin's avatar
Paolo.Brasolin committed
#==[ CHECK STAGE ]==============================================================

#--[ Frontend ]-----------------------------------------------------------------
Paolo Brasolin's avatar
Paolo Brasolin committed
.fe-check-job: &fe-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .fe-node-job
  stage: check
  needs:
Paolo Brasolin's avatar
Paolo Brasolin committed
    - fe-cache-job
  # allow_failure: true # TODO: disallow!
Paolo Brasolin's avatar
Paolo Brasolin committed
fe-format-job:
  <<: *fe-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
    - npm run format:check

Paolo Brasolin's avatar
Paolo Brasolin committed
fe-lint-job:
  <<: *fe-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - npm run lint:check
Paolo Brasolin's avatar
Paolo Brasolin committed
fe-test-job:
  <<: *fe-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
    - npm run test

Paolo.Brasolin's avatar
Paolo.Brasolin committed
#--[ Backend ]------------------------------------------------------------------
Paolo Brasolin's avatar
Paolo Brasolin committed
.be-check-job: &be-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .be-node-job
  stage: check
  needs:
Paolo Brasolin's avatar
Paolo Brasolin committed
    - be-cache-job
  # allow_failure: true # TODO: disallow!
Paolo Brasolin's avatar
Paolo Brasolin committed
be-format-job:
  <<: *be-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
    - npm run format:check

Paolo Brasolin's avatar
Paolo Brasolin committed
be-lint-job:
  <<: *be-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - npm run lint:check
Paolo Brasolin's avatar
Paolo Brasolin committed
be-test-job:
  <<: *be-check-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
    - npm run test

Paolo.Brasolin's avatar
Paolo.Brasolin committed
#==[ BUILD STAGE ]==============================================================

#--[ Frontend ]-----------------------------------------------------------------

Paolo Brasolin's avatar
Paolo Brasolin committed
prd-fe-build-job:
  extends: .fe-node-job
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  stage: build
    NODE_ENV: production
    ROLLBAR_ACCESS_TOKEN: $POST_CLIENT_ITEM_ROLLBAR_ACCESS_TOKEN
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  script:
    - npm run build -- --dist-dir dist/prd
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  artifacts:
    paths:
      - frontend/dist/prd
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    expire_in: 1 week
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  only:
    - tags
Paolo Brasolin's avatar
Paolo Brasolin committed
stg-fe-build-job:
  extends: .fe-node-job
  stage: build
  variables:
    NODE_ENV: staging
    ROLLBAR_ACCESS_TOKEN: $POST_CLIENT_ITEM_ROLLBAR_ACCESS_TOKEN
  script:
    - npm run build -- --dist-dir dist/stg
  artifacts:
    paths:
      - frontend/dist/stg
    expire_in: 1 week
  only:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - development
Paolo.Brasolin's avatar
Paolo.Brasolin committed

#--[ Backend ]------------------------------------------------------------------
.be-build-job:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  variables:
    IMAGE_NAME: $CI_REGISTRY_IMAGE/backend
  before_script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json

prd-be-build-job:
  extends: .be-build-job
  stage: build
  script: >-
    /kaniko/executor
    --context "${CI_PROJECT_DIR}/backend"
    --dockerfile "${CI_PROJECT_DIR}/backend/Dockerfile"
    --target production
    --destination ${CI_REGISTRY_IMAGE}/backend:latest
    --destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION}
    --destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION%.*}
    --destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION%%.*}
    --destination ${CI_REGISTRY_IMAGE}/backend:${CI_COMMIT_SHA}
    --build-arg APP_VERSION=$APP_VERSION
    --build-arg ROLLBAR_ACCESS_TOKEN=$POST_SERVER_ITEM_ROLLBAR_ACCESS_TOKEN

stg-be-build-job:
  extends: .be-build-job
  stage: build
  script: >-
    /kaniko/executor
    --context "${CI_PROJECT_DIR}/backend"
    --dockerfile "${CI_PROJECT_DIR}/backend/Dockerfile"
    --target production
    --destination ${CI_REGISTRY_IMAGE}/backend:${CI_COMMIT_REF_NAME}
    --destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION}
    --destination ${CI_REGISTRY_IMAGE}/backend:${CI_COMMIT_SHA}
    --build-arg APP_VERSION=$APP_VERSION
    --build-arg ROLLBAR_ACCESS_TOKEN=$POST_SERVER_ITEM_ROLLBAR_ACCESS_TOKEN
  only:
    - development
Paolo.Brasolin's avatar
Paolo.Brasolin committed
#==[ DEPLOY STAGE ]=============================================================
Paolo.Brasolin's avatar
Paolo.Brasolin committed
#--[ Frontend ]-----------------------------------------------------------------

.fe-deploy-job:
  image: alpine:latest
  stage: deploy
Paolo Brasolin's avatar
Paolo Brasolin committed
  # tags:
  #   - shared
  #   - commul # NOTE: we used to require commul because extended seccomp policies are needed
  before_script:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - ./ci/install-butler-on-alpine.sh
  script:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - >
      butler push
      $DIST_PATH
Paolo.Brasolin's avatar
Paolo.Brasolin committed
      eurac/$GAME_NAME:html5
      --userversion ${USER_VERSION}
prd-fe-deploy-job:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .fe-deploy-job
  needs:
    - app-tagger-job
Paolo Brasolin's avatar
Paolo Brasolin committed
    - job: prd-fe-build-job
      artifacts: true
  environment:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    name: production/frontend
    deployment_tier: production
    url: https://eurac.itch.io/oetzit
  variables:
    GAME_NAME: oetzit
    DIST_PATH: frontend/dist/prd
    USER_VERSION: ${APP_VERSION}
stg-fe-deploy-job:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .fe-deploy-job
  needs:
    - app-tagger-job
Paolo Brasolin's avatar
Paolo Brasolin committed
    - job: stg-fe-build-job
      artifacts: true
  environment:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    name: staging/frontend
    deployment_tier: staging
    url: https://eurac.itch.io/oetzit-staging
  variables:
    GAME_NAME: oetzit-staging
    DIST_PATH: frontend/dist/stg
    USER_VERSION: ${APP_VERSION}
Paolo Brasolin's avatar
Paolo Brasolin committed
  only:
    - development
Paolo.Brasolin's avatar
Paolo.Brasolin committed
#--[ Backend ]------------------------------------------------------------------
Paolo.Brasolin's avatar
Paolo.Brasolin committed
.be-deploy-job:
  image: alpine:latest
  stage: deploy
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  variables:
    IMAGE_NAME: $CI_REGISTRY_IMAGE/backend
  before_script:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    - ./ci/install-kubectl-on-alpine.sh
  script:
    - kubectl set image deployment/${K8S_DEPLOYMENT} oetzit=${IMAGE_NAME}:${APP_VERSION} --namespace=${K8S_NAMESPACE}
prd-be-deploy-job:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .be-deploy-job
Paolo Brasolin's avatar
Paolo Brasolin committed
  needs:
    - app-tagger-job
    - job: prd-be-build-job
      artifacts: false
  environment:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    name: production/backend
    deployment_tier: production
Paolo Brasolin's avatar
Paolo Brasolin committed
    url: https://kommul.eurac.edu/oetzit
  variables:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    K8S_NAMESPACE: kommul
    K8S_DEPLOYMENT: oetzit-webserver-deployment
stg-be-deploy-job:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
  extends: .be-deploy-job
Paolo Brasolin's avatar
Paolo Brasolin committed
  needs:
    - app-tagger-job
    - job: stg-be-build-job
      artifacts: false
  environment:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    name: staging/backend
    deployment_tier: staging
Paolo Brasolin's avatar
Paolo Brasolin committed
    url: https://kommul-dev.eurac.edu/oetzit
  variables:
Paolo.Brasolin's avatar
Paolo.Brasolin committed
    K8S_NAMESPACE: kommul-dev
    K8S_DEPLOYMENT: oetzit-webserver-deployment
  only:
    - development