想组合一套cicd流程,但是又不想用gitlab+jenkins那么重。
首先说一下我的硬件条件:
再说一下软件条件:
启动gogs的容器不用赘述,怎么启动都行,反正drone跟他通信也无所谓。
通过ssh连入群晖机器,启动drone的容器和drone-runner的容器,为什么不能通过群晖docker启动呢?主要因为drone-runner的容器启动需要映射docker.socket,并不是用的docker-dind那种方式,其实用gitlab做ci官方也不是推荐docker-dind的方式。
# drone-server
docker run --volume=/volume/docker/drone:/data --env=DRONE_AGENTS_ENABLED=true --env=DRONE_GOGS_SERVER=http://192.168.5.22:11000 --env=DRONE_RPC_SECRET=super-duper-secret --env=DRONE_SERVER_HOST=192.168.5.22:7080 --env=DRONE_SERVER_PROTO=http -e DRONE_USER_CREATE=username:zcbb,admin:true --publish=7080:80 --publish=7443:443 --restart=always --detach=true --name=drone drone/drone:2
# 一定要指定 -e DRONE_USER_CREATE=username:zcbb,admin:true 且这个账户在gogs中存在,如果不指定这个管理员,后面drone不是管理员登陆无法打开磁盘共享
# 一定要配置好gogs的地址,否则启动容器也无法链接到gogs
# drone-runner
docker run --detach --volume=/var/run/docker.sock:/var/run/docker.sock --env=DRONE_RPC_PROTO=http --env=DRONE_RPC_HOST=192.168.50.226:7080 --env=DRONE_RPC_SECRET=super-duper-secret --env=DRONE_RUNNER_CAPACITY=2 --env=DRONE_RUNNER_NAME=my-first-runner --publish=3000:3000 --restart=always --name=runner drone/drone-runner-docker:1
至此 drone两件套就完成了部署,就可以登陆drone了。
使用gogs的账户登录就行:
进入管理界面,如果没有同步到gogs的仓库,点击sync进行同步操作。
一个没有配置过的仓库会呈现如下场景,点击active进行激活配置:
一定勾选Trusted,否则无法映射磁盘,如果启动service时没有指定管理员账号,进入这个页面看到的不一样,无法配置Trusted,切记。
配置完成之后会在gogs对应仓库下新增一个webhook:
下一步就需要你自己在gogs仓库里添加.drone.yml文件了,就是流水线的配置文件:
kind: pipeline
type: docker
name: drone-build-database
steps: # 定义流水线执行步骤,这些步骤将顺序执行
- name: copy # 1. 流水线名称(maven打包)
pull: if-not-exists
image: node-base # 定义创建容器的Docker镜像
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: node-build
path: /app/build/drone-build # 将应用打包好的Jar和执行脚本挂载出来
commands: # 定义在Docker容器中执行的shell命令,这里是复制到maven镜像容器里面的,区分开项目就行了
- ls
- rm -rf /app/build/drone-build/*
- cp -r * /app/build/drone-build
- name: image
pull: if-not-exists
image: appleboy/drone-ssh
settings:
host: www.123456.xyz
username: admin
password: admin
port: 22222
command_timeout: 300s
script:
- sudo su root
- cd /volume1/docker/build_drone
- echo "**********************************"
- echo "start build"
- sudo /usr/local/bin/docker ps -a | grep -E "database" | awk '{print $1}' | xargs sudo /usr/local/bin/docker rm -f
- sudo /usr/local/bin/docker images | grep database | awk '{print $3}' | xargs sudo /usr/local/bin/docker rmi -f
- sudo /usr/local/bin/docker build -f ./Dockerfile -t database .
- echo "end build"
- echo "**********************************"
- echo "run docker"
- sudo /usr/local/bin/docker run --name database -e TZ=Asia/Shanghai -p 18081:80 -idt database
- echo "end run"
- sudo /usr/local/bin/docker ps
- echo "**********************************"
when:
event: [push, pull_request]
branch: [master]
volumes: # 定义流水线挂载目录,用于共享数据
- name: node-build
host:
path: /volume1/docker/build_drone # 从宿主机中挂载的目录
我就简单的抛砖引玉一下,其实我的脚本基本上就做了几个动作:
clone代码 -> copy代码到本地目录 -> 本地build image -> 本地run容器。
需要注意的是,appleboy/drone-ssh镜像不能直接使用docker命令,要么你去ln下,要么就按照我这种笨写法,找到目录,群晖本身不开发root用户了,最高就给你admin用户,开启了admin也是一直提示你不安全,群晖的docker是root用户可执行,登录ssh后也需要你su root下,请配置sudo免密。
su
chmod u+W /etc/sudoers
vi /etv/sudoers
chmod u-w /etc/sudoers
#下面的user是你的用户名 添加这一行就能免密sudo了
admin ALL=(ALL:ALL) NOPASSWD: ALL
都配置完了以后,只要gogs代码推送了,drone就通过webhook执行drone.yml中的流水线stage:
后续操作就很随意了,我是启动了容器,然后路由又开了端口映射,我这个服务提完代码就直接部署到外网可用了。
到此为止,gogs+drone的超轻量级cicd完成。