.NetCore 配合 Gitlab CI&CD 实践 – 开篇

引言

这是一个系列的文章,讲述的是一个中小型开发团队如何从零开始使用搭建基建 GitLab 代码托管平台,以及使用 GitLab Runner 实现 CI/CD 的故事。本系列通过部署一个完整的 .net core 项目来做配合实战,可能这个案例并不能适合每个人,但希望可以给刚接触 GitLab 以及 CI/CD 的小伙伴带来一些启发。对 GitLab 以及 CI/CD 有一定了解的,可以略过本文,直接开启下一章。

Gitlab CI&CD 是什么?

如上官方图示,可以理解为 Gitlab 给开发者提供了一项功能,在代码提交后自动触发一段开发者自定义的脚本,以此来完成诸如但不限于构建部署的工作。完成一次项目发布我们通常需要以下 4 个步骤:

  • 编译
  • 测试
  • 构建
  • 部署

编译

在编译阶段我们是运行 dotnet build 进行包还原以及项目编译,这里还可以包含团队的代码风格检查

测试

测试阶段主要跑我们自己写的单元测试,题外话:测试也挺难写的

构建

将我们测试通过的项目打包成 docker 镜像,上传到镜像仓库

部署

从镜像仓库上拉取我们镜像,部署到集群上,这里后面我们使用 docker-compose 部署

准备工作

我们这里需要做的事情串起来就是,代码提交到 gitlab,触发平台的 CI/CD 任务,开始编译代码,运行测试,打包镜像并上传镜像,最后部署应用。

安装 GitLab

version: "3"
services:
  gitlab:
    image: gitlab/gitlab-ce:13.1.2-ce.0
    container_name: 'devops-gitlab'
    restart: always
    hostname: '<your hostname>'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url "<your gitlab url>"
        gitlab_rails['gitlab_shell_ssh_port'] = 23
        gitlab_rails['time_zone'] = 'Asia/Shanghai'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
        gitlab_rails['smtp_port'] = 465
        gitlab_rails['smtp_user_name'] = "<your qq email>"
        gitlab_rails['smtp_password'] = "xCcqh*L4jkqFCS"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_tls'] = true
        gitlab_rails['gitlab_email_from'] = '<your qq email>'
        gitlab_rails['smtp_domain'] = "exmail.qq.com"
    ports:
      - '81:80'
      - '443:443'
      - '23:22'
    volumes:
      - '/gitlab/config:/etc/gitlab'
      - '/gitlab/logs:/var/log/gitlab'
      - '/gitlab/data:/var/opt/gitlab'
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "10"

我这边使用 docker-compose 来安装的,替换掉上面的对应的 域名地址 以及 邮箱即可使用。我这里用的是 QQ 企业邮箱你也可以换成其他的。随后在配置一下 nginx, 可以通过 80 端口访问 gitlab。

upstream  gitlab{
    # 域名对应 gitlab配置中的 external_url
    # 端口对应 gitlab 配置中的 nginx['listen_port'],通过环境变量可设置
    server 192.168.1.42:81;
}


server{
    listen 80;
    
    # 此域名是提供给最终用户的访问地址
    server_name <your gitlab host name>;

    location / {
        # 这个大小的设置非常重要,如果 git 版本库里面有大文件,设置的太小,文件push 会失败,根据情况调整
        client_max_body_size 50m;

        proxy_redirect off;
        #以下确保 gitlab中项目的 url 是域名而不是 //git,不可缺少
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 反向代理到 gitlab 内置的 nginx
        proxy_pass //gitlab;
        index index.html index.htm;
    }
}

安装 GitLab Runner

 # For Debian/Ubuntu/Mint
 curl -L //packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

 # For RHEL/CentOS/Fedora
 curl -L //packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
  • 注册 runner

首先要先获取gitlab-ci的Token:

项目主页 -> Sttings -> CI/CD -> Runners Expand

使用命令注册 gitlab-runner:

gitlab-runner register

需要按照步骤输入:

  • 输入 gitlab 的服务URL,就是你 gitlab 的访问地址
  • 输入 gitlab-ci 的Toekn,获取方式参考上图
  • 关于集成服务中对于这个 runner 的描述
  • 给这个 gitlab-runner 输入一个标记,这个 tag 非常重要,在后续的使用过程中需要使用这个 tag 来指定 gitlab-runner
  • 是否运行在没有 tag 的 build 上面。在配置 gitlab-ci 的时候,会有很多 job,每个job可以通过tags属性来选择runner。这里为true表示如果job没有配置tags,也执行
  • 是否锁定 runner 到当前项目
  • 选择执行器,gitlab-runner 实现了很多执行器,可用在不同场景中运行构建,详情可见 GitLab Runner Executors,这里选用 Shell 模式

重复执行两次,分别选择 shell 模式以及 docker 模式

刷新页面就可以看到新增的一个Runner:

  • 开通阿里云 docker 镜像仓库

这个上阿里云开通一下还是简单的,就不细讲了

结束

好了,到这里准备工作差不多了,下一篇开始实战。