如何使用 GitLab 在自己的服务器上自动部署 Docker 图像?
How to auto deploy Docker Image on own server with GitLab?
我尝试 Google 几个小时,但找不到它。
我有 Java/Spring 应用程序(+MySQL 如果重要的话),我希望为此创建 CI。
我知道该做什么和怎么做:
- 我知道我必须将我的 Git 存储库移动到 Gitlab。
- 推送回购将触发 CI 脚本。
- Gitlab 会将我的 docker 映像构建到 Gitlab Docker 注册表中。
问题是:
我需要做什么才能强制 docker compose 在我的 VPS 上从 Gitlab 中提取新图像并重新启动服务器?
我知道(如果我错了请纠正我)在我的 VPS 上我应该 运行 docker-compose pull && docker-compose up
在我的应用程序文件夹中,但我真的不知道如何使用 [=39 自动制作它=]实验室?
What do I have to do to force docker compose on my VPS to pull the new image from Gitlab and restart the server?
@m-uu,你根本不需要重启服务器,只需要docker-compose up
拉取新镜像并重启服务
I know (correct me if I am wrong) that on my VPS I should run docker-compose pull && docker-compose up inside my app folder, but I have literally no idea how to make it automatically with Gitlab?
是的,你走对了。看我的Gitlab CI配置文件,我觉得改成Java项目不难。只是给你一些想法,如何构建、推送到你的注册中心并将图像部署到你的服务器。您需要做的一件事是生成 SSH 密钥并将 public 推送到服务器 (.ssh/authorized_keys) 并私有给 GITLAB 管道秘密变量 (https://docs.gitlab.com/ee/ci/variables/#secret-variables)
cache:
key: "cache"
paths:
- junte-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/github.com/junte/junte-api
- mv * $GOPATH/src/github.com/junte/junte-api
- cd $GOPATH/src/github.com/junte/junte-api
- govendor sync
- go build -o junte-api
- cd -
- cp $GOPATH/src/github.com/junte/junte-api .
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:
stage: deploy
image: junte/ssh-agent
variables:
# should be set up at Gitlab CI env vars
SSH_PRIVATE_KEY: $SSH_DEV_PRIVATE_KEY
script:
# copy docker-compose yml to server
- scp docker-compose.dev.yml root@SERVER_IP:/home/junte/junte-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/junte/junte-api/ && docker-compose -f docker-compose.dev.yml pull api-dev && HOME=/home/dev docker-compose -f docker-compose.dev.yml up -d"
environment:
name: dev
only:
- dev
您还需要支持 Docker 的 Gitlab runner。请在Gitlab doc中查看如何安装它。
关于阶段:
build
- 只需更改它以构建您需要的内容
build_image
- 非常简单,只需登录到 gitlab registry,构建新镜像并将其推送到 registry。查看 cache
部分,它需要在阶段之间缓存文件,并且可以因您而异。
deploy-dev
- 那部分更多关于你问的内容。这里的前 6 个命令只是安装 ssh 并创建您的私钥文件以访问您的 VPS。只需复制它并将您的 SSH_PRIVATE_KEY 添加到 Gitlab UI 中的秘密变量。最后 3 个 SSH 命令对你来说更有趣。
我尝试 Google 几个小时,但找不到它。 我有 Java/Spring 应用程序(+MySQL 如果重要的话),我希望为此创建 CI。
我知道该做什么和怎么做:
- 我知道我必须将我的 Git 存储库移动到 Gitlab。
- 推送回购将触发 CI 脚本。
- Gitlab 会将我的 docker 映像构建到 Gitlab Docker 注册表中。
问题是:
我需要做什么才能强制 docker compose 在我的 VPS 上从 Gitlab 中提取新图像并重新启动服务器?
我知道(如果我错了请纠正我)在我的 VPS 上我应该 运行 docker-compose pull && docker-compose up
在我的应用程序文件夹中,但我真的不知道如何使用 [=39 自动制作它=]实验室?
What do I have to do to force docker compose on my VPS to pull the new image from Gitlab and restart the server?
@m-uu,你根本不需要重启服务器,只需要docker-compose up
拉取新镜像并重启服务
I know (correct me if I am wrong) that on my VPS I should run docker-compose pull && docker-compose up inside my app folder, but I have literally no idea how to make it automatically with Gitlab?
是的,你走对了。看我的Gitlab CI配置文件,我觉得改成Java项目不难。只是给你一些想法,如何构建、推送到你的注册中心并将图像部署到你的服务器。您需要做的一件事是生成 SSH 密钥并将 public 推送到服务器 (.ssh/authorized_keys) 并私有给 GITLAB 管道秘密变量 (https://docs.gitlab.com/ee/ci/variables/#secret-variables)
cache:
key: "cache"
paths:
- junte-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/github.com/junte/junte-api
- mv * $GOPATH/src/github.com/junte/junte-api
- cd $GOPATH/src/github.com/junte/junte-api
- govendor sync
- go build -o junte-api
- cd -
- cp $GOPATH/src/github.com/junte/junte-api .
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:
stage: deploy
image: junte/ssh-agent
variables:
# should be set up at Gitlab CI env vars
SSH_PRIVATE_KEY: $SSH_DEV_PRIVATE_KEY
script:
# copy docker-compose yml to server
- scp docker-compose.dev.yml root@SERVER_IP:/home/junte/junte-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/junte/junte-api/ && docker-compose -f docker-compose.dev.yml pull api-dev && HOME=/home/dev docker-compose -f docker-compose.dev.yml up -d"
environment:
name: dev
only:
- dev
您还需要支持 Docker 的 Gitlab runner。请在Gitlab doc中查看如何安装它。
关于阶段:
build
- 只需更改它以构建您需要的内容build_image
- 非常简单,只需登录到 gitlab registry,构建新镜像并将其推送到 registry。查看cache
部分,它需要在阶段之间缓存文件,并且可以因您而异。deploy-dev
- 那部分更多关于你问的内容。这里的前 6 个命令只是安装 ssh 并创建您的私钥文件以访问您的 VPS。只需复制它并将您的 SSH_PRIVATE_KEY 添加到 Gitlab UI 中的秘密变量。最后 3 个 SSH 命令对你来说更有趣。