В материале приведем пример файла .gitlab-ci.yaml с запуском тестов. Статья является продолжением вводного материала про Gitlab-ci
Создаем файл .gitlab-ci.yml со сценарием сборки и запуска приложения
mcedit .gitlab-ci.yml
image: ubuntu:latest variables: TEST_NAME: registry.gitlab.com/smth/gitlab-cicd.git:CI_REF_NAME stages: - build - run build_docker_image: stage: build script: - docker login -u USER -p $runnerPass registry.gitlab.com - docker build -t $TEST_NAME - docker push $TEST_NAME tags: - build run: stage: run script: - docker login -u USER -p $runnerPass registry.gitlab.com - docker pull -t $TEST_NAME - docker kill $(docker ps -q) || true - docker rm $(docker ps -a -q) || true - docker run -dt -p 8080:80 --name gitlabCICDContainer $TEST_NAME tags: - run
Runner-ы с указанными тэгами должны быть зарегистрированы до запуска pipeline. До выполнения git push, который вызовет сценарий CI/CD.
В интерфейсе Gitlab нужно нажать check piplines для проверки синтаксиса.
Сами тесты и сборка автоматически запускаются после отправки кода в репозиторий, после выполнения git push.
Разработчик добавляет удаленный репозиторий по его домену или ip адресу.
git add remote origin https://repo.example.com/git
Добавляет файлы в staging, делает коммиты и потому отправляет код на удаленный сервер запуская сценарии заданные в gitlab-ci.yml
git push origin base_app
Полный пример .gitlab-ci.yml для приложения
image: ubuntu:latest variables: WORK_DIR: ${CI_PROJECT_NAME} BRANCH: ${CI_COMMIT_REF_NAME} REPO: https://gitlab.com/smth/gitlab-cicd.git stages: - test - deploy test: stage: test environment: name: Test url: "$TST_URL" before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - mkdir -p ~/.ssh - eval $(ssh-agent -s) - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' script: - ssh-add <(echo "$PRIVATE_KEY") - rm -rf .git - ssh -o StrictHostKeyChecking=no ubuntu@"$TST_SERVER" "rm -rf ~/${WORK_DIR}; mkdir ~/${WORK_DIR}; git init; git clone -b ${BRANCH} ${REPO}; cd ${WORK_DIR}; npm install; npm install forever -g; npm run stop; npm run ci" only: - branches except: - master deploy: stage: deploy environment: name: Production url: "$PRD_URL" before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - mkdir -p ~/.ssh - eval $(ssh-agent -s) - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' script: - ssh-add <(echo "$PRIVATE_KEY") - rm -rf .git - ssh -o StrictHostKeyChecking=no ubuntu@"$PRD_SERVER" "rm -rf ~/${WORK_DIR}; mkdir ~/${WORK_DIR}; git init; git clone -b ${BRANCH} ${REPO}; cd ${WORK_DIR}; npm install; npm install forever -g; npm run stop; npm run start-background" only: - master
Здесь видно, при вызове сценария будут выполняться действия, которые делятся на два этапа: test и deploy. Каждый из них привязывается к git ветке репрзитория.
В случае отправки изменеий в ветку master сценарий выполнит последовательность действий, предусмотренную этапом deploy. Приложение соберется и запустится на рабочем сервере.
В случае отправки изменеий в любую ветку кроме сценарий будет выполнять тесты. Тесты это все действия которые перечисляются после директивы script в сценарии.
Для двух веток могут быть разные действия, кроме того — самое важное — различаются сервера, на которых вносятся изменения. Это или рабочий сервер, с которого отдается контент клиентам, либо тестовый сервер или сервера — development стэнд, который используется для отладки.
Читайте про Gitlab Runner и регистрацию Docker Runner-ов.