Skip to content
Snippets Groups Projects
.gitlab-ci.yml 6.98 KiB
variables:
  JACOCO_HTML_DIR: ${REPORTS_DIR}/jacoco/test/html
  JUNIT_FILES: build/test-results/test*/TEST-*.xml
  NSHMP_HAZ_WS_IMAGE: ${CODE_REGISTRY_IMAGE}/nshmp-haz-ws:${ENVIRONMENT}-${CI_COMMIT_SHORT_SHA}
  REPORTS_DIR: build/reports

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

stages:
  - build
  - test
  - trigger

default:
  tags:
    - nshmp

####
# 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_BRANCH == 'production'
      || ( $CI_COMMIT_TAG && $CI_COMMIT_TAG != '' )
    )
  variables:
    ENVIRONMENT: production

####
# Docker Templates
####

##
# Docker in Docker
##
.dind:
  image: ${DEVOPS_REGISTRY}docker:19.03-git
  services:
    - alias: docker
      name: ${DEVOPS_REGISTRY}docker:19.03-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
  needs: []
  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
    - env_image_name="${REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest";
    - latest_image_name="${REGISTRY_IMAGE}/${CI_PROJECT_NAME}:latest";
    - sha_image_name="${REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${IMAGE_TAG}";
    - |
      docker build \
        ${BUILD_ARGS} \
        --pull \
        --tag "${env_image_name}" \
        --file "${CI_PROJECT_DIR}/${DOCKERFILE}" \
        "${CI_PROJECT_DIR}/.";
    - docker push "${env_image_name}";
    - |
      docker tag "${env_image_name}" "${sha_image_name}";
      docker push "${sha_image_name}";
    - |
      docker_latest_image="usgs/${CI_PROJECT_NAME}:latest";
      docker_env_image="usgs/${CI_PROJECT_NAME}:${ENVIRONMENT}-latest";

      if [[ "${ENVIRONMENT}" != "development" ]]; then
        docker tag "${env_image_name}" "${latest_image_name}";
        docker push "${latest_image_name}";
      fi

      if [[ "${PUSH_DOCKER}" == true ]]; then
        docker tag "${env_image_name}" "${docker_env_image}";
        docker push "${docker_env_image}";

        if  [[ "${ENVIRONMENT}" != "development" ]]; then
          docker tag "${env_image_name}" "${docker_latest_image}";
          docker push "${docker_latest_image}";
        fi
      fi
    - |
      printf "
        --------
        Image Name - %s:%s
        --------
      " "${CI_PROJECT_NAME}" "${IMAGE_TAG}";
  stage: build
  tags:
    - ${TAG}
  variables:
    DOCKERFILE: Dockerfile
    DOCKER_BUILD_ARGS: |
      BUILD_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
      FROM_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
    IMAGE_TAG: ${ENVIRONMENT}-${CI_COMMIT_SHORT_SHA}
    PUSH_DOCKER: 'false'
    REGISTRY_IMAGE: ${CI_REGISTRY_IMAGE}
    TAG: build

####
# Java Templates
####

##
# General Java setup
##
.java:
  image: ${DEVOPS_REGISTRY}usgs/amazoncorretto:11

####
# Stage: build
####

CHS Registry:
  extends:
    - .docker-build
  parallel:
    matrix:
      -
        CI_PROJECT_NAME: nshmp-haz
        DOCKERFILE: Dockerfile
        REGISTRY_IMAGE: ${CODE_REGISTRY_IMAGE}
        TAG: build
      -
        CI_PROJECT_NAME: nshmp-haz-ws
        DOCKERFILE: ws.Dockerfile
        REGISTRY_IMAGE: ${CODE_REGISTRY_IMAGE}
        TAG: build
  variables:
    DOCKER_BUILD_ARGS: |
      BUILD_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
      FROM_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
      CI_COMMIT_BRANCH=${CI_COMMIT_BRANCH}
      CI_PROJECT_URL=${CI_PROJECT_URL}
    PUSH_DOCKER: 'true'
    UPSTREAM_PATH: ghsc/nshmp/nshmp-haz

Container Registry:
  before_script:
    - docker login ${CI_REGISTRY} -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}
  extends:
    - .docker-build
  parallel:
    matrix:
      -
        CI_PROJECT_NAME: nshmp-haz
        DOCKERFILE: Dockerfile
        REGISTRY_IMAGE: ${CI_REGISTRY_IMAGE}
        TAG: nshmp
      -
        CI_PROJECT_NAME: nshmp-haz-ws
        DOCKERFILE: ws.Dockerfile
        REGISTRY_IMAGE: ${CI_REGISTRY_IMAGE}
        TAG: nshmp
  variables:
    DOCKER_BUILD_ARGS: |
      BUILD_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
      FROM_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
      CI_COMMIT_BRANCH=${CI_COMMIT_BRANCH}
      CI_PROJECT_URL=${CI_PROJECT_URL}
    UPSTREAM_PATH: ghsc/nshmp/nshmp-haz

Build Project:
  extends:
    - .java
  script:
    - ./gradlew assemble
  stage: build

####
# Stage: test
####

Markdown Lint:
  allow_failure: true
  extends:
    - .java
  needs: []
  script:
    - ./gradlew nodeInstall
    - ./gradlew markdownlint
  stage: test

NSHM Tests:
  artifacts:
    paths:
      - ${JACOCO_HTML_DIR}
    reports:
      junit: ${JUNIT_FILES}
  coverage: '/Total.*?([0-9]{1,3})%/'
  extends:
    - .java
  needs: []
  parallel:
    matrix:
      - CMD: testAlaska2023
      - CMD: testConus2018
      - CMD: testConus2023
      - CMD: testHawaii2021
  script:
    - ./gradlew ${CMD}
    - cat ${JACOCO_HTML_DIR}/index.html
  stage: test

YAML Lint:
  allow_failure: true
  extends:
    - .java
  needs: []
  script:
    - ./gradlew nodeInstall
    - ./gradlew yamllint
  stage: test

Unit Tests:
  artifacts:
    paths:
      - ${JACOCO_HTML_DIR}
    reports:
      junit: ${JUNIT_FILES}
  coverage: '/Total.*?([0-9]{1,3})%/'
  extends:
    - .java
  needs: []
  script:
    - ./gradlew check
    - cat ${JACOCO_HTML_DIR}/index.html
  stage: test

####
# Stage: trigger
####

Trigger nshmp-haz-ws CDK:
  needs:
    - CHS Registry
  rules:
    -
      <<: *development-env
      when: manual
    - *staging-env
    - *production-env
  script:
    - apk add curl
    - |
      if [ "${ENVIRONMENT}" == 'production' ]; then
        REF="production";
      fi
    - |
      curl --request POST \
        --form token=${NSHMP_HAZ_WS_CDK_TRIGGER_TOKEN} \
        --form ref=${REF} \
        --form "variables[description]=Triggered by nshmp-haz" \
        --form "variables[ENVIRONMENT]=${ENVIRONMENT}" \
        --form "variables[NSHMP_HAZ_WS_IMAGE]=${NSHMP_HAZ_WS_IMAGE}" \
        --form "variables[TRIGGER_PASSCODE]=${NSHMP_HAZ_WS_CDK_TRIGGER_TOKEN}" \
        "https://${PRIVATE_GITLAB}/api/v4/projects/${NSHMP_HAZ_WS_CDK_PROJECT_ID}/trigger/pipeline"
  stage: trigger
  variables:
    REF: main
    UPSTREAM_PATH: ghsc/nshmp/nshmp-haz