什么是 Drone

Drone 是一个现代化的继续集成和继续交付平台,使繁忙的团队可能主动构建、测试和公布工作流。应用 Drone 的团队公布软件的频率更高,bug更少。1

人话:Drone 是一个轻量级的 jenkins ,能够简略的实现软件的流水线化测试、编译、部署。并且能够和 gitlab github gogs gitea 轻松的联合到一起。

前提

本文对读者作出以下假如:

  • 具备较为丰盛的 git 应用教训
  • 能够纯熟的操作某种 git 服务平台,如 gogs、github、gitlab …. 本文以gogs为例
  • 具备肯定的 linux 和 docker 的常识储备和操作教训
  • 或者也会应用 docker-compose
  • 或者懂一点 k8s

环境配置:

  • 本文应用 Gogs 为例
  • drone 为以后最新版:1.8.x

本文波及到的工程文件:https://github.com/alex-techs/drone-tutorial

本文链接:https://println.org/url/ODQ=

原理

个人观点,仅供参考

参加角色

角色性能
用户Gogs
Drone ServerDrone 主服务,提供Web界面
Drone Runner我了解为实现各种操作的适配器,例如ssh、docker、k8s操作
Drone Agent操作宿主机 Docker API 的代理程序
Docker Server宿主机的 Doker 程序

装置

整个 Drone 体系都是基于docker运行的,所以无需装置,拉下几个镜像即可。当然也能够等运行的时候主动解决。

这里只是列出这些镜像和阐明其作用

  • 主服务
docker pull drone/drone
  • docker操作代理
docker pull drone/agent
  • ssh runner

以 ssh runner 为例

docker pull drone/drone-runner-ssh

配置

没什么配置,只是几个docker的启动参数而已。

server

参数作用
DRONE_GOGS_SERVER要连贯的 GOGS 服务器地址
DRONE_GIT_ALWAYS_AUTH在克隆公共repo时仍然进行身份认证
DRONE_RPC_SECRETDRONE 主服务对外接口的密钥,调用所有接口均须要提供
DRONE_SERVER_HOSTDRONE 主服务启动时监听的地址,相似 server_name 的概念
DRONE_SERVER_PROTODRONE 主服务启动时的协定,http \\https,非必须
DRONE_DEBUG默认false,是否输入debug日志,非必须
DRONE_PROVIDER服务提供者,申明是 gogs,非必须
DRONE_DATABASE_DATASOURCE申明主服务应用的数据源,非必须
DRONE_DATABASE_DRIVER申明主服务应用的数据库驱动,非必须
DRONE_GOGS_SKIP_VERIFY是否强制应用TLS与gogs建设链接,默认false,非必须

agent

参数作用
DRONE_RPC_SERVER即 DRONE_SERVER_HOST
DRONE_RPC_SECRET即 DRONE_RPC_SECRET
DRONE_DEBUG默认false,是否输入debug日志,非必须
DOCKER_HOST宿主机 docker 的 json api 默认监听的地址
DRONE_RPC_PROTODRONE 主服务启动时的协定,http \\https

ssh-runner

参数作用
DRONE_RPC_PROTO即 DRONE_SERVER_PROTO
DRONE_RPC_HOST即 DRONE_SERVER_HOST
DRONE_RPC_SECRET即 DRONE_RPC_SECRET

其它参数大全:https://docs.drone.io/server/reference/

如何使docker监听 tcp 2375 端口

DOCKER_HOST 须要这个值

编辑宿主机的 /usr/lib/systemd/system/docker.service 文件

找到:

 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

批改为:

 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock

从新加载 service 缓存

systemctl daemon-reload

重启docker

systemctl restart docker

启动

环境变量

export GOGS_URL="http://1.1.2.3:2048"export DRONE_HOST="0.0.0.0"export DRONE_SECRET="xh1HJLO2yfandlwjeHdsL3Kklwheour89"export DOCKER_HOST="tcp://`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge`:2375"

server

docker run -d \    --volume=/var/lib/drone:/data \    --env=DRONE_GOGS_SERVER=${GOGS_URL} \    --env=DRONE_RPC_SECRET=${DRONE_SECRET} \    --env=DRONE_SERVER_HOST=${DRONE_HOST} \    --env=DRONE_SERVER_PROTO=http \    --publish=3005:80 \    --restart=always \    --name=drone \    drone/drone

agent

docker run -d \    --env=DOCKER_HOST=${DOCKER_HOST} \    --env=DRONE_RPC_SERVER=http://drone-server \    --env=DRONE_RPC_SECRET=${DRONE_SECRET} \    --restart=always \    --name=drone-agent \    --link drone:drone-server \    drone/agent

ssh-runner

docker run -d \  -e DRONE_RPC_HOST=drone-server \  -e DRONE_RPC_SECRET=${DRONE_SECRET} \  --restart always \  --name runner \  --link drone:drone-server \  drone/drone-runner-ssh

应用 Web 界面治理构建

如果你正确的启动了上述的几个镜像,那么你关上浏览器,输出IP:3005 能够进入到 DRONE主服务的web治理界面的登陆界面,账号密码为 DRONE_GOGS_SERVER 设置的 Gogs 服务器的账号密码。

留神:防火墙肯定要凋谢3005端口,否则是无法访问到 Drone 的

主界面:

当你的Gogs退出了新的我的项目,能够应用 SYNC 按钮同步到 Drone 中来

为新工程开启构建

Save之后将会主动生成 Gogs WebHook,然而它生成的地址未经转换,间接是 DRONE_HOST 拼接了 /hook,那就会产生一些问题

  1. 咱们配置地址为0.0.0.0是为了公网可拜访,那它生成这样的地址要上哪里发回调。咱们要手动改成浏览器中能够拜访的那个地址,例如:http://xxx.org:3005/hook

    无论你配置的什么地址,都应该亲自来 Gogs 中看一看,是否是可拜访的地址

  2. 如果咱们配置的 DRONE_HOST 是 127.0.0.1/ 那么它将会生成这样的地址,临时先不关注端口的话,就只有多了个/的问题。按常理来讲多一个/不会影响申请成果,然而Drone会受影响,要手动去掉/,批改为正确地址才能够。例如:http://xxx.org:3005/hook

  3. 配置实现后你须要点铅笔符号,拉到最上面,有一个 Test Delivery ,点击上来察看是否能够胜利推送。

    如果是这样,那就要从新查看你的 Webhook 域名配置了。

    如果是绿色,阐明你的配置正确。并且 Drone 将会启动第一次构建,然而因为咱们没有 .drone.yml 文件,所以构建肯定是失败的

我的项目详情界面

书写 .drone.yml 配置文件

Hello World

在你的我的项目根目录,新建 .drone.yml 并写入以下内容

kind: pipelinename: defaultsteps:    -   name: Hello World        image: centos        commands:            - echo Hello World
Key含意
kind默认为 pipeline
type这里没有用到,标记本次构建应用的 runner 类型,默认是 docker 即默认应用Docker Runner
name因为drone反对同时书写多个构建工作,所以须要为本工作起个名字
steps数组构造,流水线化的构建步骤
steps.images本步骤运行在哪个docker镜像中,该镜像必须存在于 docker hub 中
steps.commands构建过程中,将会顺次执行的命令,如果命令退出码非0,将会终止构建本次构建

提供 JSON 版本来辅助了解数据结构。当然也能够间接应用json,因为json是非法的yml格局

{    "kind": "pipeline",    "name": "default",    "steps": [        {            "name": "Hello World",            "image": "centos",            "commands": [                "echo Hello World"            ]        }    ]}

Drone 配置文件除 yml 和 json 之外,还能够应用 jsonnet,官网示例:https://docs.drone.io/pipeline/scripting/jsonnet/

一次大胆的尝试

cat >.drone.yml<<EOFkind: pipelinename: defaultsteps:    -   name: Hello World        image: centos        commands:            - echo Hello WorldEOFgit add .drone.ymlgit commit -am "first commit"git push origin master

Gogs

Drone

注:如果你的构建始终处于期待开始状态,也就是齿轮转圈不胜利也不失败。你就要检查一下 agent 容器是否正确的启动和drone 主服务是否能正确的链接到 agent 容器中了。一般来说是主服务没有链接上,始终在期待 agent。

对于机密

为新工程开启构建 一节曾经稍微解释过机密的作用。本节次要形容如何应用机密

新建机密

为什么咱们要定义一个叫做 log-path 的值,而不是password等真的机密。一会儿你就晓得了

增加实现

在 .drone.yml 中应用机密

批改 Hello World 时建设的 .drone.yml,应用 from_secret 来取出机密的值

cat >.drone.yml<<EOFkind: pipelinename: defaultsteps:    -   name: Hello World        image: centos        environment:                VARPATH: /var            LOGPATH:                from_secret: log-path        commands:            - echo $${VARPATH}            - echo $${LOGPATH}            - ls $${LOGPATH}EOFgit add .drone.ymlgit commit -am "first commit"git push origin master

咱们退出了 environment 组,该组的作用是在运行的容器内事后设置一些环境变量。并且建设了几个环境变量。

重点: VARPATH是间接明文,LOGPATH 则是应用了 from_secret 并输出了咱们方才在web界面上新建的机密的key。

所以能够简略的了解 from_secret 是为了从机密读取某个key,from_secret 除了 environment 之外,也能够利用于任意的字段中。

注:个别的shell命令应用一个$来获取变量,而 commands 应用$$ 是因为 yml 会解析$,并且替换为yml变量值,应用两个$$本义则能够放弃原文。

验证

注:因为无奈看到原文,所以应用password举例的话并不能验证是否正确。应用一个目录来 ls 则能够判断是否真的读取到了机密的值

Runner

管道可帮忙您主动执行软件交付过程中的步骤,例如启动代码生成、运行自动测试以及部署到暂存环境或生产环境。管道执行由源代码存储库触发。代码更改会触发运行相应管道的 Drone 的 Webhook。其余常见触发器包含主动打算或用户启动的工作流。通过将文件放在 git 存储库的根目录来配置管道。yaml 语法设计为易于浏览和表白,以便查看存储库的任何人都能够了解工作流。

本例应用方才启动的 ssh runner,其它runner的应用可参考官网示例https://docs.drone.io/pipeline/overview/

npm initnpm install helloworldcat >.drone.yml<<EOFkind: pipelinetype: sshname: defaultserver:    host: xxxx.org    user: root    password:        from_secret: password  # ssh_key:  #         from_secret: ssh_key    steps:    -   name: list        commands:            - ls /var    -   name: npm        environment:            PATH: "$$PATH:/opt/node-v14.3.0-linux-x64/bin/"        commands:            - pwd            - node --version            - npm version            - npm installEOFgit add .git commit -am "first commit"git push origin master

注:

  1. 这里的 password 咱们应用的就是从机密中获取到的
  2. 也能够应用 ssh_key 来链接,然而咱们启动 ssh runner 时并未映射key文件,所以应用明码进行演示。
  3. npm init 是为了让我的项目转换成npm我的项目,以演示 npm 等命令,并非必须
  4. PATH设置这个值是我的 node装置目录,为了让 commands 中的 npm 能够正确执行。你能够换成你本人的node装置门路
  5. 这次配置了多个 step,drone 也将会在ssh链接到的主机中顺次执行这些命令。

执行后果

执行正确,构建实现。

复合构建工作

咱们在 Hello World 中提到过,是能够书写多个构建工作的。原理是利用 yml 能够应用 --- … 拼接多个文件的个性,简略的能够了解为 .drone.yml 能够是多个 .drone.yml 拼起来的。

示例:将咱们的 Hello World 和 ssh runner 工作拼起来,同时执行。

---kind: pipelinename: Hello Worldsteps:    -   name: Hello World        image: centos        environment:            VARPATH: /var            LOGPATH:                from_secret: log-path        commands:            - echo $${VARPATH}            - echo $${LOGPATH}            - ls $${LOGPATH}---kind: pipelinetype: sshname: Ssh-Runnerserver:    host: xxxxx.org    user: root    password:        from_secret: passwordsteps:    -   name: list        commands:            - ls /var    -   name: npm        environment:            PATH: "$$PATH:/opt/node-v14.3.0-linux-x64/bin/"        commands:            - pwd            - node --version            - npm version            - npm install...

每一对---两头,就是一个构建工作。... 示意完结,可省略。

成果

应用 docker-compose 编排容器

本文不对 docker-compose 进行解说,可返回官网学习。

这份文件的作用与启动一节的ssh命令成果统一。其中的DOCKER_HOST 须要依据理论的值来进行替换

cat >docker-compose.yml<<EOFversion: '3'services:    drone-server:        image: drone/drone        ports:            - 3005:80        volumes:            - /var/lib/drone:/data        environment:            - DRONE_GOGS_SERVER=http://1.1.2.3:2048            - DRONE_RPC_SECRET=xh1HJLO2yfandlwjeHdsL3Kklwheour89            - DRONE_SERVER_HOST=0.0.0.0            - DRONE_SERVER_PROTO=http    drone-agent:        image: drone/agent        depends_on:            - drone-server        environment:            - DRONE_RPC_SERVER=http://drone-server            - DRONE_RPC_SECRET=xh1HJLO2yfandlwjeHdsL3Kklwheour89            - DOCKER_HOST=tcp://172.17.0.1:2375        links:            - drone-server    drone-ssh:        image: drone/drone-runner-ssh        depends_on:            - drone-server        environment:            - DRONE_RPC_PROTO=http            - DRONE_RPC_HOST=drone-server            - DRONE_RPC_SECRET=xh1HJLO2yfandlwjeHdsL3Kklwheour89        ports:            - 3000:3000        links:            - drone-serverEOFdocker-compose up -d

插件

Drone 还有相当丰盛的插件能够应用,示例:https://docs.drone.io/plugins/overview/

并不像其它的软件一样提供插件开发的api,drone 插件的原理就是运行docker镜像。在容器启动时主动加载step中写入的环境变量或命令。你能够齐全将插件能够将它当作一种 step。

原理简略,不再赘述。

咱们最终的代码构造

.├── .git│   └── ...├── node_modules│   └── helloworld│       └── ...├── .drone.yml├── package-lock.json└── package.json

总结

咱们曾经学会了 drone 的装置、配置、根本应用,也晓得了如何应用drone进行主动构建和排查呈现的问题,学到了“机密”的应用办法,还学会了一个 ssh runner 和执行多个构建工作。

那么当初咱们就能够实现在代码更新后主动操作近程主机,更新、测试、编译、部署,实现根本的继续集成。

然而Drone 的能力,远不止于此。