添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

首先打开我们的 Drone Web 页面

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

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

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

第一个 .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

这个配置前两行是声明了一个名叫 dev pipeline steps 部分才是配置运行步骤的地方。这个配置文件中,我们使用了 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 并且把 Drone Vault 通过 drone-vault 插件链接在一起,使得 Drone 可以读取到我们存储在 Vault 中的密钥。接下来,我们先在 Vault 中存储我们接下来在 .drone.yml 中将会使用到的密钥。对于 Vault 我们只是用户,所以我们直接在 Vault Web 页面中添加我们的密钥即可,一般使用 k-v 存储引擎来存储,那么我们首先来创建一个 k-v 引擎:

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

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

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

配置文件一目了然,首先告诉 Drone Vault your-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

这段配置文件工作流程是:首先创建一个名字叫 cache Volume ,并映射到宿主机的 /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!