В материале приведем пример файла .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-ов.
