Drone自动化构建学习

发布时间 2023-08-02 19:04:39作者: 念秋

使用Drone进行自动化构建

提到CI/CD,最有名的当然是jenkins,但是它好像太复杂了,不管是装在主机,还是装在docker里,都很难使用,更何况很多插件还很难下载。上手难度这么大,当然就不利于新手学习了,于是转而使用Drone,它可是相当轻量的产品了,本身就支持以容器提供服务。

虽然只是简单的过程,但是却是不那么容易就能实践。

匆匆看看网上的教程,都会提到需要配置git服务器的Oauth授权,首先面临的困难就是,电脑没有公网IP,那么就不能访问到自己的仓库,于是决定自己搭建一个gitlab,在内网环境下,自己分配IP地址就好了。没想到部署起来也是相当困难,不知道是不是因为我的虚拟机配置太低了或者已有的环境太复杂了。虚拟机安装gitlab和docker安装gitlab,一访问就是502。忘了截图了。没办法,只能重新考虑使用公共的Git服务器,于是决定使用Gitee。

虽然电脑没有公网IP,但是好在有云服务器,它有公网IP,可以进行内网穿透。

frp_linux_amd64

我的虚拟机和云服务器都是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应用授权。

image-20230802173942728

点击以后,往下拉。

image-20230802174009331

再点击第三方应用。

image-20230802174030536

点击创建。

image-20230802174525853

官网教程链接

创建成功:

image-20230802174710731

image-20230802174759385

这些属性,都是可以修改的。这里,我们只需要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账号,获取所有仓库列表并展示。

如下图所示:

image-20230802161921761

上午操作的时候,也是有点懵,能获取到列表,为什么还是404呢。

点了好几个都不行,好在仓库很多,后面又点了下面的仓库,发现有的是未激活状态,有的是404状态
一度以为是仓库的结构不行,比如有没有证书,有没有readme.md啥的。后来发现,就是单纯的不支持项目首字母大写。

image-20230802161929218

解决方案就是去gitee,把项目名称修改为小写。

image-20230802162316255

修改以后,点击Drone界面的SYNC,再点击项目,就可以进行激活等操作了。激活项目,就会在gitee对应的仓库设置里面自动打开一个webhook,所以不需要用户手动去开启了

image-20230802162303025

基本的配置完成了,下面就需要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官网查看
  

image-20230802112012107

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了。

image-20230802144747818

查看项目设置,没有任何可以修改的地方

image-20230802145035817

这个表示Drone账号权限不足,所以才需要在创建Drone-server的时候,添加一个管理员账号,上面的命令就是后来改过的。

登录Drone的管理员账号后:

image-20230802144810650

image-20230802144821320

把这个运行容器特权设置的选项打开,再保存修改。然后点击new Build,就可以直接重新构建了。

image-20230802144849899

构建成,提示Success。然后查看虚拟机的挂载目录

[root@localhost ~]# cd /home/drone
[root@localhost drone]# ls
1440  docker-compose.yml  drone
可以看见,构建的可执行文件复制出来了。

image-20230802152232609

image-20230802152246849

接下来,需要修改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

image-20230802152318705

可以看见已经推送到官方仓库了

然后在虚拟机拉取镜像并运行,即可。

docker pull yyjeqhc/tools:latest
docker run -d -p 8080:8080 --name my_container yyjeqhc/tools:latest

image-20230802152552159

上面的drone.yml是最终版本的,修改了docker login里面的密码,一开始采用的是明文,后来查看博客,发现可以进行修改。
在项目的设置里面,点击Secrets,再点击添加secrets

image-20230802160304091

image-20230802161516260

就是起到类似于环境变量的效果。这个secret的使用就是上面的from_secret

下面是补充:

kind: pipeline
type: docker

steps:
- name: test
  image: alpine
  commands:
  - echo "hello world"

本来是404的项目,修改项目名称后,再提交,可以正常构建了。

image-20230802162612415

image-20230802162629935

image-20230802162640573

在项目构建过程中,我想要让go build那个容器运行编译的二进制文件并且在后台运行,结果发现它有IP地址,但是怎么修改drone.yml,都不能访问到它的8080号端口,也就放弃了。

还有,构建过程中,发现有一个git的容器在运行,但是构建过程一结束,也就被删除了。所以,不知道是不是每次构建,都要重新拉取全部代码。

总的来说,也可以算是入门了吧。