stages: - build-base - push-base - run-schema - build-dev - unit-test-dev - test-coverage - push-dev - deploy-coverage-page - deploy-dev - .post # - deploy-test variables: PROJECT_NAME: "workspaces" DEFAULT_DEPLOY_ENV: "dev" # Postgres Service Variables POSTGRES_DB: archive POSTGRES_USER: "archive" POSTGRES_PASSWORD: "docker" # CI Postgres Service services: - name: marconi.aoc.nrao.edu/ops/ci/db:workspaces alias: db image: docker:19.03.12 workflow: rules: - if: $CI_MERGE_REQUEST_IID - if: $CI_COMMIT_TAG - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Import Templates include: - '/ci/build.template.yml' - '/ci/push.template.yml' - '/ci/cleanup.template.yml' - '/ci/unit-test.template.yml' # Build Base Image build base image: stage: build-base script: - docker build -t ${REGISTRY_URL}/ops/base:${PROJECT_NAME} -f Dockerfile.base . - docker tag ${REGISTRY_URL}/ops/base:${PROJECT_NAME} ${REGISTRY_URL}/ops/base:${CI_COMMIT_SHORT_SHA} rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-ops/' changes: - Dockerfile.base # Push Base Image Stage push base image: stage: push-base script: - echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $REGISTRY_URL - docker push ${REGISTRY_URL}/ops/base:${PROJECT_NAME} - docker push ${REGISTRY_URL}/ops/base:${CI_COMMIT_SHORT_SHA} rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE =~ /\A(?i)-ops/' changes: - Dockerfile.base # Run Schema run schema: stage: run-schema image: ${REGISTRY_URL}/ops/base:${PROJECT_NAME} script: - export PGPASSWORD=$POSTGRES_PASSWORD - cd schema && ./bin/run-migrations.sh "docker" rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: always - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: always # Build Stages build dev workflow: stage: build-dev variables: SERVICE_NAME: "workflow" PATH_PREFIX: "services/" extends: .build build dev capability: stage: build-dev variables: SERVICE_NAME: "capability" PATH_PREFIX: "services/" extends: .build build dev notification: stage: build-dev variables: SERVICE_NAME: "notification" PATH_PREFIX: "services/" extends: .build build dev web: stage: build-dev variables: SERVICE_NAME: "web" PATH_PREFIX: "apps/" extends: .build ## Test Stages ## # Unit Tests unit test dev workflow: stage: unit-test-dev variables: SERVICE_NAME: "workflow" extends: .unit-test artifacts: paths: - .coverage.${SERVICE_NAME}.${CI_COMMIT_SHORT_SHA} needs: - build dev workflow unit test dev capability: stage: unit-test-dev variables: SERVICE_NAME: "capability" extends: .unit-test artifacts: paths: - .coverage.${SERVICE_NAME}.${CI_COMMIT_SHORT_SHA} needs: - build dev capability unit test dev notification: stage: unit-test-dev variables: SERVICE_NAME: "notification" extends: .unit-test artifacts: paths: - .coverage.${SERVICE_NAME}.${CI_COMMIT_SHORT_SHA} needs: - build dev notification # Generate Coverage reports unit test coverage: stage: test-coverage image: python:3.8-slim before_script: - pip install pytest pytest-cov script: - coverage combine --append - coverage report - coverage xml artifacts: reports: cobertura: coverage.xml paths: - coverage.xml dependencies: - unit test dev workflow - unit test dev capability - unit test dev notification rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: always - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: always # Push Stages push dev workflow: stage: push-dev variables: SERVICE_NAME: "workflow" extends: .push needs: - unit test dev workflow push dev capability: stage: push-dev variables: SERVICE_NAME: "capability" extends: .push needs: - unit test dev capability push dev notification: stage: push-dev variables: SERVICE_NAME: "notification" extends: .push needs: - unit test dev notification push dev web: stage: push-dev variables: SERVICE_NAME: "web" extends: .push # UI tests coming soon! # needs: # - unit test dev ui # Cleanup clean build workflow: stage: .post variables: SERVICE_NAME: "workflow" extends: .cleanup allow_failure: true clean build capability: stage: .post variables: SERVICE_NAME: "capability" extends: .cleanup allow_failure: true clean build notification: stage: .post variables: SERVICE_NAME: "notification" extends: .cleanup allow_failure: true clean build web: stage: .post variables: SERVICE_NAME: "web" extends: .cleanup allow_failure: true # Deploy Stages # Disabled until GL Pages are set up .pages: stage: deploy-coverage-page image: python:3.8-slim dependencies: - unit test coverage script: - mkdir public - mv htmlcov/ public/ artifacts: paths: - public expire_in: 2 weeks rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: always - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: always # Development deploy dev: stage: deploy-dev variables: ENV: "dev" script: - SWARM_NODE_ENV=$ENV TAG_TO_DEPLOY=$CI_DEFAULT_BRANCH docker stack deploy --compose-file docker-compose.${ENV}.yml workspaces-${ENV} rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: manual # Development # deploy dev: # stage: deploy-dev # script: # - | # if [ "$CI_COMMIT_BRANCH" != "" ]; then \ # if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then \ # echo "Deploying merged branch: ${CI_COMMIT_BRANCH} to dev environment"; \ # SWARM_NODE_ENV="dev" TAG_TO_DEPLOY="development" docker stack deploy --compose-file docker-compose.dev.yml workspaces-dev ; \ # else # if [ "$CAPABILITY_BRANCH" != "" ]; then \ # echo "Updating Capability Service: ${CI_COMMIT_BRANCH} in dev environment"; \ # docker service update --image marconi.aoc.nrao.edu/workspaces/capability:"$CAPABILITY_BRANCH" workspaces-dev_capability # fi # if [ "$WORKFLOW_BRANCH" != "" ]; then \ # echo "Updating Workflow Service: ${CI_COMMIT_BRANCH} in dev environment"; \ # docker service update --image marconi.aoc.nrao.edu/workspaces/workflow:"$WORKFLOW_BRANCH" workspaces-dev_workflow # fi # if [ "$WORKFLOW_BRANCH" == "" && "$CAPABILITY_BRANCH" == "" ]; then \ # echo "Deploying branch: ${CI_COMMIT_BRANCH} to dev environment"; \ # SWARM_NODE_ENV="dev" TAG_TO_DEPLOY="${CI_COMMIT_BRANCH}" docker stack deploy --compose-file docker-compose.dev.yml workspaces-dev ; \ # fi # fi # fi # if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "" ]; then \ # if [ "$CAPABILITY_BRANCH" != "" ]; then \ # echo "Updating Capability Service with PR Branch: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} in dev environment"; \ # docker service update --image marconi.aoc.nrao.edu/workspaces/capability:"$CAPABILITY_BRANCH" workspaces-dev_capability # fi # if [ "$WORKFLOW_BRANCH" != "" ]; then \ # echo "Updating Workflow Service with PR Branch: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} in dev environment"; \ # docker service update --image marconi.aoc.nrao.edu/workspaces/workflow:"$WORKFLOW_BRANCH" workspaces-dev_workflow # fi # if [ "$WORKFLOW_BRANCH" == "" && "$CAPABILITY_BRANCH" == "" ]; then \ # echo "Deploying branch: ${CI_COMMIT_BRANCH} to dev environment"; \ # SWARM_NODE_ENV="dev" TAG_TO_DEPLOY="${CI_COMMIT_BRANCH}" docker stack deploy --compose-file docker-compose.dev.yml workspaces-dev ; \ # fi # echo "Deploying PR branch: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} to dev environment"; \ # SWARM_NODE_ENV="dev" TAG_TO_DEPLOY="dev-branch" docker stack deploy --compose-file docker-compose.dev.yml workspaces-dev ; \ # fi # environment: development # rules: # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # when: always # - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # when: manual # Testing # deploy test: # stage: deploy-test # script: # | # echo "branch: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}" # echo "tag: ${CI_COMMIT_TAG}" # SWARM_NODE_ENV="test" TAG_TO_DEPLOY="${CI_COMMIT_TAG}" docker stack deploy --compose-file docker-compose.dev.yml workspaces-dev # rules: # - if: $CI_COMMIT_TAG # when: manual