如何使用GitLab在自己的服务器上自动部署Docker Image?

时间:2017-06-14 13:03:26

标签: spring continuous-integration gitlab gitlab-ci

我正在尝试谷歌它几个小时,但找不到它。 我有Java / Spring应用程序(如果重要,则为+ MySQL),我希望为此创建CI。

我知道该怎么做以及如何:

  1. 我知道我必须把我的Git回购转移到Gitlab。
  2. Push to repo将触发CI脚本。
  3. Gitlab会将我的docker镜像构建到Gitlab Docker Registry。
  4. 问题是:

    我需要做些什么来强制我的VPS上的docker compose从Gitlab中提取新图像并重新启动服务器? 我知道(纠正我,如果我错了)在我的VPS上我应该在我的app文件夹中运行docker-compose pull && docker-compose up,但我真的不知道如何使用Gitlab自动生成它?

1 个答案:

答案 0 :(得分:7)

  

我需要做些什么来强制我的VPS上的docker compose从Gitlab中提取新图像并重新启动服务器?

@ m-uu,您根本不需要重新启动服务器,只需执行docker-compose up以获取新映像并重新启动服务

  

我知道(纠正我,如果我错了)在我的VPS上我应该运行docker-compose pull&& docker-compose up在我的app文件夹中,但我真的不知道如何使用Gitlab自动制作它?

是的,你是正确的方式。看看我的Gitlab CI配置文件,我认为为Java项目更改它并不困难。只需提供有关如何构建,推送到注册表以及将映像部署到服务器的建议。您需要做的一件事是生成SSH密钥并将公共服务器推送到服务器(.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

你还需要支持Docker的Gitlab运行器。如何在Gitlab doc中安装它。

关于阶段:

  • build - 只需更改它以构建您需要的内容
  • build_image - 非常简单,只需登录gitlab注册表,构建新映像并将其推送到注册表。查看cache部分,它需要在阶段之间缓存文件,并且可能与您不同。
  • deploy-dev - 那部分更多关于你的要求。这里前6个命令只安装ssh并创建私钥文件以访问您的VPS。只需将其复制并将您的SSH_PRIVATE_KEY添加到Gitlab UI中的秘密变量即可。最后3个SSH命令对您来说更有趣。