Drone CI 之SSH自动部署

warning: 这篇文章距离上次修改已过365天,其中的内容可能已经有所变动。

前言

在完成凭证管理、自动构建、推送制品库、模板化之后,就可以进行下一步:自动部署,也就是CICD中的CD
这里我们使用Drone CI 的SSH插件

介绍

这个插件主要用于ssh到远程服务器,执行脚本进行更新等等操作。
建议将服务器地址、账号、密钥、端口等信息都存放在凭证管理服务中(如Vault)

使用

看一下示例脚本片段:

kind: pipeline
name: default

steps:
- name: ssh
  image: appleboy/drone-ssh
  settings:
    host:
      - example1.com
      - example2.com
    username: ubuntu
    password:
      from_secret: ssh_password
    port: 22
    script:
      - echo "Hello World"

注意以下几点:

  1. host可以是字符串,也可以是数组,支持多服务器。
  2. 一定要用script来定义命令,如果用command(s)会覆盖掉插件的entrypoint

使用环境变量

在日常场景中,可能会碰到如下场景:需要依赖服务器中的某个目录的文件,比如compose*脚本,而这个流程我们希望做的尽可能是通用的。
那这种场景下我们可以使用环境变量+模板来完成这件事。模板中定义目录和脚本名,传递到插件的环境变量中。然后插件直接使用。看下示例片段:

 
  - name: 发布
    image: appleboy/drone-ssh
    pull: if-not-exists
    depends_on: [构建{{ $project.name }}镜像]
    environment:
      WORK_DIR:
        from_secret: work_dir
      PLUGIN_ENVS: WORK_DIR
    settings:
      host:
        from_secret: host
      port:
        from_secret: port
      username:
        from_secret: ssh_user
      key:
        from_secret: key
      ssh_passphrase:
        from_secret: passphrase
      script:
        - cd $${WORK_DIR}
        - docker compose -f {{ $project.compose_file }} pull {{ $project.service }}
        - docker compose -f {{ $project.compose_file }} up -d {{ $project.service }}

注意下,我们script中对于变量的引用并不是普通的${WORK_DIR}方式,而是多了一个$。这是因为官方在执行前,会预处理一次yml文件。而这个时候,还不是在容器内部,所以作为容器内部的环境变量WORK_DIR是不存在的,就会出现脚本执行时这个变量为空的情况。
官方文档中提到了这个问题,使用两个$就可以避免在脚本预处理的过程中被替换,而是会原样保留。

同时,要注入环境变量进去还需要声明一个PLUGIN_ENVS环境变量,将需要使用到的环境变量名写进去,逗号分隔。这样才可以在script中使用。
最后修改于:2023年05月09日 17:00

评论已关闭