From fd9528e99ec7729e7470092fa825509440c1da7e Mon Sep 17 00:00:00 2001 From: Dmitry Titov Date: Sun, 12 Mar 2023 17:09:05 +0300 Subject: [PATCH] change ci --- .gitlab-ci.yml | 87 +++++++++++++++++++++++++++++++---------- .pre-commit-config.yaml | 1 - docker-compose.test.yml | 72 ++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 21 deletions(-) create mode 100644 docker-compose.test.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de4e4af..787f0e9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,27 +1,64 @@ stages: + - build - lint - # - build - deploy -deploy: +variables: + CONTAINERS_NAME: sst_postamates + IMAGE_NAME: $CI_REGISTRY_IMAGE + + +.use_cached_requirements: &use_cached_requirements + variables: + PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" + cache: + key: $CI_COMMIT_REF_SLUG + paths: + - .cache/pip + policy: pull-push + +build-job: + stage: build + before_script: + - sudo docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY + script: + - sudo docker pull $IMAGE_NAME:latest || true + - sudo docker build --cache-from $IMAGE_NAME:latest --tag $IMAGE_NAME:$CI_COMMIT_SHORT_SHA --tag $IMAGE_NAME:latest . + - sudo docker push $IMAGE_NAME:$CI_COMMIT_SHORT_SHA + - sudo docker push $IMAGE_NAME:latest + rules: + - if: $CI_COMMIT_BRANCH == 'sst_main' + +.deploy: &deploy-common stage: deploy - only: - - sst_main + before_script: + - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )' + - eval $(ssh-agent -s) + - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - ssh-keyscan $REMOTE_HOST >> ~/.ssh/known_hosts + - chmod 644 ~/.ssh/known_hosts + - ssh $REMOTE_USER docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY script: - - cd /home/toren332/sst_postamates/ - - sudo docker-compose down - - sudo git fetch - - sudo git reset --hard origin/sst_main - - sudo git submodule foreach git pull origin sst_main - - sudo docker-compose up -d - tags: - - deploy-remote - -flake8: + - cd $CI_PROJECT_DIR + - ssh $REMOTE_USER docker pull $IMAGE_NAME:$CI_COMMIT_SHORT_SHA + - DOCKER_HOST="ssh://$REMOTE_USER" docker-compose -f $COMPOSE up -d + +deploy-test-job: + <<: *deploy-common + variables: + REMOTE_HOST: $REMOTE_HOST_TEST + REMOTE_USER: $REMOTE_USER_TEST + COMPOSE: docker-compose.test.yml + rules: + - if: $CI_COMMIT_BRANCH == 'sst_main' + +pylint: + <<: *use_cached_requirements stage: lint - before_script: - - pip install flake8_formatter_junit_xml - - export PATH="$HOME/.local/bin:$PATH" + before_script: + - pip install flake8-codeclimate script: - set -x - FLIST=$(git --no-pager diff --diff-filter=d --name-only $(git merge-base --fork-point origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) $CI_COMMIT_SHA | egrep ".py$" | grep -v ".docker/"|| true) @@ -40,12 +77,22 @@ flake8: changes: - "*.py" - "**/*.py" - tags: - - deploy-remote artifacts: reports: junit: ./build/reports/flake8-junit.xml expire_in: 7 days allow_failure: false - +notify success: + stage: .post + script: curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" -d "chat_id=-1001855628208&reply_to_message_id=98&parse_mode=markdown&text=*[$CI_PROJECT_NAME]* updated with [MR $CI_MERGE_REQUEST_TITLE]($CI_MERGE_REQUEST_PROJECT_URL/-/merge_requests/$CI_MERGE_REQUEST_IID) by $GITLAB_USER_NAME" + rules: + - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME !~ /^silent/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'sst_main' + when: on_success + +notify failure: + stage: .post + script: curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" -d "chat_id=-1001855628208&reply_to_message_id=98&text=*[$CI_PROJECT_NAME]* Oops failed pipeline in [MR $CI_MERGE_REQUEST_TITLE]($CI_MERGE_REQUEST_PROJECT_URL/-/merge_requests/$CI_MERGE_REQUEST_IID) by $GITLAB_USER_NAME" + rules: + - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME !~ /^silent/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'sst_main' + when: on_failure diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2960877..6e2d119 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,6 @@ repos: hooks: - id: trailing-whitespace - id: end-of-file-fixer - - id: check-yaml - id: debug-statements - id: double-quote-string-fixer - id: name-tests-test diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 0000000..2631cf5 --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,72 @@ +version: '3.5' + +x-postgres-variables: &postgres-variables + POSTGRES_DB: "${POSTGRES_DB}" + POSTGRES_HOST: "${POSTGRES_HOST}" + POSTGRES_PORT: "${POSTGRES_PORT}" + POSTGRES_USER: "${POSTGRES_USER}" + POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" + POSTGRES_HOST_AUTH_METHOD: "${POSTGRES_HOST_AUTH_METHOD}" + +x-django-variables: &django-variables + PYTHONUNBUFFERED: 1 + DJANGO_PORT: "${DJANGO_PORT}" + DEBUG: "${DEBUG}" + +x-frontend-variables: &frontend-variables + DOMAIN: "${DOMAIN}" + REACT_APP_DOMAIN_URL: "https://${DOMAIN}/" + +x-martin-variables: &martin-variables + MARTIN_PORT: "${MARTIN_PORT}" + +services: + django: + container_name: ${CONTAINERS_NAME}_django + image: ${IMAGE_NAME}:${CI_COMMIT_SHORT_SHA} + command: > + sh -c "python manage.py migrate && + python manage.py collectstatic --noinput && + python manage.py runserver 0.0.0.0:${DJANGO_PORT}" + environment: + <<: *postgres-variables + <<: *django-variables + <<: *frontend-variables + volumes: + - .:/code + - ./django_static/:/code/django_static/ + - ./media/:/code/media/ + ports: + - "${DJANGO_PORT}:${DJANGO_PORT}" + expose: + - "${DJANGO_PORT}" + restart: always + depends_on: + - db + + db: + container_name: ${CONTAINERS_NAME}_db + image: mdillon/postgis + environment: + <<: *postgres-variables + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + expose: + - "${POSTGRES_PORT}" + volumes: + - ${POSTGRES_VOLUME_PATH}:/var/lib/postgresql/data + command: -p ${POSTGRES_PORT} + + martin: + container_name: ${CONTAINERS_NAME}_martin + image: urbica/martin + ports: + - "${MARTIN_PORT}:3000" + environment: + <<: *martin-variables + WATCH_MODE: "true" + DATABASE_URL: "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${POSTGRES_PORT}/${POSTGRES_DB}" + depends_on: + - db + - django + restart: always