利用rancher,gitlab,drone,harbor进行集成发布

起因

主要是为了将零散的repo集中起来。还有就是可以好好的用下rancher。虽然rancher比起国内的kubesphere显得有点不那么的易用,但是对于基本上对于基础架构一点不懂的team来说部署和操控都是很方便。

实现过程

gitlab

gitlab是开发人员的唯一接口,开发者将代码推送给gitlab中对应的库就好了。其余的事情由后台的运维人员进行。当然如果开发人员自己写部署的pipeline也是可以的。只是大部分的开发人员不太懂这些,也可能是比较懒。

安装gitlab的过程按照gitlab的官网文档即可,唯一要注意的是,要开启本地网络的允许hook的请求,否则后面的要进行hook的动作会报错。

开启的地方是:

gitlab->管理中心->设置->网络->外发请求

waifaqingqiu

安装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

根据官方文档安装即可: 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

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

访问http://drone.mydomain.cn 页面会跳转到gitlab.mydomain.cn进行验证。验证通过后,会返回drone的页面。如果身份下面有对应的repo存在,则drone中会显示对应的项目。

为了实现集成,要做的就是在drone中激活对应的项目即可。

drone sync

这里要说明的是,激活后,需要在项目的repo中创建.drone.yml文件,这个文件是告诉drone当repo被commit后要做什么事情的。这个文件如果没有写好,会导致集成的失败或者不连续。

看看.drone.yml的写法

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"]

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

success

gitlabpipeline

集成harbor和rancher

这个就比较简单了。要做两件事。

实现过程

添加镜像库凭证

rahcer-lb

verify

还没有解决的问题

当gitlab和drone生成新的docker镜像后,要让rancher马上进行新的镜像的部署,这个可以在drone.yml中增加新的step来实现,我想要写个web页面来实现,这样减少访问rancher页面的问题,减少时间消耗

初步的想法是读取harbor中的镜像文件信息,如果同一个项目中有新的tag的镜像文件,就进行rancher的部署服务操作,后台创建一个namespace供这个项目使用,随机写入一个新的工作负载名称,镜像选择新的镜像文件,然后启动部署服务。部署服务完成后,添加负载均衡规则,根据Dockerfile文件中的参数,进行expose端口的设定,并创建实际的dns记录。

整套完成后,发送服务部署完成的提醒邮件给我,然后应该就可以访问新的这个环境页面了。

| 访问量:
Table of Contents