variables:
  GITLAB_TOKEN: '${CI_JOB_TOKEN}'
  NODE_IMAGE_NAME: ${CODE_REGISTRY_IMAGE}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_SLUG}--node

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

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

stages:
  - init
  - node-image
  - build
  - test
  - publish

default:
  tags:
    - nshmp

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

Init:
  artifacts:
    paths:
      - node_modules
      - example/node_modules
  script:
    - npm ci
    - cd example
    - npm ci
  stage: init

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

Build Node Image:
  image: ${CODE_REGISTRY}usgs/docker:20
  needs: []
  script:
    - |
      docker build \
        --build-arg FROM_IMAGE=${CI_REGISTRY}/devops/images/usgs/node:lts \
        --file "Dockerfile" \
        --pull \
        --tag ${NODE_IMAGE_NAME} \
        .
    - docker push ${NODE_IMAGE_NAME}
  services:
    - alias: docker
      name: ${CI_REGISTRY}/devops/images/usgs/docker:20-dind
  stage: node-image
  tags:
    - build
  variables:
    DOCKER_DRIVER: overlay2

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

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

Audit Angular:
  allow_failure: true
  needs: []
  script:
    - cd example
    - npm audit
  stage: build

Build Angular:
  needs:
    - Init
  script:
    - cd example
    - npm run build
  stage: build

Lint Angular:
  needs:
    - Init
  script:
    - cd example
    - npm run lint
  stage: build

Lint Project:
  needs:
    - Init
  script:
    - npm run lint
  stage: build

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

Angular Unit Tests:
  artifacts:
    paths:
      - example/coverage/example
    reports:
      junit: example/junit.xml
  needs:
    - Init
  script:
    - cd example
    - npm run test
  stage: test

####
# Stage: Publish
####

Publish npm:
  image: ${NODE_IMAGE_NAME}
  only:
    - tags
  needs:
    - Audit
    - Audit Angular
    - Init
    - Build Angular
    - Lint Project
  script:
    - git config user.email "${GITLAB_USER_EMAIL}"
    - git config user.name "${GITLAB_USER_NAME}"
    - |
      cat <<-EO_CONFIG > .npmrc
      @${CI_PROJECT_ROOT_NAMESPACE}:registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/
      //${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}
      EO_CONFIG
    - npx standard-version --release-as ${CI_COMMIT_TAG} --skip.commit --skip.changelog
    - npm publish --access public
  stage: publish