给你的项目启用Drone CI

在Drone Web中启用对某个项目的支持

首先打开我们的Drone Web页面

Drone-Web

并找到我们需要启用的项目并点击进入启用页面(如果找不到想要的项目或许需要点一下SYNC按钮同步项目列表)

Activate-Page

点击启用,然后禁用Project webhooks,给Project settings全部勾上,Project visibility建议Internal(内部可见)级别即可,勾选完毕之后点击Save(保存)就OK啦。

Settings-Page

当然,这些选项后续都是可以进行更改的,所以没必要在这浪费太多时间,让我们继续往下看。

第一个 .drone.yml

首先,我们需要给我们的项目根目录中加入一个非常简单易懂的名叫.drone.yml的配置文件,用于告诉Drone这个项目我们需要它协助(持续集成)。下面是一个用于前端项目的简单例子:

1
2
3
4
5
6
7
8
9
10
---
kind: pipeline
name: dev

steps:
- name: build
image: node:latest
commands:
- npm i
- npm run build

这个配置前两行是声明了一个名叫devpipelinesteps部分才是配置运行步骤的地方。这个配置文件中,我们使用了node官方的latest tag的镜像来打包我们的项目。Drone会根据node:latest镜像创建一个容器,并在容器中执行npm i命令以及npm run build命令。

很好,到此为止,我们已经学会了怎么书写一个简单的.drone.yml,如果你还想要接受更多挑战,请继续往下看。

进化版 .drone.yml

通过上面一个小节我们已经学会了怎么添加一个最基础的.drone.yml,但是我们实际项目中,一般还存在.env文件用于存储不同环境的变量,在Drone中我们要怎么做呢?把不同环境的.env文件都放进代码版本库里面吗?当然不,永远不要将.env.example以外的.env文件上传到代码版本库中!我们还有更好的解决方案 – Vault,下面我们将学习怎么使用Vault管理我们的密钥(变量)。

首先需要运维大大帮忙配置好Vault以及drone-vault,具体操作在此略过。

好的,我们已经拥有一个配置好的Vault并且把DroneVault通过drone-vault插件链接在一起,使得Drone可以读取到我们存储在Vault中的密钥。接下来,我们先在Vault中存储我们接下来在.drone.yml中将会使用到的密钥。对于Vault我们只是用户,所以我们直接在Vault Web页面中添加我们的密钥即可,一般使用k-v存储引擎来存储,那么我们首先来创建一个k-v引擎:

create-k-v-engine

OK,我们已经创建好了k-v存储引擎。一个引擎下面还可以存在多个路径,所以我建议可以将引擎当作一个group来使用,同group的项目密钥可以存储到同一个引擎中。我们假设有一个叫example的项目需要用到usernamepassword这两个配置项,然后有三个环境拥有不同的值,三个环境分别是:devstagingmaster,那么我们可以这样新建:

create-project-secrets

Vault中新建了secrets之后,我们接下来要在.drone.yml中引入刚刚设置的secrets。在Drone中提供了一个secretkind用于引入其他密钥存储引擎中的密钥,让我们分别引入这三个环境的变量:

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
---
kind: pipeline
name: dev
steps:
- name: build
image: node:latest
commands:
- sed -i "s#\"username\":[^,]*#\"username\":$USERNAME#g" .env
- sed -i "s#\"password\":[^,]*#\"password\":$PASSWORD#g" .env
environment:
USERNAME:
from_secret: dev_username
PASSWORD:
from_secret: dev_password
trigger:
branch:
dev

---
kind: pipeline
name: staging
steps:
- name: build
image: node:latest
commands:
- sed -i "s#\"username\":[^,]*#\"username\":$USERNAME#g" .env
- sed -i "s#\"password\":[^,]*#\"password\":$PASSWORD#g" .env
environment:
USERNAME:
from_secret: staging_username
PASSWORD:
from_secret: staging_password
trigger:
branch:
staging

---
kind: pipeline
name: master
steps:
- name: build
image: node:latest
commands:
- sed -i "s#\"username\":[^,]*#\"username\":$USERNAME#g" .env
- sed -i "s#\"password\":[^,]*#\"password\":$PASSWORD#g" .env
environment:
USERNAME:
from_secret: master_username
PASSWORD:
from_secret: master_password
trigger:
branch:
master

---
kind: secret
name: dev_username
get:
path: your-group/data/example
name: dev_username
---
kind: secret
name: dev_password
get:
path: your-group/data/example
name: dev_password

---
kind: secret
name: staging_username
get:
path: your-group/data/example
name: staging_username
---
kind: secret
name: staging_password
get:
path: your-group/data/example
name: staging_password

---
kind: secret
name: master_username
get:
path: your-group/data/example
name: master_username
---
kind: secret
name: master_password
get:
path: your-group/data/example
name: master_password

配置文件一目了然,首先告诉DroneVaultyour-group/example目录下取值,然后把取到的值以环境变量的形式注入到node容器中,然后配合sed替换指定的.env中的配置项。然后分成三个环境分别进行以上三步。

很好,我们学会了如何使用Vault来存储我们的密钥以及怎么从Drone中使用这些密钥。如果你还想要接受更多挑战,请继续往下看。

使用Volume缓存

因为大部分包管理仓库都架设在国外,所以我们国内要安装一个项目的依赖包的时候,往往需要耗费九牛二虎之力。而因为Drone的工作模式是每次自动打包都会重新创建一个容器,并且每次打包结束(打包成功或打包失败)都会将这个容器销毁,因此我们项目所需要的依赖包每次都要重新安装,耗时不说,还极有可能安装失败,简直就是受到身体以及内心上的双重打击。幸好,我们可以通过使用Volume来获得救赎。

使用过Docker的小伙伴肯定对Volume不陌生,而Drone中也提供了这一功能。我们可以将容器中的指定路径映射到宿主机上的指定路径中,这样就可以一次安装,持久有效了!

秉承着不要重复造轮子的原则,在这里我们使用Drone Plugin Market中提供的drillster/drone-volume-cache镜像,简单的使用如下:

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
---
kind: pipeline
name: dev
steps:
- name: restore-cache
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
restore: true
mount:
- ./node_modules

- name: build
image: node:latest
commands:
- npm i
- npm run build

- name: rebuild-cache
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
rebuild: true
mount:
- ./node_modules

volumes:
- name: cache
path: /tmp/cache

这段配置文件工作流程是:首先创建一个名字叫cacheVolume,并映射到宿主机的/tmp/cache路径下。然后在build之前先尝试还原node_modules,如果没有缓存则跳过进入build步骤,之后会尝试重新缓存node_modules目录到cache volume(也就是宿主机的/tmp/cache中)。具体的缓存-还原过程可以去查看drillster/drone-volume-cache的源码噢!

更多用法

更多用法可以参考Drone的官方文档

Happy Ending

好记性不如烂笔头,看到这还没有开始写你的第一个.drone.yml文件?快去书写你的第一个.drone.yml并发现更多高级用法来解放自己的双手吧!Let’s create a wonderful world!