Newer
Older

Andrew Kapuscinski
committed
- build-base
- push-base
- build-dev
image: docker:19.03.12
before_script:
- echo "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"
- echo "$CI_COMMIT_REF_NAME"
# Check if branch is associated with a MR

Andrew Kapuscinski
committed
# This helps solves the issue of duplicate pipelines when a branch that's associated with a PR is changed
# It creates two pipelines. It checks if the branch has an open PR. If it does, it'll cancel the push-to-
# branch pipeline to allow the Merge-Request-event pipeline to run.
# Drawbacks: the cancelled push-to-PR pipeline is marked as a Failed pipeline
# based on issue: https://gitlab.com/gitlab-org/gitlab/-/issues/201845

Andrew Kapuscinski
committed
# which should have a less hacky fix in a future Gitlab-CI release
check-merge-request:
stage: init
before_script:
- apk add --no-cache curl
script:

Andrew Kapuscinski
committed
- 'export OPENED_MR_ON_BRANCH=$(curl --header "Private-Token: $GITLAB_TOKEN" "https://$CI_SERVER_HOST/api/v4/merge_requests?project_id=$CI_PROJECT_ID&source_branch=$CI_COMMIT_BRANCH&state=opened&scope=all")'
- |
if [ "${OPENED_MR_ON_BRANCH}" != "[]" ]; then \
echo "There is at least one MR opened on branch $CI_COMMIT_BRANCH. Stopping the push pipeline in favor of the merge request pipeline"; \
exit 1; \
fi
rules:
- if: $GITLAB_TOKEN && $CI_PIPELINE_SOURCE == 'push'

Andrew Kapuscinski
committed
# Build Base if changed
build base image:
stage: build-base
script:
- docker build -t marconi.aoc.nrao.edu/ops/base:workspaces -f Condaless.dockerfile.v2 . ; \
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-ops/'
changes:
- Condaless.dockerfile.v2
build dev workflow:
stage: build-dev
script:

Andrew Kapuscinski
committed
- |
if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "" ]; then \
echo "Building PR branch: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}"; \
docker build -t marconi.aoc.nrao.edu/workspaces/workflow:"$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" -f services/workflow/Dockerfile.dev . ; \
docker tag marconi.aoc.nrao.edu/workspaces/workflow:"$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" marconi.aoc.nrao.edu/workspaces/workflow:"$CI_COMMIT_SHORT_SHA" ; \

Andrew Kapuscinski
committed
echo "WORKFLOW_BRANCH=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" >> build.env; \
elif [ "$CI_COMMIT_TAG" != "" ]; then \
echo "Building tag: ${CI_COMMIT_TAG}"; \
docker build -t marconi.aoc.nrao.edu/workspaces/workflow:"$CI_COMMIT_TAG" -f services/workflow/Dockerfile.dev . ; \
docker tag marconi.aoc.nrao.edu/workspaces/workflow:"$CI_COMMIT_TAG" marconi.aoc.nrao.edu/workspaces/workflow:"$CI_COMMIT_SHORT_SHA" ; \

Andrew Kapuscinski
committed
else
echo "Building branch: ${CI_COMMIT_BRANCH}"; \
docker build -t marconi.aoc.nrao.edu/workspaces/workflow:"$CI_COMMIT_BRANCH" -f services/workflow/Dockerfile.dev . ; \
docker tag marconi.aoc.nrao.edu/workspaces/workflow:"$CI_COMMIT_BRANCH" marconi.aoc.nrao.edu/workspaces/workflow:"$CI_COMMIT_SHORT_SHA" ; \
if [ "$CI_COMMIT_BRANCH" != "main" ]; then \

Andrew Kapuscinski
committed
echo "WORKFLOW_BRANCH=$CI_COMMIT_BRANCH" >> build.env; \
fi

Andrew Kapuscinski
committed
fi

Andrew Kapuscinski
committed
artifacts:
reports:
dotenv: build.env
- if: $CI_COMMIT_MESSAGE =~ /\A(?i)Revert/
when: always
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes:
- .gitlab-ci.yml
when: always

Andrew Kapuscinski
committed
- if: $GITLAB_TOKEN && $CI_PIPELINE_SOURCE == 'push'
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes:
- services/workflow/**/*
- apps/cli/**/*.{py,sh}
- shared/**/*.{py,sh}

Andrew Kapuscinski
committed
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-ops/'
changes:
- Condaless.dockerfile.v2
build dev capability:
stage: build-dev
script:
- |
if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "" ]; then \
echo "Building PR branch: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}"; \
docker build -t marconi.aoc.nrao.edu/workspaces/capability:"$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" -f services/capability/Dockerfile.dev . ; \
docker tag marconi.aoc.nrao.edu/workspaces/capability:"$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" marconi.aoc.nrao.edu/workspaces/capability:"$CI_COMMIT_SHORT_SHA" ; \

Andrew Kapuscinski
committed
echo "CAPABILITY_BRANCH=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" >> build.env; \
elif [ "$CI_COMMIT_TAG" != "" ]; then \
echo "Building tag: ${CI_COMMIT_TAG}"; \
docker build -t marconi.aoc.nrao.edu/workspaces/capability:"$CI_COMMIT_TAG" -f services/capability/Dockerfile.dev . ; \
docker tag marconi.aoc.nrao.edu/workspaces/capability:"$CI_COMMIT_TAG" marconi.aoc.nrao.edu/workspaces/capability:"$CI_COMMIT_SHORT_SHA" ; \
else
echo "Building branch: ${CI_COMMIT_BRANCH}"; \
docker build -t marconi.aoc.nrao.edu/workspaces/capability:"$CI_COMMIT_BRANCH" -f services/capability/Dockerfile.dev . ; \
docker tag marconi.aoc.nrao.edu/workspaces/capability:"$CI_COMMIT_BRANCH" marconi.aoc.nrao.edu/workspaces/capability:"$CI_COMMIT_SHORT_SHA" ; \
if [ "$CI_COMMIT_BRANCH" != "main" ]; then \

Andrew Kapuscinski
committed
echo "CAPABILITY_BRANCH=$CI_COMMIT_BRANCH" >> build.env; \
fi

Andrew Kapuscinski
committed
artifacts:
reports:
dotenv: build.env
rules:
- if: $CI_COMMIT_MESSAGE =~ /\A(?i)Revert/
when: always
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes:
- .gitlab-ci.yml
when: always
- if: $GITLAB_TOKEN && $CI_PIPELINE_SOURCE == 'push'
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes:
- services/capability/**/*
- apps/cli/**/*.{py,sh}
- shared/**/*.{py,sh}

Andrew Kapuscinski
committed
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-ops/'
changes:
- Condaless.dockerfile.v2

Andrew Kapuscinski
committed
# Push Base Image Stage
push base image:
stage: push-base
script:
- echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $HARBOR_URL
- docker push marconi.aoc.nrao.edu/ops/base:workspaces
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
changes:
- Condaless.dockerfile.v2
when: always

Andrew Kapuscinski
committed
push dev workflow:
stage: push-dev
script:
- echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $HARBOR_URL
- |
if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "" ]; then \
echo "Pushing PR branch image to registry: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}"; \
docker push marconi.aoc.nrao.edu/workspaces/workflow:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME ; \
if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "main" ]; then \
docker tag marconi.aoc.nrao.edu/workspaces/workflow:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME marconi.aoc.nrao.edu/workspaces/workflow:dev-branch ; \
docker push marconi.aoc.nrao.edu/workspaces/workflow:dev-branch ; \
fi
elif [ "$CI_COMMIT_TAG" != "" ]; then \
echo "Pushing Tagged image to registry: ${CI_COMMIT_TAG}"; \
docker push marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_TAG ; \

Andrew Kapuscinski
committed
else
echo "Pushing branch image to registry: ${CI_COMMIT_BRANCH}"; \
docker push marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_BRANCH ; \

Andrew Kapuscinski
committed
fi
- docker push marconi.aoc.nrao.edu/workspaces/workflow:$CI_COMMIT_SHORT_SHA
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: ($CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == 'push')
changes:
- .gitlab-ci.yml
- services/workflow/**/*
- apps/cli/**/*.{py,sh}
- shared/**/*.{py,sh}
when: manual
- if: $CI_COMMIT_MESSAGE =~ /\A(?i)Revert/

Andrew Kapuscinski
committed
when: manual
push dev capability:
stage: push-dev
script:
- echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $HARBOR_URL
- |
if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "" ]; then \
echo "Pushing PR branch image to registry: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}"; \
docker push marconi.aoc.nrao.edu/workspaces/capability:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME ; \
if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "main" ]; then \
docker tag marconi.aoc.nrao.edu/workspaces/capability:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME marconi.aoc.nrao.edu/workspaces/capability:dev-branch ; \
docker push marconi.aoc.nrao.edu/workspaces/capability:dev-branch ; \
fi
elif [ "$CI_COMMIT_TAG" != "" ]; then \
echo "Pushing Tagged image to registry: ${CI_COMMIT_TAG}"; \
docker push marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_TAG ; \
else
echo "Pushing branch image to registry: ${CI_COMMIT_BRANCH}"; \
docker push marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_BRANCH ; \
fi
- docker push marconi.aoc.nrao.edu/workspaces/capability:$CI_COMMIT_SHORT_SHA
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: always
- if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == 'push'
changes:
- .gitlab-ci.yml
- services/capability/**/*
- apps/cli/**/*.{py,sh}
- shared/**/*.{py,sh}
when: manual
- if: $CI_COMMIT_MESSAGE =~ /\A(?i)Revert/
when: manual
# Cleanup
# clean runner:
# stage: .post
# script:
# - docker images -q --filter=reference="marconi.aoc.nrao.edu/workspaces/*" | xargs docker rmi -f
### Deploy Stages ###
# Development

Andrew Kapuscinski
committed
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

Andrew Kapuscinski
committed
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

Andrew Kapuscinski
committed
fi
fi
if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "" ]; then \

Andrew Kapuscinski
committed
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

Andrew Kapuscinski
committed
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

Andrew Kapuscinski
committed
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: always
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "push"'
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