利用rancher,gitlab,drone,harbor进行集成发布
起因
主要是为了将零散的repo集中起来。还有就是可以好好的用下rancher。虽然rancher比起国内的kubesphere显得有点不那么的易用,但是对于基本上对于基础架构一点不懂的team来说部署和操控都是很方便。
实现过程
gitlab
gitlab是开发人员的唯一接口,开发者将代码推送给gitlab中对应的库就好了。其余的事情由后台的运维人员进行。当然如果开发人员自己写部署的pipeline也是可以的。只是大部分的开发人员不太懂这些,也可能是比较懒。
安装gitlab的过程按照gitlab的官网文档即可,唯一要注意的是,要开启本地网络的允许hook的请求,否则后面的要进行hook的动作会报错。
开启的地方是:
gitlab->管理中心->设置->网络->外发请求
安装Harbor
根据官方文档安装即可。这里要说明的是可以创建一个用户,添加这个用户到对应的项目中作为项目管理员,这个用户的权利比较大,可以进行image的更新和删除的工作。该账号也可以用于下面的drone的pipeline中将生成的docker image推送到harbor。这样比较简单,但是基于安全考虑,可以做不同的设定。
harbor如果没有什么特别的原因还是启用SSL的访问方式。
创建gitlab和drone的关联
我这里直接使用的是gitlab的root用户。
在用户设置中,选择应用。 在名称中输入drone,在redirect URI中输入drone的访问页面。
这里我用的是http的方式,回调地址为 http://drone.mydomain.cn/login
对于该应用的范围,我这里除了写库,写registry外,全部勾选了。
然后保存应用后,就会有app id和password两个key出来。
还要再创建一个共享key: openssl rand -hex 16
安装drone 和 drone runner
- 安装drone
根据官方文档安装即可: https://docs.drone.io/server/provider/gitlab/
这里的client id就是上面生成的app id,client secret就是上面的password,rpc secret就是用openssl生成的随机字符。
要说明的是这个里面的server_host要和proto对应起来,我这里都是http的,所以server protol是http,然后我的host记录是drone.mydomain.cn.
我试着用https反代的方式来添入这个server host,但是在部署的时候提示错误。也没有继续研究下去。使用https的方式后面再看。
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITLAB_SERVER=https://gitlab.mydomain.com \
--env=DRONE_GITLAB_CLIENT_ID= \
--env=DRONE_GITLAB_CLIENT_SECRET= \
--env=DRONE_RPC_SECRET= \
--env=DRONE_SERVER_HOST=drone.mydomain.cn \
--env=DRONE_SERVER_PROTO=http \
--publish=80:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
- 安装drone runner
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=drone.mydomain.cn \
-e DRONE_RPC_SECRET=c35215163c269b40e43dc2ded7a7e602 \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=${HOSTNAME} \
-p 3000:3000 \
--restart always \
--name runner \
drone/drone-runner-docker:1
- 测试gitlab和drone的互通性
访问http://drone.mydomain.cn 页面会跳转到gitlab.mydomain.cn进行验证。验证通过后,会返回drone的页面。如果身份下面有对应的repo存在,则drone中会显示对应的项目。
为了实现集成,要做的就是在drone中激活对应的项目即可。
这里要说明的是,激活后,需要在项目的repo中创建.drone.yml文件,这个文件是告诉drone当repo被commit后要做什么事情的。这个文件如果没有写好,会导致集成的失败或者不连续。
看看.drone.yml的写法
- 创建test项目
- server.go
- Dockerfile
- .drone.yml
- server.go ```go package main
import ( “fmt” “log” “net/http” )
func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, “Hello World”) }
func main() { http.HandleFunc(“/”, hello) if err := http.ListenAndServe(“:8080”, nil); err != nil { log.Fatal(err) } }
- Dockerfile
```bash
FROM golang
WORKDIR /go
ADD server /go
CMD ["./server"]
- .drone.yml
kind: pipeline
type: docker
name: build
steps:
- name: build-code #对代码进行build
image: golang:alpine # 使用的image是golang
pull: if-not-exists # always never
commands:
- go build -tags netgo server.go # 这里要特别注意,如果缺少-tags netgo的话,在进行pipeline的时候会提示找不到对应的文件或文件夹的错误
- name: build-image #如果build-code阶段没问题,进行镜像的创建
image: plugins/docker #创建的来源
settings:
repo: dockhub.mydomain.cn/library/go-server # 这里是在harbor上创建的项目地址
registry: dockhub.shnyu.edu.cn # 这里是harbor的访问地址
use_cache: true
username: # 这里的两个变量需要在drone中对应的项目中进行设定,这里的username,password对应harbor中该项目的有镜像push权限的人员的用户名和密码
from_secret: docker_username
password:
from_secret: docker_password
tags: ${DRONE_BUILD_NUMBER} #这里的这个tag的意思是build的次数
insecure: true
trigger:
branch:
- master # 当repo是master库的时候
event:
- push #进行push操作
进行pipeline
- 确认drone中对应的repo已经激活
- 上面的test的repo中的文件都已经commit
- 然后在drone中进行sync操作看看,等上10几秒,如果还是没有什么反应,那就在gitlab的repo中,创建个readme.md文件,commit下,激活下drone的执行
- 执行的过程就是.drone.yml中的步骤,按照这个步骤执行
- 同步和执行默认都是自动的,如果都ok的话,就能得到想要的结果
- 如果不ok,设定了报警的邮件话,会收到报警
- 下面是执行成功的样子
- 并且在gitlab中的流水线也能看到同样的结果
集成harbor和rancher
这个就比较简单了。要做两件事。
- 创建密文,用于harbor的登录
- 在部署的时候,选择对应的image即可
实现过程
- 首先进入rancher中我们创建的项目,这里我是test-from-gitlab
- 在资源选项中选择密文
- 在镜像库凭证列表中,选择添加凭证,如下图
- 返回资源页面,选择部署服务
- 在docker镜像选项中,就可以输入已经推送到harbor的镜像了。例如dockhub.mydomain.cn/library/go-server:9, 必须加上tag
- 然后按照需要进行其他的设定后,启动即可。
- 启动完成后,就可以在负载均衡页进行dns的设定,设定完成后就可以访问了。
还没有解决的问题
- 如何自动化发布?
当gitlab和drone生成新的docker镜像后,要让rancher马上进行新的镜像的部署,这个可以在drone.yml中增加新的step来实现,我想要写个web页面来实现,这样减少访问rancher页面的问题,减少时间消耗
初步的想法是读取harbor中的镜像文件信息,如果同一个项目中有新的tag的镜像文件,就进行rancher的部署服务操作,后台创建一个namespace供这个项目使用,随机写入一个新的工作负载名称,镜像选择新的镜像文件,然后启动部署服务。部署服务完成后,添加负载均衡规则,根据Dockerfile文件中的参数,进行expose端口的设定,并创建实际的dns记录。
整套完成后,发送服务部署完成的提醒邮件给我,然后应该就可以访问新的这个环境页面了。