# image: node:18
#
variables:
  GIT_DEPTH: 0
  DEPLOY_PID: "649"
  # Value must be the deploy project id
  DEPLOYMENT_TRIGGER_TOKEN: "glptt-c4145ab70634cdbb509d4eafec72c51df82bd290"
  # Value must be the deployment project pipeline trigger token, found/created at PROJECT > SETTINGS > CI/CD > Pipeline triggers
  # Best to place this variable in Project >> Settings >> CI/CD >> Variables
  SSH_CLONE_URL: 'git@code.vereign.com:gaiax/ocm/ocm-engine.git'
  # Value must be the project ssh clone url
  RUNNER_TAG: 'amd64-docker'
  # Value must be the runner label/tag for the runner which will execute these jobs
  PIPELINE_TRIGGERED: "no"
  # Needed for pipeline automation

###
### ADD HELPERS
####

include:
  - project: 'helpers/ci-helpers'
    file:
      - 'builds.yml'
      - 'registries.yml'
  - project: 'gaiax/helpers/mono-helpers'
    file:
      - 'builds/registries.yml'
      - 'builds/builds.yml'
      - 'projects/chart-trigger.yml'
      - 'projects/notifiers.yml'
      - 'deployments/triggers.yml'
  

stages:
  # - helm-branch-check
  - lint
  - test
  - build
  - release
  - docker
  - registries
  - helm
  - deploy-test
  - deploy-stage
  - deploy-prod

.distributed:
  cache:
    - key:
        files:
          - yarn.lock
      paths:
        - '.yarn-cache/'
  before_script:
    - yarn install --cache-folder .yarn-cache --prefer-offline --frozen-lockfile

##
### Lint microservices
##

#
lint-agent:
  image: node:18
  extends: .distributed
  tags:
    - amd64-docker
  stage: lint
  rules:
    - if: '$PIPELINE_TRIGGERED != "yes" && $CI_PIPELINE_SOURCE != "merge_request_event"'
      changes:
        - apps/agent/*
        - apps/agent/deployment/*
        - apps/agent/src/*
        - apps/agent/src/app/*
    - if: '$CI_COMMIT_TAG'
  script:
    - yarn nx run agent:lint --parallel=3

# lint-engine:
#   image: node:18
#   extends: .distributed
#   tags:
#     - amd64-docker
#   rules:
#     - if: '$PIPELINE_TRIGGERED != "yes"'
#       changes:
#         - apps/engine/*
#         - apps/engine/deployment/*
#         - apps/engine/src/*
#         - apps/engine/src/app/*
#     - if: '$CI_COMMIT_TAG'
#   stage: lint
#   script:
#     - yarn nx run agent:lint --parallel=3

##
### Test microservices
##

test-agent:
  image: node:18
  extends: .distributed
  tags:
    - amd64-docker
  rules:
    - if: '$PIPELINE_TRIGGERED != "yes" && $CI_PIPELINE_SOURCE != "merge_request_event"'
      changes:
        - apps/agent/*
        - apps/agent/deployment/*
        - apps/agent/src/*
        - apps/agent/src/app/*
    - if: '$CI_COMMIT_TAG'
  stage: test
  script:
    - yarn nx run agent:test --configuration=ci --parallel=3

# test-engine:
#   image: node:18
#   extends: .distributed
#   tags:
#     - amd64-docker
#   rules:
#     - if: '$PIPELINE_TRIGGERED != "yes"'
#       changes:
#         - apps/engine/*
#         - apps/engine/deployment/*
#         - apps/engine/src/*
#         - apps/engine/src/app/*
#     - if: '$CI_COMMIT_TAG'
#   stage: test
#   script:
#     - yarn nx run agent:test --configuration=ci --parallel=3

##
### Bare microservice build
##

build-agent:
  image: node:18
  extends: .distributed
  rules:
    - if: '$PIPELINE_TRIGGERED != "yes" && $CI_PIPELINE_SOURCE != "merge_request_event"'
      changes:
        - apps/agent/*
        - apps/agent/deployment/*
        - apps/agent/src/*
        - apps/agent/src/app/*
    - if: '$CI_COMMIT_TAG'
  tags:
    - amd64-docker
  stage: build
  script:
    #    parallel is a CPU core count
    - yarn nx run agent:build:production --parallel=3
    - ls -la
  artifacts:
    paths:
      - ./dist
    expire_in: 1 day

# build-engine:
#   image: node:18
#   extends: .distributed
#   rules:
#     - if: '$PIPELINE_TRIGGERED != "yes"'
#       changes:
#         - apps/engine/*
#         - apps/engine/deployment/*
#         - apps/engine/src/*
#         - apps/engine/src/app/*
#     - if: '$CI_COMMIT_TAG'
#   tags:
#     - amd64-docker
#   stage: build
#   script:
#     #    parallel is a CPU core count
#     - yarn nx run agent:build:production --parallel=3

##
### Docker build microservices
##

docker-build-agent:
  extends: .docker-build-agent
  stage: docker
  rules:
    - if: '$PIPELINE_TRIGGERED == "no" && $CI_PIPELINE_SOURCE != "merge_request_event"'
      changes:
        - apps/agent/*
        - apps/agent/deployment/*
        - apps/agent/src/*
        - apps/agent/src/app/*
    - if: '$CI_COMMIT_TAG'

# docker-build-engine:
#   extends: .docker-build-engine
#   stage: docker
#   rules:
#     - if: '$PIPELINE_TRIGGERED == "no"'
#       changes:
#         - apps/engine/*
#         - apps/engine/deployment/*
#         - apps/engine/src/*
#         - apps/engine/src/app/*
#     - if: '$CI_COMMIT_TAG'

##
### Push to registries
##

google-image-agent:
  extends: .agent-cloud
  stage: registries
  rules:
    - if: '$CI_COMMIT_TAG == null && $PIPELINE_TRIGGERED == "no" && $CI_PIPELINE_SOURCE != "merge_request_event"'
      changes:
        - apps/agent/*
        - apps/agent/deployment/*
        - apps/agent/src/*
        - apps/agent/src/app/*
    - if: '$CI_COMMIT_TAG'

# google-image-engine:
#   extends: .engine-cloud
#   stage: registries
#   rules:
#     - if: '$CI_COMMIT_TAG == null && $PIPELINE_TRIGGERED == "no"'
#       changes:
#         - apps/engine/*
#         - apps/engine/deployment/*
#         - apps/engine/src/*
#         - apps/engine/src/app/*
#     - if: '$CI_COMMIT_TAG'

##
### Configure helm
##

agent:
  extends: .chart-trigger-agent
  stage: helm
  rules:
    - if: '$CI_COMMIT_TAG == null && $PIPELINE_TRIGGERED == "no" && $CI_PIPELINE_SOURCE != "merge_request_event"'
      changes:
        - apps/agent/*
        - apps/agent/deployment/*
        - apps/agent/src/*
        - apps/agent/src/app/*
    - if: '$CI_COMMIT_TAG'

# engine:
#   extends: .chart-trigger-engine
#   stage: helm
#   rules:
#     - if: '$CI_COMMIT_TAG == null && $PIPELINE_TRIGGERED == "no"'
#       changes:
#         - apps/engine/*
#         - apps/engine/deployment/*
#         - apps/engine/src/*
#         - apps/engine/src/app/*
#     - if: '$CI_COMMIT_TAG'

##
### Deploy automatically on Test Environment
##

agent-test ocm:
  stage: deploy-test
  extends: .test-agent-ocm-one
  rules:
    - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "agent" && $CI_PIPELINE_SOURCE != "merge_request_event"'
  when: manual

agent-test ocm-two:
  stage: deploy-test
  extends: .test-agent-ocm-two
  rules:
    - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "agent" && $CI_PIPELINE_SOURCE != "merge_request_event"'
  when: manual

# engine-test ocm:
#   stage: deploy-test
#   extends: .test-engine-ocm-one
#   rules:
#     - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "engine"'
#   when: manual

# engine-test ocm-two:
#   stage: deploy-test
#   extends: .test-engine-ocm-two
#   rules:
#     - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "engine"'
#   when: manual

##
### Deploy on prod
##

agent-prod ocm:
  stage: deploy-prod
  extends: .prod-agent-ocm-one
  rules:
    - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "agent" && $CI_PIPELINE_SOURCE != "merge_request_event" && $MAIN_PROD == "yes" && $GITLAB_USER_LOGIN =~ $AUTORIZED_USERS'
  when: manual

agent-prod ocm-two:
  stage: deploy-prod
  extends: .prod-agent-ocm-two
  rules:
    - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "agent" && $CI_PIPELINE_SOURCE != "merge_request_event" && $MAIN_PROD == "yes" && $GITLAB_USER_LOGIN =~ $AUTORIZED_USERS'
  when: manual

# engine-prod ocm:
#   stage: deploy-prod
#   extends: .prod-engine-ocm-one
#   rules:
#     - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "engine"'
#   when: manual

# engine-prod ocm-two:
#   stage: deploy-prod
#   extends: .prod-engine-ocm-two
#   rules:
#     - if: '$PIPELINE_TRIGGERED == "yes" && $APP == "engine"'
#   when: manual


##
### Deploy manual on Stage Environment
##

# deploy agent stage:
#   stage: deploy-stage
#   only:
#     refs: 
#       - master
#       - tags
#     changes:
#       - apps/agent/*
#   tags:
#     - amd64-docker
#   script:
#     - echo "create docker file under agent/deployment/ci"
#   when: manual

# deploy engine stage:
#   stage: deploy-stage
#   only:
#     refs: 
#       - master
#       - tags
#     changes:
#       - apps/engine/*
#   tags:
#     - amd64-docker
#   script:
#     - echo "create docker file under agent/deployment/ci"
#   when: manual

# ##
# ### Deploy manual on Prod Environment
# ##

# deploy agent prod:
#   stage: deploy-prod
#   only:
#     refs:
#       - tags
#     changes:
#       - apps/engine/*
#   tags:
#     - amd64-docker
#   script:
#     - echo "create docker file under agent/deployment/ci"
#   when: manual

# deploy engine prod:
#   stage: deploy-prod
#   only:
#     refs:
#       - tags
#     changes:
#       - apps/engine/*
#   tags:
#     - amd64-docker
#   script:
#     - echo "create docker file under agent/deployment/ci"
#   when: manual

##
### Commit Linters and Changelog steps
##

commit lint:
  image: node:18
  extends: .distributed
  stage: lint
  tags:
    - amd64-docker
  script:
    - echo "${CI_MERGE_REQUEST_TITLE}" | npx commitlint
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'main'

changelog:
  image: node:18
  extends: .distributed
  stage: release
  tags:
    - amd64-docker
  script:
    - npx semantic-release
  only:
    - main