Drone自动化构建学习
使用Drone进行自动化构建
提到CI/CD,最有名的当然是jenkins,但是它好像太复杂了,不管是装在主机,还是装在docker里,都很难使用,更何况很多插件还很难下载。上手难度这么大,当然就不利于新手学习了,于是转而使用Drone,它可是相当轻量的产品了,本身就支持以容器提供服务。
虽然只是简单的过程,但是却是不那么容易就能实践。
匆匆看看网上的教程,都会提到需要配置git服务器的Oauth授权,首先面临的困难就是,电脑没有公网IP,那么就不能访问到自己的仓库,于是决定自己搭建一个gitlab,在内网环境下,自己分配IP地址就好了。没想到部署起来也是相当困难,不知道是不是因为我的虚拟机配置太低了或者已有的环境太复杂了。虚拟机安装gitlab和docker安装gitlab,一访问就是502。忘了截图了。没办法,只能重新考虑使用公共的Git服务器,于是决定使用Gitee。
虽然电脑没有公网IP,但是好在有云服务器,它有公网IP,可以进行内网穿透。
我的虚拟机和云服务器都是centos,直接下载这个就好了。下载解压,稍微修改一下配置文件即可使用。
云服务器:
软件结构很简单,解压即用,没有多余的东西
[root@VM-4-10-centos frp_0.51.2_linux_amd64]# ls
frpc frpc_full.ini frpc.ini frps frps_full.ini frps.ini LICENSE
[root@VM-4-10-centos frp_0.51.2_linux_amd64]# cat frps.ini
[common]
bind_port = 200
这个配置很简单,让frps监听200号端口
运行下述命令,即可启动
[root@VM-4-10-centos frp_0.51.2_linux_amd64]# ./frps -c ./frps.ini
虚拟机
[root@localhost frp_0.51.2_linux_amd64]# cat frpc.ini
[common]
server_addr = 公网IP地址
server_port = 200
[http]
type = tcp
local_ip = 0.0.0.0
local_port = 80
remote_port = 100
[root@localhost frp_0.51.2_linux_amd64]# ./frpc -c frpc.ini
这样配置,就可以把http://公网IP:100 转发到虚拟机的80端口了。
需要注意,这里的100和上面的200端口号,都需要允许通过防火墙。
打开虚拟机的nginx(默认监听80),浏览器访问 http://公网IP:100,就可以访问到虚拟机的nginx了。
这里没有截图,访问成功,说明转发成功了。
到这里,就可以去修改gitee的配置了。配置Oauth应用授权。
点击以后,往下拉。
再点击第三方应用。
点击创建。
上图中docker的回调地址就是 应用主页地址/login,也就是只有应用主页地址可以自由修改,图片编辑太长就看不见了。
创建成功:
这些属性,都是可以修改的。这里,我们只需要ClientID 和ClientSecret
本来是准备把drone-server和drone-runner写在一个docker-compose.yml的,但是不知怎的,drone-server 一直提示log fatal ,main code manage error(大概是这样),然后就无限重启了。
没办法,只能把它俩分开,单独运行了。
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITEE_CLIENT_ID=这里填入上面那个client_id \
--env=DRONE_GITEE_CLIENT_SECRET=这里填入上面那个client-secret \
--env=DRONE_RPC_SECRET=123456(测试使用,实际需要专门生成) \
--env=DRONE_SERVER_HOST=这里就是上面的公网IP:port \
--env=DRONE_SERVER_PROTO=这里和网页配置的一样,填入http \
--env=DRONE_USER_CREATE=username:yyjeqhc,admin:true(Drone账号,管理员高于普通注册的账号) \
--publish=80:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:2
大概就是Drone有一个账号,然后在浏览器打开,访问的就是你浏览器登录的git账号。Drone账号权限高,就可以做特殊的操作,这里公开了80号端口,前面需要提前关闭占用80和443端口的应用。
整体的参数可以看drone官网的教程。
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITEE_CLIENT_ID=0ccb18bdb92317c2469def84b470387445dcccf3b2aeca4a2bfe74bf099e5a92 \
--env=DRONE_GITEE_CLIENT_SECRET=b18567521b869546213d7178d547b6f82b6c464f00c75eb91a7568475475723b \
--env=DRONE_RPC_SECRET=123456 \
--env=DRONE_SERVER_HOST=yyjeqhc.cn:100 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_USER_CREATE=username:yyjeqhc,admin:true \
--publish=80:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:2
直接在网页注册Drone账号的过程就略过了,实验的时候把两个账号都登陆了,删除也很麻烦。
以下直接从登录Drone以后记录。
登录以后,会直接访问你浏览器那个gitee账号,获取所有仓库列表并展示。
如下图所示:
上午操作的时候,也是有点懵,能获取到列表,为什么还是404呢。
点了好几个都不行,好在仓库很多,后面又点了下面的仓库,发现有的是未激活状态,有的是404状态
一度以为是仓库的结构不行,比如有没有证书,有没有readme.md啥的。后来发现,就是单纯的不支持项目首字母大写。
解决方案就是去gitee,把项目名称修改为小写。
修改以后,点击Drone界面的SYNC,再点击项目,就可以进行激活等操作了。激活项目,就会在gitee对应的仓库设置里面自动打开一个webhook,所以不需要用户手动去开启了
基本的配置完成了,下面就需要drone-runner了。
docker run --detach \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--env=DRONE_RPC_PROTO=http \
--env=DRONE_RPC_HOST=yyjeqhc.cn:100 \
--env=DRONE_RPC_SECRET=123456 \
--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_RPC_相关参数,和server保持一致,也可以在drone官网查看
drone runner是实际执行任务的容器,没有运行runner,server将无法完成工作。进度条卡在白色转圈圈
此时,再启动runner容器,进度条就变成黄色转圈圈,表示正在构建了。
普通的构建还是很容易成功的,这里跳过。
下面是把构建的文件保存到主机。
kind: pipeline
type: docker
steps:
- name: test
image: golang:latest
volumes:
- name: cache
path: /tmp/cache
commands:
- go build
- cp ./tools /tmp/cache/1440
volumes:
- name: cache
host:
path: /home/drone
我的项目是tools,以上内容保存为.drong.yml文件。
push项目,会自动构建,没想到都不用拉取代码,直接就fail了。
查看项目设置,没有任何可以修改的地方
这个表示Drone账号权限不足,所以才需要在创建Drone-server的时候,添加一个管理员账号,上面的命令就是后来改过的。
登录Drone的管理员账号后:
把这个运行容器特权设置的选项打开,再保存修改。然后点击new Build,就可以直接重新构建了。
构建成,提示Success。然后查看虚拟机的挂载目录
[root@localhost ~]# cd /home/drone
[root@localhost drone]# ls
1440 docker-compose.yml drone
可以看见,构建的可执行文件复制出来了。
接下来,需要修改drone.yml,添加把构建的可执行文件复制到镜像里面,进行发布。
kind: pipeline
type: docker
steps:
- name: test
image: golang:alpine
volumes:
- name: cache
path: /tmp/cache
commands:
- go build
- cp ./tools /tmp/cache/1542
- name: build
image: docker:dind
privileged: true
volumes:
- name: cache
path: /tmp/cache
- name: docker_sock
path: /var/run/docker.sock
environment:
API_KEY:
from_secret: dockerhubkey
commands:
- echo "FROM alpine" > Dockerfile
- echo "COPY ./tools /" >> Dockerfile
- echo "CMD [\"/tools\"]" >> Dockerfile
- docker build -t yyjeqhc/tools:drone .
- docker login -u yyjeqhc -p $API_KEY
- docker push yyjeqhc/tools
volumes:
- name: cache
host:
path: /home/drone
- name: docker_sock
host:
path: /var/run/docker.sock
这个也很麻烦,这里没有记录过程,直接展示最后可用的代码了。前提是需要自己提前在docker的hub仓库创建存储库。
push项目,自动构建,查看hub.docker
可以看见已经推送到官方仓库了
然后在虚拟机拉取镜像并运行,即可。
docker pull yyjeqhc/tools:latest
docker run -d -p 8080:8080 --name my_container yyjeqhc/tools:latest
上面的drone.yml是最终版本的,修改了docker login里面的密码,一开始采用的是明文,后来查看博客,发现可以进行修改。
在项目的设置里面,点击Secrets,再点击添加secrets
就是起到类似于环境变量的效果。这个secret的使用就是上面的from_secret
下面是补充:
kind: pipeline
type: docker
steps:
- name: test
image: alpine
commands:
- echo "hello world"
本来是404的项目,修改项目名称后,再提交,可以正常构建了。
在项目构建过程中,我想要让go build那个容器运行编译的二进制文件并且在后台运行,结果发现它有IP地址,但是怎么修改drone.yml,都不能访问到它的8080号端口,也就放弃了。
还有,构建过程中,发现有一个git的容器在运行,但是构建过程一结束,也就被删除了。所以,不知道是不是每次构建,都要重新拉取全部代码。