很早就想使用CI(持续集成),CD(持续部署),怎奈水平低于海平面,一直不得其门而入。

最近这颗心又燥动了,又试了几次,竟然成了。特写在此处,帮助有缘人。

我的环境如下:

  • GitLab server,代码仓库服务器,CentOS系统,下文简称gitlab
  • gitlab runner,本机,Windows系统,简称runner
  • server,部署服务器,Ubuntu系统,下文简称server

从网上查到文章都提到,GitLab 8以后集成了CI/CD,所以只要保证使用的版本是符合要求的就可以了。

  1. 安装 GitLab server,请参考官网教程。https://about.gitlab.com/install/

    官方推荐4G+内存,看了下我的 server 服务器,2G内存,打扰了。

    由于公司仓库就是 GitLab 构建的,所以直接使用它了。

    现在官方网站上有针对主流平台的一键脚本安装方法,三大云厂商安装方法,源码,容器等等各种方法,总有一款适合你。

  2. 新建测试仓库,复制 CI/CD配置。

    新建仓库,略。

    进入仓库,选择【设置】–【CI/CD】菜单项,展开 ”Runner” ,记住 “手动设置specificRunner” 卡中的令牌与 URL 地址。后面会用。

    specificRunner

  3. 安装 GitLab runner,请参考官网教程。https://docs.gitlab.com/runner/install/

    根据我们的情况,选择要安装的包,这里我们选择二进制 Windows 版本。

    1. 创建一个目录,准备放置安装文件。例如 E:\gitlab-runner 。
    2. 下载相应版本的安装文件,x86 or amd64 (因为在亚马逊云上,可能需要科学上网,你懂的。)。将下载的二进制运行文件重命名为 gitlab-runner.exe 放到 gitlab-runner 目录中.
    3. 打开管理员命令窗口 (是管理员命令窗口,CMD、PowerShell 都可以。) 。
    4. 注册 runner 。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    # 运行注册命令(需要 cd 到gitlab-runner.exe 所在目录)
    ./gitlab-runner.exe register
    
    # 填写gitlab仓库地址(就是我们第1步中安装的服务器所在机器的id地址,可以从第2步的截图中获取)
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
    步骤2截图中的 URL 地址
    
    # 填写仓库的访问令牌
    Please enter the gitlab-ci token for this runner
     步骤2截图中的令牌(这个令牌相当重要,请不要泄露,我上图因为演示之后会重置,就懒得马赛克了。)
    
    # 填写 runner 描述
    Please enter the gitlab-ci description for this runner
    [hostname] my-runner
    
    # 填写 runner 标签(.gitlab-ci.yml 配置中使用)
    Please enter the gitlab-ci tags for this runner (comma separated):
    my-tag,another-tag
    
    # 选择 runner 执行器,它提供了选择,我们选择即可。为了简单起见,我们选择shell。 
    Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
    shell
    
    1. 注册成 Windows 服务。
    1
    2
    3
    
    cd E:\gitlab-runner
    .\gitlab-runner.exe install
    .\gitlab-runner.exe start
    

    这样就能在 Windows 服务中查看我们注册的服务了。

  4. 配置 .gitlab-ci.yml

    这里的难点与重点是如何远程登录自己的部署服务器。我一开始完全没有思路,后来Google之后发现如此简单。

    远程登录服务器有两种方式:用户名/密码登录、SSH免密登录。 用户名/密码登录有交互,自动部署无法实现;而 SSH 不但免密无交互而且安全。

    SSH 登录和平时我们使用一样,先用命令 ssh-key 生成一对公钥和私钥;然后把公钥添加到服务器;最后执行 SSH 登录。

    这里有两种情况,我简单啰嗦两句。

    1. 使用 shell

    Windows 机器生成一对密钥,然后把公钥配置到 Ubuntu server 服务器,Windows shell 运行 scp 复制生成的代码到 Ubuntu server 服务器。

    因为 shell 是 Windows 机器自带的命令,我们无需其它配置,ssh 登录时默认携带了 Windows 机器的私钥。

    2. 使用 Docker

    Docker 是一种容器技术,在这里类似于生成了一个虚拟机器,与我们的 Windows 宿主机是相互独立的。所以我们 Windows 生成的私钥是无法被它直接使用的。

    我们在 Docker 中复制文件到远程 Ubuntu server 服务器时,Docker 的.ssh目录下是没有私钥的,私钥在 Windows 宿主机的 .ssh 目录里。复制失败。

    解决办法就是配置变量,在 Gitlab 仓库的设置中,添加变量,这些变量可以被 Runner 使用。

    我们只要在 【设置–CI/CD】中配置一个变量 foo,它的值是私钥的内容,然后在 .gitlab-ci.yml 通过使用变量 foo 即可。

    理顺了思路,配置写起来就简单了,具体可以参考网上或者官网。

到此, gitlab 的 CI/CD 就结束了,如果有问题,欢迎沟通交流。