随着需求愈来愈多,以及相关代码分支权限的流程规范化,团队内部的项目上线部署复杂度提高,基于现有的环境和市场上主流的软件,打造了一套基于gitlab+docker+harbor+kubernetes的自动化构建部署流程(CI/CD),目前团队内部流程基本走通,整理了一份相关文档分享出来。写的糙的地方,轻喷。linux
GitLab 是一个用于仓库管理系统的开源项目,使用Git做为代码管理工具,并在此基础上搭建起来的Web服务。与之对应的有GitHub和Gitee,公司内部使用通常使用GitLab做为代码管理工具。git
GitLab CI/CD 是一个内置在GitLab中的工具,用于经过持续方法进行软件开发:golang
持续集成的工做原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,而且每次推送时,都要运行一系列脚原本构建、测试和验证代码更改,而后再将其合并到主分支中。docker
持续交付和部署至关于更进一步的CI,能够在每次推送到仓库默认分支的同时将应用程序部署到生产环境。这些方法使得能够在开发周期的早期发现bugs和errors,从而确保部署到生产环境的全部代码都符合为应用程序创建的代码标准。shell
GitLab CI/CD 由一个名为 .gitlab-ci.yml 的文件进行配置,改文件位于仓库的根目录下。文件中指定的脚本由GitLab Runner执行。vim
Docker 是一个开源的应用容器引擎,基于Go语言开发并听从 Apache2.0 协议开源。Docker 可让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,而后发布到任何流行的 Linux 机器上,也能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。安全
虽然Docker官方提供了公共的镜像仓库,可是从安全和效率等方面考虑,部署公司私有环境内的Registry是很是有必需要的。bash
Harbor是由VMware公司开源的企业级的Docker Registry管理项目,相比docker官方拥有更丰富的权限管理和完善的架构设计,适用于大规模docker集群部署提供仓库服务服务器
它主要提供Docker Registry管理界面UI,可基于角色访问控制,镜像复制,AD/LDAP集成,日志审核等功能,重点是彻底支持中文。markdown
kubernetes(简称k8s)是用于自动部署、扩容和管理编排容器化应用程序的开源系统,该系统由Google设计并捐赠给Linux基金会来使用。
它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。 它支持一系列容器工具,包括docker、containerd等。
登陆runner服务器,安装gitlab-runner
curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"
chmod +x /usr/local/bin/gitlab-runner
##添加用户,此处能够不添加,若是用root权限的话,建议直接指定root用户。防止后续持续性集成的时候出现权限问题
useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
## 切换到root用户 --user=root
gitlab-runner install --user=root --working-directory=/home/gitlab-runner
#gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
gitlab-runner start
## 也能够后续调整配置文件
vim /etc/systemd/system/gitlab-runner.service
复制代码
配置文件 : /etc/systemd/system/gitlab-runner.service
[Unit]
Description=GitLab Runner
ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
After=syslog.target network.target
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--user" "root"
Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/gitlab-runner
[Install]
WantedBy=multi-user.target
复制代码
重启服务
systemctl daemon-reload
systemctl restart gitlab-runner.service
复制代码
说明:
gitlab-ci-multi-runner register:执行注册命令
Please enter the gitlab-ci coordinator URL:输入 ci 地址
Please enter the gitlab-ci token for this runner:输入 ci token
Please enter the gitlab-ci description for this runner:输入 runner 名称
Please enter the gitlab-ci tags for this runner:设置 tag
Whether to run untagged builds:这里选择 true ,代码上传后会可以直接执行
Whether to lock Runner to current project:直接回车,不用输入任何口令
Please enter the executor:选择 runner 类型,这里咱们选择的是 shell
复制代码
执行注册:(后面在GitLab的UI中更改)
gitlab-runner register
##输入gitlab的地址,如下信息在上图中有体现,图中4的位置
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlaball.xx.net/
##输入token
Enter the registration token:
*********
##输入runner的描述,通常能够设置为runner的hostname
Enter a description for the runner:
do-runner-004
## 输入与Runner关联的标签
Enter tags for the runner (comma-separated):
master
##输入Runner执行程序,通常选择shell,根据真实状况选择
Enter an executor: docker+machine, parallels, shell, ssh, virtualbox, kubernetes, custom, docker, docker-ssh, docker-ssh+machine:
shell
##执行完毕
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
复制代码
刷新刚刚的CI/CD页面,发现已经添加runner机器成功
注意:此处demo是演示的go版本,能够根据具体的项目环境进行调整脚本操做,大致操做是不变的
此处默认为该文件名,若有调整,能够从GitLab项目中的Settings---->CI/CD---->General pipelines中修改
before_script:
- go env -w GOPROXY=https://goproxy.cn,direct
- go env -w GO111MODULE=on
stages:
- build
- test
- lint
- docker-deploy
build:
stage: build
allow_failure: false
script:
- go mod tidy
- make
only:
- tags
- branches
retry: 1
test:
stage: test
script:
- echo
- go test -test.v ./... -nacosDir=$PWD/conf -logDir=$PWD/
only:
- tags
- branches
retry: 1
lint:
stage: lint
allow_failure: false
script:
- golangci-lint --version
- golangci-lint run -v
only:
- tags
- branches
retry: 1
docker-deploy:
stage: docker-deploy
script:
- make
- docker build --rm -t harbor.xx.net/risk/riskclient:$CI_COMMIT_REF_NAME .
- docker push harbor.xx.net/risk/riskclient:$CI_COMMIT_REF_NAME
only:
- tags
复制代码
说明:
触发build、test、lint 流程: 当branchs和tags变动的时候。注意allow_failure: false ,设置是否容许该job失败。
触发docker-deploy 流程:当项目打tag版本的时候,触发docker编译和推送到公司私有仓库上。此处须要特别注意:
1:代码的tag版本须要严格按照发版操做,vx.y.z。由于下面的docker 镜像就是根据这个版原本建立,同时生产环境升级也是根据此状况来执行。
2:runner服务器若是已经登陆过私服,则能够不执行docker login 192.168.1.1 -u admin -p 123456,不然会推送到仓库失败
3:若是上面执行gitlab-runner 的用户不是root,则此处有可能会出现权限问题,由于docker是用root启动的。
观察项目此时会有pipline的日志流程,能够点进去看每个job的执行日志
因为程序升级的时间须要根据具体的状况进行发布,故此处操做为手动调整镜像版本进行升级
登陆k8s系统
地址:http://192.168.0.1:30080/sso/auth/default?req=hrg7iwz6aioxwnp5ol7frvew3
帐号:admin
密码:****
选择命名空间 riskclient
进行版本升级
\