-
Clayton, Brandon Scott authoredClayton, Brandon Scott authored
.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