如何使用-drone-进行持续集成

3次阅读

共计 7720 个字符,预计需要花费 20 分钟才能阅读完成。

什么是 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 Server Drone 主服务,提供 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_SECRET DRONE 主服务对外接口的密钥,调用所有接口均须要提供
DRONE_SERVER_HOST DRONE 主服务启动时监听的地址,相似 server_name 的概念
DRONE_SERVER_PROTO DRONE 主服务启动时的协定,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_PROTO DRONE 主服务启动时的协定,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: pipeline
name: default
steps:
    -   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<<EOF
kind: pipeline
name: default
steps:
    -   name: Hello World
        image: centos
        commands:
            - echo Hello World
EOF

git add .drone.yml
git 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<<EOF
kind: pipeline
name: default
steps:
    -   name: Hello World
        image: centos
        environment:
                VARPATH: /var
            LOGPATH:
                from_secret: log-path
        commands:
            - echo $${VARPATH}
            - echo $${LOGPATH}
            - ls $${LOGPATH}
EOF

git add .drone.yml
git 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 init
npm install helloworld

cat >.drone.yml<<EOF
kind: pipeline
type: ssh
name: default

server:
    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 install
EOF

git 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: pipeline
name: Hello World
steps:
    -   name: Hello World
        image: centos
        environment:
            VARPATH: /var
            LOGPATH:
                from_secret: log-path
        commands:
            - echo $${VARPATH}
            - echo $${LOGPATH}
            - ls $${LOGPATH}

---

kind: pipeline
type: ssh
name: Ssh-Runner

server:
    host: xxxxx.org
    user: root
    password:
        from_secret: password

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 install
...

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

成果

应用 docker-compose 编排容器

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

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

cat >docker-compose.yml<<EOF
version: '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-server
EOF

docker-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 的能力,远不止于此。

正文完
 0