引言

需求的现状

现在讨论很多的一个词是CI/CD: CI是持续集成,通过持续集成,开发人员能够频繁地将其代码集成到公共代码仓库的主分支中,开发人员能够在任何时候多次向仓库提交作品,而不是独立地开发每个功能模块并在开发周期结束时一一提交;CD是持续部署,持续部署扩展了持续交付.

开发的现状

目前越来越多的服务器部署都是用docker镜像去部署,无论是用docker-compose去部署还是用kubernetes部署,都给我们开发者带来了极大的便利,喜忧参半也带来了一些不便,在我自己开发和部署的日常开发中(很多公司的开发和运维都是一个人),发现了一些需要解决的问题.
之前github就退出了github action的方式 支持用户自定义ci文件,但是去调查了一下github的私有化部署,遇到了一些问题.
所以就去调查和实践了gitlab + gitlab-runner 的私有化部署方案.

问题

基于CI/CD的现状,开发者在提交代码后还需要去构建镜像,上传镜像到镜像仓库,频繁的修改就需要频繁的构建,两个尖锐的小问题

  • 用户每次写完代码要本地构建,需要本地有docker运行的环境,docker本身是不支持windos的(非专业版本,专业版本有专门的安装包),环境问题在日常开发中经常出现.
  • 本地构建、推送到仓库后本地就残留了镜像文件,因为仓库会保存镜像,本地镜像就会浪费本地的存储空间.
  • 代码需要通过代码检测平台的检测,比如社区的一些优秀解决方案 : SonarQube等
  • push完代码后(或者push之前)代码需要有一些自动化测试

安装

安装需求

1.需要一台linux服务器,本文是一台debian9.6的服务器
2.需要安装docker和docker-compose(docker安装和docker-compose社区有大量的文章,本文不做说明)

开始安装

环境确认

  • 确认本地已经安装好docker和docker-compose,登陆到服务器后输入以下命令确认环境
  1. docker -v

image.png

下载镜像

  • 搜索并下载gitlab gitlab-runner的镜像

通过下面的命令搜索镜像

  1. docker search gitlab
  2. docker search gitlab-runner

image.png
image.png

通过下面的命令将镜像pull到本地

  1. docker pull gitlab/gitlab-ce
  2. docker pull gitlab/gitlab-runner

确认本地拉取镜像成功

  1. docker images

列表中出现对应的镜像说明拉取镜像成功

用docker-compose启动

使用docker-compose启动gitlab 以及 gitlab-runner 其中涉及到文件的映射

  1. gitlab:
  2. image: 'gitlab/gitlab-ce:latest'
  3. restart: always
  4. hostname: '172.17.16.205' //改成你部署的服务器(宿主机)的固定ip地址
  5. environment:
  6. GITLAB_OMNIBUS_CONFIG: |
  7. external_url 'http://172.17.16.205'
  8. # Add any other gitlab.rb configuration here, each on its own line
  9. ports:
  10. - '80:80' //映射到本机的80端口 访问地址就是http://172.17.16.205
  11. - '7443:443'
  12. volumes: //映射宿主机的文件目录到运行的镜像里面 保证镜像的重启等不会造成数据的丢失
  13. - '/data/gitlab/config:/etc/gitlab'
  14. - '/data/gitlab/logs:/var/log/gitlab'
  15. - '/data/gitlab/data:/var/opt/gitlab'
  16. gitlab-runner:
  17. image: gitlab/gitlab-runner
  18. restart: unless-stopped
  19. privileged: true
  20. volumes:
  21. - /data/runner/gitlab-runner:/etc/gitlab-runner
  22. - /var/run/docker.sock:/var/run/docker.sock //宿主机机的docker.sock映射到镜像里面
  23. - /usr/bin/docker:/bin/docker //宿主机的docker可执行映射到镜像里面 后面build的时候会用到

新建并保存好docker-compose.yml文件后 在当前目录运行命令

  1. docker-compose up -d

gitlab 初始化运行的时候需要一定的时间,需要耐心等待,用下面的命令查看正在运行的镜像

  1. docker ps

image.png
可以看到 当gitlab的status 变成 healthy的时候说明 gitlab启动完成

开始你的第一个runner

打开你的gitlab服务器地址—>注册账号—>创建仓库 这一系列的步骤就不一一赘述了

注册runner

确定仓库的配置

进入仓库的用户设置—>CI/CD
image.png
image.png
展开Runner后拉到最下面就能看到你当前仓库是否拥有Runner,如果没有的话我们来进行注册

image.png
我们能看到红色部分包括两个配置 一个是服务器地址 一个是本仓库的token,在后面注册的时候会用到

注册

进入到正在运行的gitlab-runner容器,方法如下

  1. docker ps #查看正在运行的gitlab-runner 复制对应的containerId 比如: 04a990db62d1
  2. docker exec -it 04a990db62d1 sh #进入正在运行的gitlab-runner的命令行
  3. gitlab-runner register #开始注册仓库的runner

image.png
依次输入服务器地址、token(在前面的图片中能找到) description(描述)可以随意些 tags后面会配合到.gitlab-ci.yml文件
Please enter the executor: docker+machine, kubernetes, docker, shell, ssh, virtualbox, docker-ssh+machine, custom, docker-ssh, parallel
这一步我摸索了很久,其实就是问docker运行的时候用什么docker源,因为我的宿主机已经安装了docker(并且在docker-compose文件中我映射的bin文件) 所以输入shell
image.png
然后我们就注册成功了!

检测

这个时候我们再回到gitlab页面上,就能看到刚才我们最新注册的runner(我之前注册过所以这边显示两个)
image.png

至此我们的注册步骤已经结束了 当我们再向仓库push代码的时候 就会根据我们的仓库根目录的gitlba-ci.yml文件运行我们的CI,下面我将贴一下一个最简单的gitlba-ci.yml文件

简单的.gitlab-ci.yml

services:

  • docker:dind
    before_script:
  • docker info

build_docker_image_and_push_to_harbor:
stage: build
image: docker:stable
script:
- docker build -t gitlabci:0.0.1 .
- docker login —username=xxxx registry.xxxx.com —password $DOCKER_PRIVATE_KEY
- docker push registry.xxxxx.com/czrd/gitlabci:0.0.1

  1. <a name="DQU64"></a>
  2. ### 一些坑和一些总结的小问题
  3. 本文不赘述.gitlab-ci.yml文件,不是本文的主要说明内容,社区有大量的优秀文档大家可以查阅,但是有一些坑我会在下面列出来
  4. - .gitlab-ci.yml文件必须在仓库文件的根目录
  5. - .gitlab-ci.yml文件前面有一个点
  6. - 关于tags runner默认是必须要用才能运行runner的 请点击
  7. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/410294/1591757884909-783e1d12-f4c5-4518-90d9-585afda1f407.png#align=left&display=inline&height=179&margin=%5Bobject%20Object%5D&name=image.png&originHeight=358&originWidth=1350&size=29822&status=done&style=none&width=675)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/410294/1591757912669-95a72971-2eb9-426e-ae18-98c64d31f6b5.png#align=left&display=inline&height=545&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1090&originWidth=1992&size=152216&status=done&style=none&width=996)<br />勾线第三个设置<br />
  8. <br />都配置ok后就可以看到自己项目的CI,持续集成之日可待
  9. <a name="8dmsW"></a>
  10. ### ![image.png](https://cdn.nlark.com/yuque/0/2020/png/410294/1591758038244-8a5cbb45-936c-4cbc-962b-e63790d9747f.png#align=left&display=inline&height=632&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1264&originWidth=2558&size=311017&status=done&style=none&width=1279)
  11. <a name="Cw8e1"></a>
  12. ### 写在最后
  13. 本文主要讲了如何私有化部署以及一些简单的注册、配置, 如果文档有问题,请及时指正,如果还有问题的话可以去社区寻找其他方案,或者📧huang93223@126.com<br />
  14. <br />然后等你push完代码后 可以来杯 ☕️ 等待自动化任务的完成,enjoy!!!<br />
  15. <br />