Gogs+Drone持续集成(CI/CD)入坑详细指南

24 篇文章 0 订阅
5 篇文章 1 订阅

背景

近期在公司内部部署CI/CD平台, 经过比较JenkinsDrone, 基于Drone的优点最终选择了Drone.

一开始也尝试使用docker部署Jenkins, 部署过程中下载插件失败(估计是伟大的墙的原因), 最后直接放弃并尝试部署Drone.

没想到搜遍全网, 相关资料甚少, 能用的drone版本也很老旧.
随后只能一步步看官方文档进行部署, 但是部署过程中发现官方文档也写得不明不白, 遇到了一堆坑.
最后解决问题, 特此记录下来, 供大家参考.

官方文档是使用docker的方式安装, 网上也有博文说使用docker-compose安装失败.

这里先做声明: 不管哪种方式其实都是可以的, 我会先使用docker的方式安装一遍, 最后再提供一个docker-compose文件给大家享用. (我本地是直接使用docker-compose运行的)

安装Gogs

这里不做说明, 看到这篇文章, 相信大家已经安装好Gogs了, 没有安装的可查找相关博文或看官方文档安装, 这个不难, 也没什么坑(如果使用docker安装, 填写MySQL地址使用外部可访问的网络地址, 建议docker服务设置别名).

安装启动drone

调试阶段建议启动设置detach=false, 这样可以查看日志输出

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_DEBUG=true\
  --env=DRONE_LOGS_TRACE=true\
  --env=DRONE_LOGS_DEBUG=true\
  --env=DRONE_LOGS_PRETTY=true\
  --env=DRONE_AGENTS_ENABLED=true \
  --env=DRONE_GIT_ALWAYS_AUTH=true \
  --env=DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b \
  --env=DRONE_SERVER_HOST=192.168.0.201:10080 \
  --env=DRONE_SERVER_PROTO=http \
  --env=DRONE_GOGS_SERVER=http://192.168.0.201:3000 \
  --env=DRONE_USER_CREATE=username:admin,admin:true \
  --publish=10080:80 \
  --publish=10443:443 \
  --restart=always \
  --detach=false \
  --name=drone \
  drone/drone:1

环境变量配置说明

  • DRONE_GOGS_SERVER : Gogs服务地址(建议填写宿主机地址+端口, 需要http://开头)
  • DRONE_GIT_ALWAYS_AUTH: 是否每次都要验证
  • DRONE_RPC_SECRET: Drone服务密匙(后面安装runner使用相同的秘钥)
  • DRONE_SERVER_HOST: Drone服务地址,外部可访问的域名或IP地址(建议填写宿主机地址+端口, 不需要http://开头)
  • DRONE_SERVER_PROTO: Drone提供服务的协议类型,可选为httphttps
  • DRONE_USER_CREATE: 设置Drone管理员账号(注意设置的是Gogs平台里的账号), Drone是直接使用Gogs账号登录的
  • 其他相关DEBUG参数建议开启

安装Drone-runner

drone-runner分几种, 每一种是不一样的, 但是可同时存在.
Drone-runner
drone-runner是执行pipeline的服务, 对应编写.drone.ymltype.
如果你只安装了drone-runner-ssh, 然后你type使用docker, 那是运行不了的
注意:这里很坑, 官方文档没有说明, 当时卡了我两天

kind: pipeline
type: ssh # 必须安装运行的是 drone-runner-ssh, 如果是docker类型则需要安装运行drone/drone-runner-docker
name: default

这里我会同时安装两种类型的runner(sshdocker)

安装启动drone-runner-ssh

docker run -d \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST=192.168.0.201:10080 \
  -e DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b \
  -e DRONE_DEBUG=true \
  -p 10081:3000 \
  --restart always \
  --name ssh-runner \
  drone/drone-runner-ssh

环境变量配置说明

  • DRONE_RPC_SECRET: Drone服务密匙(后面安装runner使用相同的秘钥)
  • DRONE_RPC_HOST: Drone服务地址,外部可访问的域名或IP地址(建议填写宿主机地址+端口, 不需要http://开头)
  • DRONE_RPC_PROTO: Drone提供服务的协议类型,可选为httphttps

安装启动drone-runner-docker

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST=192.168.0.201:10080 \
  -e DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=docker-runner \
  -e DRONE_DEBUG=true \
  -p 10082:3000 \
  --restart always \
  --name docker-runner \
  drone/drone-runner-docker:1

到此, 如无意外, 服务基本安装成功了.
打开浏览器访问一下地址:

http://192.168.0.201:10080

出现一下登录界面:
Drone登录
输入Gogs平台账号, 前面设置的admin账号或其他gogs里的账号也可以登录.
登录后你会发现Drone已同步了Gogs的项目
drone项目
选择一个项目, 点击右边的ACTIVATE
activate
勾选Trusted, 注意, 如果你登录的不是管理员, 那么你看不到这个项目.
勾选Trusted是docker数据卷挂载需要此权限.

例如:

kind: pipeline
type: docker
name: default

steps:
- name: build
  image: golang
  volumes:
  - name: docker
    path: /var/run/docker.sock
  commands:
  - go build

volumes:
- name: docker
  host:
    path: /var/run/docker.sock

上图点击保存后, Drone会在Gogs对应项目设置Webhook
登录Gogs平台查看
Webhook
使用IDE在项目根目录新建文件.drone.yml
注意文件名: 前面有一个"."开头, 这里又一个坑, 坑了我半天
输入内容, 这里以go项目为例:

kind: pipeline
type: docker # 使用docker
name: default

steps:
  - name: test
    image: golang
    commands:
      - echo Hello Drone !!
      - go build

ide
保存后commit&push项目文件, 同时刷新查看Drone平台项目状态
自动部署
自动部署
可以看到, 项目已自动部署成功.

测试ssh项目

新增并激活ssh项目(同上)
另外新增一个Secrets, Secrets用于保存一些敏感信息, 供.drone.yml使用.

kind: pipeline
type: ssh # 使用SSH
name: default

server:
  host: 192.168.0.201
  user: root
  password:
    from_secret: rootpass # Secrets保存的密码

steps:
  - name: build
    commands:
      - echo Hello Drone!!
      - df -h
      - pwd
      - ls -l
      - go version
      - go build

commit&push项目文件, 查看部署情况, 可以看到是ssh在远程服务器执行命令

ssh 部署

我们再试一下停止drone-runner-ssh

修改一下.drone.yml文件, 重新commit&push项目文件, 查看部署情况
异常
你会发现以上异常情况 (界面显示default: Pending), 无法部署完成.
这里卡了我两天, 之前我只安装了drone-runner-docker,
我以为docker是可以的, 那应该ssh也可以, 没想到是不行的. 后来查看日志才发现错误.
教训: 开启DEBUG日志, 遇到问题及时查看

以上只是一些简单例子, 详细的可自行编写

使用docker-compose一键启动服务

version: "3.8"

services:
  gogs:
    image: gogs/gogs
    container_name: my-gogs
    restart: always
    networks:
      dronenet:
        aliases:
          - gogs
    volumes:
      - /data1/mygogs:/data
    ports:
      - "10022:22"
      - "3000:3000"
  drone:
  	# 参考文档 https://docs.drone.io/server/provider/gogs/
    image: drone/drone:1
    container_name: my-drone
    restart: always
    ports:
      - 10080:80
      - 10443:443
    networks:
      dronenet:
        aliases:
          - drone
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /data1/drone/:/var/lib/drone
    environment:
      - TZ=Asia/Shanghai
      - DRONE_DEBUG=true
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true
      - DRONE_LOGS_PRETTY=true
      - DRONE_GIT_ALWAYS_AUTH=false
      - DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b
      - DRONE_SERVER_HOST=192.168.0.201:10080
      - DRONE_SERVER_PROTO=http
      - DRONE_GOGS_SERVER=http://192.168.0.201:3000
      - DRONE_USER_CREATE=username:admin,admin:true
  drone-sshrunner:
  	# docker类型的pipeline必须安装运行drone-runner-ssh
  	# 参考文档 https://docs.drone.io/runner/ssh/overview/
    image: drone/drone-runner-ssh
    container_name: my-drone-sshrunner
    restart: always
    ports:
      - 10081:3000
    depends_on:
      - drone
    networks:
      dronenet:
        aliases:
          - drone-sshrunner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - DRONE_DEBUG=true
      - DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b
      - DRONE_RPC_HOST=192.168.0.201:10080
      - DRONE_RPC_PROTO=http
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone-sshrunner
  drone-runner:
    # docker类型的pipeline必须安装运行drone-runner-docker
    # 参考文档 https://docs.drone.io/runner/docker/overview/
    image: drone/drone-runner-docker:1
    container_name: my-drone-runner
    restart: always
    ports:
      - 10082:3000
    depends_on:
      - drone
    networks:
      dronenet:
        aliases:
          - drone-runner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - DRONE_DEBUG=true
      - DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b
      - DRONE_RPC_HOST=192.168.0.201:10080
      - DRONE_RPC_PROTO=http
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone-runner
networks:
  dronenet:
    external: true # 使用外部网络, 需先创建网络

运行服务

docker-compose up

运行单个服务

docker-compose up drone
docker-compose up drone-runner
docker-compose up drone-sshrunner

停止服务

docker-compose stop

停止单个服务

docker-compose stop drone
docker-compose stop drone-runner
docker-compose stop drone-sshrunner

感想

Drone 还是挺好用的, 搭建和上手速度都很快, 特别是熟悉docker的同学.
只是官方文档不够详细, 社区生态不是很好. 网上可参考的资料比较少. 可能中国用的人比较少.

写这篇文章: 希望可以帮助到需要的同学, 带动生态的发展

参考文档: Drone官方文档

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值