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

image: ${CI_REGISTRY}/devops/images/usgs/java:11

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

stages:
  - build
  - test
  - trigger

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
  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}";
    - |
      if [[ "${ENVIRONMENT}" != "development" ]]; then
        docker tag "${env_image_name}" "${latest_image_name}";
        docker push "${latest_image_name}";
      fi
    - |
      printf "
        --------
        Image Name - %s:%s
        --------
      " "${CI_PROJECT_NAME}" "${IMAGE_TAG}";
  stage: build
  tags:
    - ${TAG}
  variables:
    DOCKERFILE: Dockerfile
    DOCKER_BUILD_ARGS: |
      BUILD_IMAGE=${CI_REGISTRY}/devops/images/usgs/java:11
      FROM_IMAGE=${CI_REGISTRY}/devops/images/usgs/java:11
    IMAGE_TAG: ${ENVIRONMENT}-${CI_COMMIT_SHORT_SHA}
    REGISTRY_IMAGE: ${CI_REGISTRY_IMAGE}
    TAG: build

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

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: dev
      -
        CI_PROJECT_NAME: nshmp-haz-ws
        DOCKERFILE: ws.Dockerfile
        REGISTRY_IMAGE: ${CI_REGISTRY_IMAGE}
        TAG: dev
  variables:
    DOCKER_BUILD_ARGS: |
      BUILD_IMAGE=${CI_REGISTRY}/devops/images/usgs/java:11
      FROM_IMAGE=${CI_REGISTRY}/devops/images/usgs/java:11
      CI_COMMIT_BRANCH=${CI_COMMIT_BRANCH}
      CI_PROJECT_URL=${CI_PROJECT_URL}
    UPSTREAM_PATH: ghsc/nshmp/nshmp-haz

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

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

Markdown Lint:
  allow_failure: true
  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})%/'
  needs: []
  parallel:
    matrix:
      - NSHM: Alaska2007
      - NSHM: Alaska2023
      - NSHM: Conus2018
      - NSHM: Conus2023
      - NSHM: Hawaii2021
  script:
    - CI_RUNNER_MEMORY="$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 / 1024 * .90 )}' /proc/meminfo)g"
    - export CI_RUNNER_MEMORY
    - ./gradlew generate${NSHM} --info
    - ./gradlew test${NSHM} --info
    - cat ${JACOCO_HTML_DIR}/index.html
  stage: test
  tags:
    - nshmp

YAML Lint:
  allow_failure: true
  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})%/'
  needs: []
  script:
    - ./gradlew check
    - cat ${JACOCO_HTML_DIR}/index.html
  stage: test

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

Trigger nshmp-haz-ws CDK:
  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-haz to ${ENVIRONMENT}" \
        --form "variables[SOURCE_PROJECT_NAME]=nshmp-haz-ws" \
        --form "variables[ENVIRONMENT]=${ENVIRONMENT}" \
        --form "variables[NSHMP_HAZ_WS_IMAGE]=${NSHMP_HAZ_WS_IMAGE}" \
        "https://${PRIVATE_GITLAB}/api/v4/projects/${NSHMP_CDK_PROJECT_ID}/trigger/pipeline"
  stage: trigger
  variables:
    REF: main
    UPSTREAM_PATH: ghsc/nshmp/nshmp-haz