轻量化CICD平台建设

一、需求

想组合一套cicd流程,但是又不想用gitlab+jenkins那么重。

首先说一下我的硬件条件:

  1. 一台群晖920,两块4T的红盘,20G内存
  2. 一台华硕tuf的路由器,有联通给的动态外网ip,在路由器做了ddns

再说一下软件条件:

  1. docker已经安装,并且启动了gogs代码托管的容器
  2. 群晖开启ssh

二、docker+gogs+drone轻量化CICD建设

启动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完成。 

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/127293359