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 - 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}"; variables: DOCKERFILE: Dockerfile DOCKER_BUILD_ARGS: | BUILD_IMAGE=${CI_REGISTRY}/devops/images/usgs/node:20 FROM_IMAGE=${CI_REGISTRY}/devops/images/usgs/nginx:latest REGISTRY_IMAGE: ${CI_REGISTRY_IMAGE} 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: - apt-get install -y git - npm run build:prod stage: build #### # Stage: Image #### CHS Registry: 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 REGISTRY_IMAGE: ${CODE_REGISTRY_IMAGE} Container Registry: before_script: - docker login ${CI_REGISTRY} -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} extends: - .docker-build needs: - Build Project stage: image tags: - dev 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 REGISTRY_IMAGE: ${CI_REGISTRY_IMAGE} #### # 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 # parallel: # matrix: # - APP: dashboard # - APP: designmaps # - APP: dev # - APP: error-pages # - APP: gmm # - APP: hazard # - APP: ncm # - APP: services # - APP: source # - APP: app.component.* needs: - Init script: - npm run test stage: test tags: - nshmp #### # 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 rules: - if: > $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $CI_PROJECT_PATH == $UPSTREAM_PATH script: - npm run compodoc:build - mv compodoc public stage: deploy