Drone CI的持续集成的基本使用

本文基于前文 如何搭建GitLab+Drone CI的持续集成环境 ,如果还没有搭建好Drone CI不妨先查阅此文把环境建好再回来品读本文。

在项目根目录创建 .drone.yml 文件

首先我们需要创建一个 .drone.yml 的配置文件放到项目的根目录来让 Drone 帮我们完成一些编译-更新的动作。如下是一个简单的例子:

1
2
3
4
5
6
pipeline:
build: # step name
image: node # use docker image
commands:
- npm install # install node project vendor
- npm run build # build static files

这个配置文件所做的动作很简单,Clone代码(被隐藏了,Drone会自动执行)然后进入 Git Clone 后的目录,然后根据指定的动作(Step Name)一步一步往下执行,这里的话当然仅仅是使用了Docker镜像并执行npm install 安装项目所需的依赖以及 npm run build 来编译静态文件。当然这里还可以加入 npm test 来进行测试代码是否有问题。至于这个配置文件的语法的话,用的是 yaml 的语法,跟 Docker Compose 配置文件的语法是一样的。yaml 根据缩进来断句, 这点与Python是类似的。(写代码的时候记得备好游标卡尺,2333

使用Plugins

Drone是一个开源项目,所以有很多开发者为Drone开发了很多很实用的插件,比如Email通知SCP等等,你可以在Drone插件市场找寻更多实用的插件。当然也可以在GitHubDockerHub找寻更多有用的插件。(Drone官方的插件市场只收录了部分插件,因为没有集中的插件发布地址,所以部分小众需求的插件或许只能通过其他渠道搜寻得到了)需要在Drone中使用插件是一件再简单不过的事情,下面是例子:

1
2
3
4
5
6
7
8
9
10
11
pipeline:
# ...
use-plugin:
image: appleboy/scp # plugin image
host: your-domain.com # scp host
username: host_username # scp username
password: 123456 # or use key for ssh private key
port: 1228 # default 22
target: /path/to/your/scp/host # the path what you want scp to
source: dist # the directory what you want scp
rm: true # remove exists path

上面的配置文件简单地使用了官方插件市场中推荐的SCP插件,更多用法可以查阅插件市场提供的文档。这里的配置文件也非常简单,主要使用了插件(其实也是一个Docker镜像)来自动地做一些体系化的动作。这里的话是把上面 npm run build 打包好的静态文件夹 dist 发布到目标主机的指定目录下。因为是静态文件,甚至不用做重启HTTP服务器的动作就完成了代码发布的动作,是不是超简单!(小声地:Nodejs是世界上最好的语言!)

使用Secrets变量

众所周知,我们的 .drone.yml 文件是跟代码放在一起的,但是 .drone.yml 文件中往往会存在一些敏感信息,直接明文写到配置文件上是极度不安全的!还好,智者先行,连我都能想到的问题,开发这个工具的大神早就想到并给出了解决方案,那就是使用Secrets环境变量!这个神奇的Secrets变量怎么设置呢?其实很简单,在 Drone Web 对应的项目 build 目录下,点击右上角就可以设置当前项目的Secrets变量啦!

此处应有Gif

如图所示,我们已经创建好名为 drone_rsatargetsource以及 username的四个Secrets环境变量啦,那么怎么使用呢?使用也很简单,在 .drone.yml 文件中加上 secrets 标签即可,具体用法可以看下面的例子:(改写上面的例子)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pipeline:
# ...
use-plugin:
image: appleboy/scp
host: your-domain.com
secrets:
- source: DRONE_RSA
target: scp_key
- source: USERNAME
target: ssh_username
- source: TARGET
target: scp_target
- source: SOURCE
target: scp_source
rm: true

如上配置,Drone就可以成功读取到刚刚设置的Secrets变量啦,是不是超简单!同理可以把 host或其他步骤中的私密配置项都使用变量来增加安全性。

一个例子配置文件

上面已经分解地讲解了一个 .drone.yml 文件主要的几部分,下面是实战时间。下面是我在一个前端项目中使用的一个 .drone.yml 配置文件,迫于保密重要信息已做打码处理(使用了Secrets变量):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
clone:
from_cache:
image: drillster/drone-volume-cache
restore: true
mount:
- .git
volumes:
- /tmp/cache:/cache
git:
image: plugins/git
pull: true
pipeline:
restore-cache:
image: drillster/drone-volume-cache
restore: true
mount:
- ./node_modules
volumes:
- /tmp/cache:/cache
build:
image: node
commands:
- cp .env.json.example .env.json
- sed -i "s/\"https\":\ [^,]*/\"https\":\ \"true\"/g" .env.json
- sed -i "s/\"apiHost\":\ [^,]*/\"apiHost\":\ \"$STAGING_API_HOST\"/g" .env.json
- sed -i "s/\"webHost\":\ [^,]*/\"webHost\":\ \"$STAGING_WEB_HOST\"/g" .env.json
- sed -i "s/\"wxAppId\":\ [^,]*/\"wxAppId\":\ \"$STAGING_WX_APP_ID\"/g" .env.json
- cat .env.json
- npm install
- npm run-script build
secrets: [staging_api_host, staging_web_host, staging_wx_app_id]
when:
branch: [staging]
rebuild-cache:
image: drillster/drone-volume-cache
rebuild: true
mount:
- ./node_modules
volumes:
- /tmp/cache:/cache
deploy:
image: appleboy/drone-scp
username: ubuntu
secrets:
- source: DRONE_RSA
target: scp_key
- source: STAGING_API_HOST
target: ssh_host
- source: SCP_TARGET
target: scp_target
- source: SCP_SOURCE
target: scp_source
# target: scp host path
# source: current path
rm: true
when:
branch: [staging]
status: [success]
dingtalk:
image: xtony77/drone-dingtalk
secrets:
- source: DINGTALK_HOOK
target: plugin_webhook
when:
status: [failure, success]
brach: [staging]

这个配置文件主要工作流程是这样的:判断是否有.git 缓存,如果没有则git clone仓库,如果有则还原缓存,然后于远端进行同步;判断是否有node_modules 缓存,如果有则还原,如果没有则跳过;执行commands 里面的脚本;缓存指定目录(这里是.gitnode_modules);SCP指定目录下的静态文件到服务器;钉钉通知代码更新结果。这里使用了 cache,主要缓存了 .gitnode_modules 目录,缩短 git clonenpm install 的时间。这里还是用了 when 标签来控制流程。当然还有的就是我们刚刚讲过的 secrets 标签。

Happy Ending

本篇文章到这就全部结束了,感谢大家的阅读。希望大家能从这篇文章中得到帮助。如果你对这篇文章有任何意见或建议,都欢迎给我发送邮件,优质的文章离不开读者的反馈。