Drone CI 之SSH自动部署
warning:
这篇文章距离上次修改已过573天,其中的内容可能已经有所变动。
前言
在完成凭证管理、自动构建、推送制品库、模板化之后,就可以进行下一步:自动部署,也就是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"
注意以下几点:
- host可以是字符串,也可以是数组,支持多服务器。
- 一定要用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中使用。
评论已关闭