Drone CI

背景

其实 Drone CI 对于一般用途是用不到的,只有在一些比较极限的情况下才会用得到。

  1. 你的代码不能托管到 Github(即使是私有仓库)
  2. 搭建本地的 Gitlab 又没有 runner(非常极限的条件)

只有同时满足这两点,Drone CI 才能发挥出最大的功能。

on Docker

使用 Docker 来做构建,是一个非常优雅的选择。

  • 干净的环境
  • 通过镜像来简化构建流程
  • 所有流程清晰可读

同时 这套 CI 可以非常优雅的部署到 Docker 上。所以下文 都通过 docker 来部署和构建。

部署 Drone CI

参考官方文档: Drone Installation Guides
Gitlab: 13.10
Docker 2.10.7
Drone: 2
Drone runner docker: 1

0x00 生成密钥

openssl rand -hex 16

会返回一个32长度的字符串 用于 Drone 的内部通信

0x01 生成 API token

这里是以 Gitlab 来做的,在图形界面上就可以。

会返回

  • Application ID
  • Secret
  • Callback URL

这个 Callback URL 是预先输入的,建议提前想好 Drone 怎么部署,否则需要重新生成。

0x02 部署 Drone CI

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITLAB_SERVER=http://gitlab.inmind.ltd \
  --env=DRONE_GITLAB_CLIENT_ID={{your Application ID}} \
  --env=DRONE_GITLAB_CLIENT_SECRET={{your Secret}} \
  --env=DRONE_RPC_SECRET={{ 0x00 密钥 }} \
  --env=DRONE_SERVER_HOST={{当前服务器ip}} \
  --env=DRONE_SERVER_PROTO=http \
  --env=DRONE_LOGS_DEBUG=true \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2

0x03 部署runner

runner 会控制当前节点的 Docker,所以Docker需要预先开放 sock 用来通讯 *1

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST={{your drone host}} \
  -e DRONE_RPC_SECRET={{ 0x00 密钥 }} \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=${HOSTNAME} \
  -p 3000:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1

构建

yml

构建文件默认是 /.drone.yml

java

kind: pipeline
name: maven java 11

steps:
  - name: build
    image: maven:3-jdk-11
    commands:
      - mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -B -V

如果你还想要部署的话 可以使用 appleboy 开源的插件

在 steps 里面 继续添加

steps:
  - name: depoly jar
    image: appleboy/drone-scp
    settings:
      host:
        - 192.168.10.10
      username: root
      password:
        from_secret: TEST_PASSWORD
      port: 22
      target: /usr/share/server/tmp
      source:
        - target/*.jar
      rm: true
    when:
      branch:
        - master
  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host: 192.168.10.10
      username: root
      password:
        from_secret: TEST_PASSWORD
      port: 22
      script:
        - cd /usr/share/server
        - ./shutdown.sh
        - rm -rf *.jar
        - mv tmp/target/* ./
        - ./start.sh
    when:
      branch:
        - master

node

kind: pipeline
name: node build

steps:
  - name: build-client
    image: node:12.20.0-alpine
    commands:
      - npm version
      - npm install
      - npm run build-pro

前端部署和后端部署类似 但可能会简单一些

到这里就全部完成了

Tips

开放 docker sock *1

  1. 添加 docker 启动参数
vim /lib/systemd/system/docker.service

# 找到 ExecStart 添加 一个参数

-H unix:///var/run/docker.sock
  1. 重启docker服务
systemctl daemon-reload
systemctl restart docker

runner 节点的基础镜像

如果你的网络较差,构建却又报错,那么可以检查一下 runner 节点是否 存在 drone/git 镜像。

shutdown.sh

对于 startup 脚本 写起来会比较容易,但如果是结束进程就比较麻烦了。进程 ID 是不可控的。

但 好在 一般的web服务 端口都是固定的,可以通过端口来查找进程 然后发出停止信号。

kill -15 `lsof -t -i:80`