体验基于gogs+Drone搭建的CI/CD平台

1字数 787阅读 8282

gogs是Go实现的Git服务器,不看不知道,一看吓一跳,在github上的star数量居然快到两万了。在gitlab如此好用的情况下,能取得如此大的成就真的令人刮目相看。另外gogs主要的作者都是中国人,所以安装运行起来之后会让人感觉到扑面而来的亲切感。

image.png

Drone是一个CI/CD平台,支持通过docker来分发和使用。感觉它的主要特点就是基于docker来完成pipeline里面的任务。相对于fastlane里面的action脚本,基于docker感觉是有点重的。

Drone is a lightweight, powerful continuous delivery platform built 
for containers. Drone is packaged and distributed as a Docker 
image and can be downloaded from Dockerhub.

Docker、gogs和Drone都是使用go语言写的,这是它们的共同特点,也使得它们的关系非常密切。所以下面也通过docker在单机上把平台搭建起来。这样很方便,但是也有一些令人蛋疼的坑。

在Mac OS上面首先需要安装docker,安装的方法请参考容器、微服务、深度学习和阿里云这篇文章里面Docker for Mac部分。

使用docker安装gogs和Drone image,都使用最新版本就好。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
drone/drone         latest              6f6d25ca3e3a        2 days ago          25.8 MB
gogs/gogs           latest              e2c7c23d0b12        3 days ago          128 MB

接下来启动三个server,记得将里面的ip地址改成本机的。

启动gogs server

docker run --name=gogs -p 10022:22 -p 3000:3000 -v /tmp/gogs:/data gogs/gogs

打开gogs的安装界面,记得将所有的localhost都改成本机的ip地址,否则Drone agent跑在自己的容器里面,使用http://localhost:3000/henshao/CQ001.git这样的地址是不可能把项目clone下来的,这是一个巨坑。

image.png

启动Drone server

docker run -d \
     -e DRONE_GOGS=true \
     -e DRONE_GOGS_URL=http://30.8.60.50:3000 \
     -e DRONE_OPEN=true \
     -e DRONE_SECRET=hello1234 \
     -v /tmp/drone:/var/lib/drone \
     -p 9090:8000 \
     --restart=always \
     --name=drone \
     drone/drone

启动Drone agent

docker run -d \
     -e DRONE_SERVER=ws://30.8.60.50:9090/ws/broker \
     -e DRONE_SECRET=hello1234 \
     -v /var/run/docker.sock:/var/run/docker.sock \
     --name=drone-agent \
     drone/drone agent

三个server都启动之后,通过docker ps -a可以看到三个容器都运行起来了。gogs的日志会直接打印在终端,drone和drone-agent的日志可以通过docker logs drone或drone-agent命令查看。

5522f193c991        plugins/git:latest   "/bin/drone-git"         28 minutes ago      Exited (0) 28 minutes ago                                                   0_1094465437123776148_clone
324913d65eb2        drone/drone          "/drone agent"           28 minutes ago      Up 28 minutes               80/tcp, 443/tcp, 8000/tcp                       drone-agent
a9dc883b3a8e        gogs/gogs            "/app/gogs/docker/..."   41 minutes ago      Up 41 minutes               0.0.0.0:3000->3000/tcp, 0.0.0.0:10022->22/tcp   gogs
4f188969d8fd        drone/drone          "/drone server"          44 minutes ago      Up 44 minutes               80/tcp, 443/tcp, 0.0.0.0:9090->8000/tcp         drone

去gogs里面设置管理员账号,这个账号可以在Drone里面登录。

创建一个空项目,然后拷贝一份.drone.yml进来,并且push到服务器端。这样便可以在Drone里面看到这个项目。

pipeline:
  backend:
    image: golang
    commands:
      - go get
      - go build
      - go test

  frontend:
    image: node:6
    commands:
      - npm install
      - npm test

  notify:
    image: plugins/slack
    channel: developers
    username: drone

.drone.yml是docker-compose的超集,所以应该可以表达docker-compose的能力,所以drone就非常适合测试微服务的场景,可以把依赖的服务通过docker运行起来,并且link好。

Get started by placing a .drone.yml file in the root of your repository. 
The .drone.yml is a superset of the [docker-compose](https://docs.docker.com/compose/) file format. 

在Drone里面开启Web钩子。这样gogs仓库那边有相关的变动,会通知到Drone这边。

image.png

这里有一个坑是Web钩子里面要把推送地址里面的localhost也改成本地地址,要不然没法通知到Drone。

image.png

设置好Web Hooks之后,跑到Drone里面就可以看到项目和构建的过程啦。

image.png

一些悬而未解的问题。

  1. Drone对github的支持?Setting up a self-hosted drone.io CI server这篇文章讲得不错。
  2. Drone CLI的玩法
  3. Drone怎么管理构建集群的?迄今为止没见到过集群管理界面。

推荐阅读更多精彩内容