gogs是Go实现的Git服务器,不看不知道,一看吓一跳,在github上的star数量居然快到两万了。在gitlab如此好用的情况下,能取得如此大的成就真的令人刮目相看。另外gogs主要的作者都是中国人,所以安装运行起来之后会让人感觉到扑面而来的亲切感。
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下来的,这是一个巨坑。
启动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这边。
这里有一个坑是Web钩子里面要把推送地址
里面的localhost也改成本地地址,要不然没法通知到Drone。
设置好Web Hooks之后,跑到Drone里面就可以看到项目和构建的过程啦。
一些悬而未解的问题。
- Drone对github的支持?Setting up a self-hosted drone.io CI server这篇文章讲得不错。
- Drone CLI的玩法
- Drone怎么管理构建集群的?迄今为止没见到过集群管理界面。