• Post author:
  • Post category:运维
  • Post comments:1评论
  • Reading time:2 mins read

终于到了最激动人心的时刻了,自动化部署!

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环境生效的问题。

葫芦

葫芦,诞生于1992年8月11日,游戏宅,胶佬,爱好摸鱼,一个干过超市收银,工地里搬过砖,当过广告印刷狗,做过电焊铁艺的现役.Net程序员。

这篇文章有一个评论

发表回复