终于到了最激动人心的时刻了,自动化部署!
Docker环境下的自动部署不同于k8s,没有容器编排工具的情况下,实际上就是使用ssh的方式敲命令docker run而已。
编写.drone.yml
接着我们前文中CI的后面写,把CD的步骤也加上去,这里提供完整的yml,仍然是vue3项目:
kind: pipeline
type: docker
name: hulu-project
steps:
- name: docker
image: plugins/docker
settings:
mirror: https://jnyis2wm.mirror.aliyuncs.com
username:
from_secret: username
password:
from_secret: password
repo: registry-vpc.cn-shanghai.aliyuncs.com/hulu0811/whatsfordinner
registry: registry-vpc.cn-shanghai.aliyuncs.com
tags:
- latest
- ${DRONE_COMMIT}
- name: ssh-deploy
image: appleboy/drone-ssh
settings:
host: 127.0.0.1
username: root
password:
from_secret: server-password
repo_username:
from_secret: repo-username
repo_password:
from_secret: repo-password
port: 22
script:
- docker login --username=${repo_username} --password=${repo_password} registry-vpc.cn-shanghai.aliyuncs.com
- docker pull registry-vpc.cn-shanghai.aliyuncs.com/hulu0811/whatsfordinner:${DRONE_COMMIT}
- docker tag registry-vpc.cn-shanghai.aliyuncs.com/hulu0811/whatsfordinner:${DRONE_COMMIT} test-cicd:latest
- docker stop test-cicd || true && docker rm test-cicd || true
- docker run -d --restart=always -v /var/applogs/:/var/applogs/ --name=test-cicd -p 8088:8088 test-cicd:latest
这里只注意name为 ssh-deploy 的步骤,该步骤使用的插件叫drone-ssh,顾名思义,drone的ssh插件,该插件主要功能就是通过插件容器ssh到远程服务器执行命令,setting实际上就是每个插件运行容器的环境变量,具体的可以查看文档,这里只简单说下:
- host和port:ssh目标远程服务器的ssh端口和地址。
- username和password:目标远程服务器登陆的用户名和密码
- 其他的参数比如repo_username之类的是我自行定义的,为了方便在script中使用,这里定义的参数实际上就是drone-ssh的环境变量,当该插件的容器ssh到远程服务器时,环境变量会在执行的命令中生效。
- script:一个数组,里面是每个步骤要执行的命令,我这里使用了命令进行docker部署
以上配置都填完后,CD步骤就完成了,怎么样是不是很简单,如果你愿意的话,也可以使用docker-compose等轻量级容器编排工具,只需要替换script中的命令,并且在源码中添加docker-compose.yml就可以了,有兴趣的话可以自行去查阅了解,本文不再赘述。
那么接下来提交代码或者手动触发工作流试试看,没有问题的话会显示如下:

现在可以去你的服务器中检查项目是否已经成功部署起来了,没有问题的话,恭喜你已经拥有了自己的drone CICD了!
使用DockerLayerCache优化构建速度
现在你已经拥有了自己的cicd,但如果你经常使用docker build的话,聪明的你一定发现了一个非常吊诡的事情——每次构建竟然都没有use cache!
没错,drone作为一个docker in docker(dind)的CI平台,你的docker build命令实际上是在容器内执行的,而该容器在完成任务后会带着你的构建缓存就地销毁,导致你下一次构建的时候全部都要重来一次,每次项目重建依赖包的时候都会耗费你几分到十几分的人生!
这个问题我当时绕了很大的弯子,用了好几天去查资料做实验,甚至还把公司的测试服务器搞坏掉了,最后发现解决办法异常简单,这里容我卖个关子,我后续的文章会详细讲述如何解决docker layer cache无法在dind环境生效的问题。
通告: 搭建自己的企业级CICD-引言 – HuLuBlog