承广大开发者的无私,目前开源免费的 git 仓库管理项目已经越来越多,也越来越好,例如giteagogs以及gitlab。这篇文章主要是简单介绍一下通过 docker 搭建gitlab以及gitlab runner 自动CI工具。

在启用 CI/CD 之前,我一直在使用 gitea ,对性能友好,界面也比较简洁,但功能也相当完善,但是由于一些原因,CI/CD 未搭建起来,遂改用 gitlab,之后再研究一下giteaCI/CD搭建吧。

搭建 gitlab 的第一件事情,当然就是:打开搜索引擎,搜索docker gitlab( (* ̄︶ ̄) )。

参考了一部分站点内容后,做了一下整合。

  1. 下来gitlab镜像:gitlab/gitlab-ce

     # gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本
     docker pull gitlab/gitlab-ce
    
  2. 运行gitlab镜像:
     docker run -d  -p 443:443 -p 80:80 -p 222:22 --name gitlab --hostname=git.kekxv.com --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
     # -d:后台运行
     # -p:将容器内部端口向外映射
     # --hostname:设置容器的 hostname
     # --name:命名容器名称
     # -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录
    

    根据自己的需要,将对应端口映射出来,因为我主机上已经搭配好了nginx,并且不需要 ssh进行操作,所以我这边仅仅将80端口进行映射。各位可以根据需要,自行修改。

  3. 配置

    在这个时候,已经搭建完成,可以直接打开浏览器,输入对应地址进行查看。

    如果发现某些地址不对,url路径有点问题,则有可能是配置的问题,可以先将/home/gitlab/config/gitlab.rb(如果修改过映射路径,请自行更改,下同)。

    打开配置文件,然后加入 external_url 'http://192.168.1.2'(加入你的地址是192.168.1.2,如果不是,请自行修改)。

    然后重启容器,再次进入即正常。

    (如果还是出现不正常的情况,则检查 --hostname 参数是否指定为192.168.1.2,如果不是,删掉gitlab镜像(docker stop gitlab && docker rm gitlab),重新run运行gitlab镜像)。

  4. 外部 NGINX https

    如果是通过nginx反向代理,并且使用了 https 功能,则可能会发现,某些功能不正常了,例如项目主页的README.md没有自动加载。

    这时候需要给配置文件在增加一点配置:

      nginx['listen_port'] = 80
      nginx['listen_https'] = false
      nginx['proxy_set_headers'] = {
        "X-Forwarded-Proto" => "https",
        "X-Forwarded-Ssl" => "on"
      }
    

    max_body_size配置(根据自己需要):

      nginx['client_max_body_size'] = '20m'
    
  5. 邮件通知

    gitlab 支持邮件通知,这里使用 smtp 协议进行配置。

    在配置文件里面,新增配置:

     gitlab_rails['gitlab_email_enabled'] = true
     gitlab_rails['gitlab_email_from'] = '邮件地址'
     gitlab_rails['gitlab_email_display_name'] = '发送昵称'
     gitlab_rails['smtp_enable'] = true
     gitlab_rails['smtp_address'] = "smtp.exmail.qq.com,这里用的是腾讯企业邮"
     gitlab_rails['smtp_port'] = 465
     gitlab_rails['smtp_user_name'] = "账号"
     gitlab_rails['smtp_password'] = "密码"
     gitlab_rails['smtp_domain'] = "smtp_domain"
     gitlab_rails['smtp_authentication'] = "login"
     gitlab_rails['smtp_enable_starttls_auto'] = true
      # 使用 tls 加密
     gitlab_rails['smtp_tls'] = true
    

    配置没有问题之后,重启gitlab,执行 docker exec -it gitlab gitlab-rake gitlab:incoming_email:check,应该可以得到 finish

    如果失败了,则检查一下账户密码。

  6. Gitlab CI介绍

    CI:持续集成,我们通常使用CI来做一些自动化工作, 比如程序的打包,单元测试,部署等, 这种构建方式避免了打包环境差异引起的错误, 提高了工作效率。Gitlab-CIGitlab官方提供的持续集成服务, 我们可以在仓库的根目录下新建.gitlab-ci.yml文件, 自己定义持续集成流程模板,并且在Gitlab中配置runner, 在之后的每次提交合并中将会触发构建,并且可以通过Gitlabhook, 在代码提交的各个环节自动地完成一系列的构建工作, 总之对于一些非复杂性的集成需求,都是可以满足的。

  7. Gitlab CI (gitlab-runner) 部署

    使用 docker 进行部署,相对简单很多:

      # 拉取镜像
      sudo docker pull gitlab/gitlab-runner:latest
      # 添加 gitlab-runner container
      sudo docker run -d --name gitlab-runner --restart always \
        -v /srv/gitlab-runner/config:/etc/gitlab-runner \
        -v /var/run/docker.sock:/var/run/docker.sock \
        gitlab/gitlab-runner:latest
      # 注册runner
      sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
      # gitlab-runner register
        
      Please enter the gitlab-ci coordinator URL:
      # 示例:https://git.kekxv.com/
      Please enter the gitlab-ci token for this runner:
      # xxxxxx
      Please enter the gitlab-ci description for this runner:
      # 示例:ubuntu
      Please enter the gitlab-ci tags for this runner (comma separated):
      # 示例:*,ubuntu
      Whether to run untagged builds [true/false]:
      # true
      Please enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:
      # docker
      Please enter the default Docker image (e.g. ruby:2.1):
      # ubuntu
    

    若是runner注册成功, 此时到我们项目首页右侧 设置 —》CI/CD Pipelines —》Runners activated for this project 就可以看到我们刚注册的qd_api_runner了。

    测试

    我们新建一个 vue 项目,可以直接 vue create test_ci , 然后进入目录,新增文件.gitlab-ci.yml(注意 “.” 不要漏了.), 添加以下内容:

    image: node:alpine
       
    stages:
      - build
       
    cache:
      key: ${CI_COMMIT_REF_NAME}
      paths:
        - node_modules/
       
    job-build:
      stage: build
      only:
        - master
      tags:
        - shell
      script:
        - npm set registry https://registry.npm.taobao.org
        - npm install --progress=false
        - npm run build
      artifacts:
        expire_in: 1 week
        paths:
          - dist
    

    使用 node:alpine 镜像自动部署。并且可以将 dist 打包下载。

  8. 结束

    结束。

参考资料

docker下gitlab安装配置使用(完整版)

使用Nginx搭建并代理GitLab服务器

Gitlab配置邮件通知

Docker搭建自己的Gitlab CI Runner