Как автоматически развернуть образ Docker на собственном сервере с помощью GitLab?


Я пытаюсь погуглить его в течение нескольких часов, но не могу найти его. У меня есть приложение Java/Spring (+MySQL, если это имеет значение), и я ищу, чтобы создать CI для этого.

Я знаю, что делать и как:

  1. я знаю, что мне нужно переместить мой РЕПО Git в Gitlab.
  2. Push to repo вызовет сценарий CI.
  3. Gitlab встроит мой образ docker в реестр Docker Gitlab.

Вопрос:

Что я должен сделать, чтобы заставить docker compose на моем VPS, чтобы вытащить новый образ из Gitlab и перезапустить сервер? Я знаю (поправьте меня, если я ошибаюсь), что на моем VPS я должен запустить docker-compose pull && docker-compose up внутри моей папки приложения, но я буквально не знаю, как сделать это автоматически с помощью Gitlab?

1 5

1 ответ:

Что мне нужно сделать, чтобы заставить docker compose на моем VPS извлечь новый образ из Gitlab и перезапустить сервер?

@m-uu, вам не нужно перезапускать сервер вообще, просто сделайте docker-compose up, чтобы вытащить новый образ и перезапустить службу

Я знаю (поправьте меня, если я ошибаюсь) , что на моем VPS я должен запустить docker-compose pull && docker-compose внутри моей папки приложения, но я буквально не знаю, как сделать это автоматически с помощью Gitlab?

Да, вы находитесь на правильный путь. Посмотрите на мой конфигурационный файл GitLab CI, я думаю, что его нетрудно изменить для Java-проекта. Просто дайте вам идеи, как построить, протолкнуть в реестр и развернуть образ на вашем сервере. Одна вещь, которую вам нужно сделать, это сгенерировать SSH-ключи и нажать public на сервер (.ssh / authorized_keys) и закрытая для конвейера GitLab секретная переменная (https://docs.gitlab.com/ee/ci/variables/#secret-variables )

cache:
  key: "cache"
  paths:
  - toscale-api

stages:
  - build
  - build_image
  - deploy

build:
  image: golang:1.7
  stage: build
  script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" > ~/key && chmod 600 ~/key
    - ssh-add ~/key
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

    - go get -u github.com/kardianos/govendor
    - mkdir -p $GOPATH/src/gitlab.com/toscale/toscale-api
    - mv * $GOPATH/src/gitlab.com/toscale/toscale-api
    - cd $GOPATH/src/gitlab.com/toscale/toscale-api
    - govendor sync
    - ls -l /go
    - ls -l /go/src
    - go build -o toscale-api
    - cd -
    - cp $GOPATH/src/gitlab.com/toscale/toscale-api/toscale-api .
    - ls -l

build_image:
  image: docker:latest
  stage: build_image
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE .
    - docker push $CI_REGISTRY_IMAGE

deploy-dev:
  image: debian:jessie
  stage: deploy
  environment:
      name: dev
  script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" > ~/key && chmod 600 ~/key
    - ssh-add ~/key
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    # copy docker-compose yml to server
    - scp docker-compose.dev.yml root@SERVER_IP:/home/toscale/toscale-api/
    # login to gitlab registry       
    - ssh root@SERVER_IP docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    # then we cd to folder with docker-compose, run docker-compose pull to update images, and run services with `docker-compose up -d`
    - ssh root@SERVER_IP "cd /home/toscale/toscale-api/ && docker-compose -f docker-compose.dev.yml pull api-dev && HOME=/home/dev docker-compose -f docker-compose.dev.yml up -d"
  only:
    - dev

Вам также понадобится GitLab runner с поддержкой Docker. Как установить это посмотрите в GitLab doc, пожалуйста.

О стадиях:

  • build - просто измените его, чтобы построить то, что вам нужно
  • build_image - очень просто, просто войдите в реестр gitlab, создайте новый образ и вставьте его в реестр. Посмотрите на cache часть, она должна кэшировать файлы между этапами и может быть разной для вас.
  • deploy-dev - эта часть больше о том, что вы спросили. Здесь первые 6 команд просто установите ssh и создайте свой файл закрытого ключа, чтобы иметь доступ к вашему VPS. Просто скопируйте его и добавьте ваш SSH_PRIVATE_KEY для секретных vars в GitLab UI. Последние 3 SSH команды более интересны для вас.