.gitlab-ci.yml
---
image: python:3.11-bullseye
stages:
- build image
- analysis and tests
- ci-pipeline
- mirroring
variables:
PRIVATE_IMAGE: $CI_DOCKER_REPOSITORY_PRIVATE/pebbles
PUBLIC_IMAGE: $CI_DOCKER_REPOSITORY_PUBLIC/pebbles
PUBLISH_IMAGE: $CI_DOCKER_REPOSITORY_PUBLISH/pebbles
GITHUB_MIRROR: git@github.com:CSCfi/pebbles.git
flake8:
stage: analysis and tests
needs: []
script:
- pip install flake8
- flake8 pebbles tests manage.py
pylint:
stage: analysis and tests
needs: []
# cache pip downloads and installed packages
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
cache:
key: "${CI_COMMIT_REF_SLUG}"
paths:
- .cache/pip
- venv/
script:
- pip install -r requirements.txt
- pip install pylint
- "pylint -j0 pebbles || true" # no failures ATM
tests:
stage: analysis and tests
needs: []
# cache pip downloads and installed packages
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
FLASK_APP: pebbles.server:app
cache:
key: "${CI_COMMIT_REF_SLUG}"
paths:
- .cache/pip
- venv/
script:
- pip install -r requirements.txt
- python manage.py test
build-image:
stage: build image
needs: []
image: docker:git
script:
- echo "Going to build and push ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME}"
- docker build --tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} . --file=deployment/pebbles.Dockerfile
- docker push ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME}
# push to public registry
- docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PUBLIC_IMAGE}:${CI_COMMIT_REF_NAME}
- docker push ${PUBLIC_IMAGE}:${CI_COMMIT_REF_NAME}
# if we are on master branch, create master and versioned tags and also push to PUBLISH repo
- |
if [[ ${CI_COMMIT_REF_NAME} == 'master' ]]; then
echo "Tagging and publishing ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME}:master"
docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PRIVATE_IMAGE}:master
docker push ${PRIVATE_IMAGE}:master
# push to PUBLIC registry
docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PUBLIC_IMAGE}:master
docker push ${PUBLIC_IMAGE}:master
# push to PUBLISH registry
docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PUBLISH_IMAGE}:master
docker push ${PUBLISH_IMAGE}:master
docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PUBLISH_IMAGE}:latest
docker push ${PUBLISH_IMAGE}:latest
export IMAGE_TAG="${CI_COMMIT_REF_NAME}-$(date +%Y-%m-%d_%H%M)"
echo "Tagging and publishing ${PRIVATE_IMAGE}:${IMAGE_TAG}"
docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PRIVATE_IMAGE}:${IMAGE_TAG}
docker push ${PRIVATE_IMAGE}:${IMAGE_TAG}
# push to PUBLIC registry
docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PUBLIC_IMAGE}:${IMAGE_TAG}
docker push ${PUBLIC_IMAGE}:${IMAGE_TAG}
# push to PUBLISH registry
docker tag ${PRIVATE_IMAGE}:${CI_COMMIT_REF_NAME} ${PUBLISH_IMAGE}:${IMAGE_TAG}
docker push ${PUBLISH_IMAGE}:${IMAGE_TAG}
fi
# call pipeline project
ci-pipeline:
stage: ci-pipeline
needs: ['build-image']
variables:
ENV_NAME: "${CI_ENV_NAME}"
DEPROVISION_ENVIRONMENT: 1
PEBBLES_IMAGE_TAG: "${CI_COMMIT_REF_NAME}"
PEBBLES_COMMIT_REF_NAME: "${CI_COMMIT_REF_NAME}"
PEBBLES_ENVIRONMENTS_COMMIT_REF_NAME: "${CI_COMMIT_REF_NAME}"
PEBBLES_DEPLOY_COMMIT_REF_NAME: "${CI_COMMIT_REF_NAME}"
ENV_NAME_QA: "${CI_ENV_NAME_QA}"
trigger:
project: pebbles/cicd-pipeline
branch: master
strategy: depend
mirroring:
stage: mirroring
script:
- mkdir mirror_dir
- cd mirror_dir
- echo "cloning the gitlab.ci repo"
- git clone $CI_REPOSITORY_URL pebbles
- cd pebbles
- echo "pushing to github repo"
- git checkout master
- mkdir ~/.ssh
- echo -e "Host github.com\n StrictHostKeyChecking no\n" >> ~/.ssh/config
- eval `ssh-agent -s`
- ssh-agent bash -c 'ssh-add /root/ssh/pebbles-key/id_rsa; git push $GITHUB_MIRROR master'
rules:
- if: '$CI_COMMIT_REF_NAME == "master"'