Drone CI
背景
其实 Drone CI 对于一般用途是用不到的,只有在一些比较极限的情况下才会用得到。
- 你的代码不能托管到 Github(即使是私有仓库)
- 搭建本地的 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
- 添加 docker 启动参数
vim /lib/systemd/system/docker.service
# 找到 ExecStart 添加 一个参数
-H unix:///var/run/docker.sock
- 重启docker服务
systemctl daemon-reload
systemctl restart docker
runner 节点的基础镜像
如果你的网络较差,构建却又报错,那么可以检查一下 runner 节点是否 存在 drone/git
镜像。
shutdown.sh
对于 startup 脚本 写起来会比较容易,但如果是结束进程就比较麻烦了。进程 ID 是不可控的。
但 好在 一般的web服务 端口都是固定的,可以通过端口来查找进程 然后发出停止信号。
kill -15 `lsof -t -i:80`