CSCfi/pebbles

View on GitHub
.gitlab-ci.yml

Summary

Maintainability
Test Coverage
---
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"'