Skip to content
Snippets Groups Projects
.gitlab-ci.yml 6.17 KiB
variables:
  BASE_HREF: nshmp
  GITLAB_TOKEN: '${CI_JOB_TOKEN}'
  IMAGE_NAME: ${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${ENVIRONMENT}-${CI_COMMIT_SHORT_SHA}
  UPSTREAM_PATH: ghsc/nshmp/nshmp-apps

image: ${CI_REGISTRY}/devops/images/usgs/node:20

# Do not run for merge requests
workflow:
  rules:
    - if: $CI_COMMIT_TAG
    - if: $CI_COMMIT_BRANCH

stages:
  - init
  - build
  - image
  - security
  - test
  - e2e
  - deploy

default:
  tags:
    - dev

####
# Environment Templates
####

##
# Rule for development environment
##
.development-env: &development-env
  if: >
    $CI_PROJECT_PATH != $UPSTREAM_PATH
    || (
      $CI_PROJECT_PATH == $UPSTREAM_PATH
      && (
        $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
        && $CI_COMMIT_BRANCH != 'production'
        && $CI_COMMIT_TAG == null
      )
    )
  variables:
    ENVIRONMENT: development

##
# Rule for staging environment
##
.staging-env: &staging-env
  if: >
    $CI_PROJECT_PATH == $UPSTREAM_PATH
    && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  variables:
    ENVIRONMENT: staging

##
# Rule for production envrionment
##
.production-env: &production-env
  if: >
    $CI_PROJECT_PATH == $UPSTREAM_PATH
    && ( $CI_COMMIT_TAG && $CI_COMMIT_TAG != '' )
  variables:
    ENVIRONMENT: production

####
# Docker Templates
####

##
# Docker in Docker
##
.dind:
  image: ${CI_REGISTRY}/devops/images/docker:20
  services:
    - alias: docker
      name: ${CI_REGISTRY}/devops/images/docker:20-dind
  variables:
    DOCKER_DRIVER: overlay2

##
# Build Docker image and push to registry.
#
# Pushes to internal registry for all branches and Docker registry
# on default upstream and production upstream branches.
##
.docker-build:
  extends:
    - .dind
  rules:
    - *development-env
    - *staging-env
    - *production-env
  script:
    - BUILD_ARGS='';
    - |
      for arg in ${DOCKER_BUILD_ARGS}; do
        BUILD_ARGS="${BUILD_ARGS} --build-arg ${arg}";
      done
    - |
      docker build \
        ${BUILD_ARGS} \
        --pull \
        --tag "${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${IMAGE_TAG}" \
        --file "${CI_PROJECT_DIR}/${DOCKERFILE}" \
        "${CI_PROJECT_DIR}/.";
    - docker push "${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${IMAGE_TAG}";
    - latest_image_name="${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest";
    - docker tag "${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${IMAGE_TAG}" "${latest_image_name}";
    - docker push "${latest_image_name}";
    - if [[
        ${CI_COMMIT_REF_SLUG} == "${CI_DEFAULT_BRANCH}" ||
        ${CI_COMMIT_REF_SLUG} == "production" ||
        -n "${CI_COMMIT_TAG}"
      ]]; then
        docker tag "${latest_image_name}" "usgs/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest";
        docker push "usgs/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest";

        if [[
          ${CI_COMMIT_REF_SLUG} == "${CI_DEFAULT_BRANCH}" &&
          "${CI_PROJECT_PATH}" == "${UPSTREAM_PATH}"
        ]]; then
          docker tag "usgs/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest" "usgs/${CI_PROJECT_NAME}:latest";
          docker push "usgs/${CI_PROJECT_NAME}:latest";
        fi
      fi
    - |
      printf "
        --------
        Image Name - %s:%s
        --------
      " "${CI_PROJECT_NAME}" "${IMAGE_TAG}";
  variables:
    DOCKERFILE: Dockerfile
    IMAGE_TAG: ${ENVIRONMENT}-${CI_COMMIT_SHORT_SHA}

####
# Stage: init
####

Init:
  artifacts:
    paths:
      - node_modules
  script:
    - npm ci
  stage: init

####
# Stage: Build
####

Build Project:
  artifacts:
    paths:
      - dist
  needs:
    - Init
  script:
    - npm run build:prod
  stage: build

####
# Stage: Image
####

Build Image:
  extends:
    - .docker-build
  needs:
    - Build Project
  stage: image
  tags:
    - build
  variables:
    DOCKER_BUILD_ARGS: |
      BUILD_IMAGE=${CI_REGISTRY}/devops/images/usgs/node:20
      FROM_IMAGE=${CI_REGISTRY}/devops/images/usgs/nginx:latest
      USE_DIST=true

####
# Stage: Security
####

NPM Audit:
  allow_failure: true
  needs: []
  script:
    - npm audit
  stage: security

####
# Stage: Test
####

Lint:
  needs:
    - Init
  script:
    - npm run lint
  stage: test
  tags:
    - nshmp

Unit Tests:
  artifacts:
    paths:
      - coverage/nshmp-apps
    reports:
      junit: junit.xml
  needs:
    - Init
  script:
    - npm test
  stage: test

####
# Stage: End to End tests
####

End to End Tests:
  artifacts:
    paths:
      - dist/cypress
    expire_in: 7 days
  image: ${DOCKER_HUB_IMAGE_MIRROR}cypress/base:16.14.0
  needs: []
  retry: 2
  rules:
    - <<: *development-env
      when: manual
      allow_failure: true
    - <<: *staging-env
      allow_failure: true
    - <<: *production-env
      allow_failure: true
  parallel:
    matrix:
      - SPEC: dashboard
      - SPEC: dev/dashboard
      - SPEC: dev/math
      - SPEC: gmm/distance
      - SPEC: gmm/magnitude
      - SPEC: gmm/spectra
      - SPEC: hazard/disagg
      - SPEC: hazard/dynamic
      - SPEC: hazard/static
      - SPEC: services
      - SPEC: source/data
      - SPEC: source/mfd
  script:
    - npm i
    - npm run cy:run:ci -- --spec "${INT_DIR}/${SPEC}/**/*"
  stage: e2e
  timeout: 3h
  variables:
    INT_DIR: projects/nshmp-apps/cypress/integration

####
# Stage: deploy
####

Trigger AWS Deployment:
  rules:
    - <<: *development-env
      when: manual
    - *staging-env
    - *production-env
  script:
    - |
      if [ "${ENVIRONMENT}" == 'production' ]; then
        REF="production";
      fi
    - |
      curl --request POST \
        --form token=${NSHMP_CDK_TRIGGER_TOKEN} \
        --form ref=${REF} \
        --form "variables[TRIGGER_DESCRIPTION]=Deploy nshmp-apps to ${ENVIRONMENT}" \
        --form "variables[ENVIRONMENT]=${ENVIRONMENT}" \
        --form "variables[NSHMP_APPS_IMAGE]=${IMAGE_NAME}" \
        --form "variables[SOURCE_PROJECT_NAME]=${CI_PROJECT_NAME}" \
        "https://${PRIVATE_GITLAB}/api/v4/projects/${NSHMP_CDK_PROJECT_ID}/trigger/pipeline"
  stage: deploy
  variables:
    REF: main
    UPSTREAM_PATH: ghsc/nshmp/nshmp-apps

pages:
  artifacts:
    paths:
      - public
  image: ${DEVOPS_REGISTRY}usgs/node:20
  rules:
    - if: >
        $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
        && $CI_PROJECT_PATH == $UPSTREAM_PATH
  script:
    - npm run compodoc:build
    - mv compodoc public
  stage: deploy