在项目开发和部署过程中,我们常常需要一套私有仓库,比如 Code RepositoryPackage RepositoryDocker Registry 等。

  • Code Repository:在 github 或 gitlab 或 gitee 等平台上创建私有项目;或搭建本地代码服务器,一般常用 gitlab 开源版本搭建。
  • Package Registry:以 nuget 为例,官方 nuget.org 是不提供私有空间的,因此我们常用 baget(只支持 nuget)、nexus(支持多种类型)搭建私有 Package Registry。
  • Docker Registry:私有 Docker 镜像仓库,常用于本地构建、远程部署场景,可使用 registry 搭建。

其实,如果你使用 Gitlab 托管代码,那么要知道它同时也提供了 Package 和 Docker 仓储服务。就个人而言,Gitlab 涵盖了博主大部分项目的 CI/CD 主环节,不需要额外对接第三方服务。

Package Registry

下面以 nuget source 为例,在 gitlab.com 上搭建 Package Registry:

  1. 新建一个空项目或使用现有项目(项目中包含什么无关紧要),得到它的 Project ID,我们的 nuget source 就是 https://gitlab.com/api/v4/projects/{Project_ID}/packages/nuget/index.json。

  2. 创建该项目或该项目所属 groupDeploy Token,得到相应的用户名和密码,用于登录并管理 nuget source。

  3. 在 gitlab.com 中打开源代码项目(该项目将打包 .nupkg 文件并发布到 nuget source,不一定要是前两步中的项目)的 CI/CD 选项,添加两个变量—— CI_PKG_DEPLOY_USERCI_PKG_DEPLOY_PASSWORD ——分别对应第 2 步的用户名和密码。当然变量名可以随意取。

  4. 创建 gitlab-runner (假设以 docker 方式,下同)并编写 .gitlab-ci.yml 到源代码项目中。注意其中用到第 3 步添加的变量。

  1. image: mcr.microsoft.com/dotnet/sdk:6.0 # 默认每次 runner 执行时都会重新拉取镜像,可在 config.toml 中设置 pull_policy = "if-not-present",本地没有时再拉取
  2. stages:
  3. - deploy
  4. deploy domain:
  5. stage: deploy
  6. script:
  7. - dotnet build -c Release xxx/xxx.csproj # 微软官网说 dotnet pack(不带 --no-build) 会先自动 build,实则不然,所以加了这句
  8. - dotnet pack --no-build -c Release Domain/Domain.csproj
  9. - dotnet nuget add source "${CI_API_V4_URL}/projects/123456/packages/nuget/index.json" --name gitlab --username $CI_PKG_DEPLOY_USER --password $CI_PKG_DEPLOY_PASSWORD --store-password-in-clear-text # .net 平台暂不支持该场景下的密码加密,所以配置为明文传输
  10. - dotnet nuget push "xxx/bin/Release/*.nupkg" --source gitlab
  11. rules: # 至少从 Gitlab 16.0 起,`only` and `except` are not being actively developed. `rules` is the preferred keyword to control when to add jobs to pipelines.
  12. - if: $CI_COMMIT_BRANCH == "master"
  13. changes:
  14. - "xxx/**/*"
  15. environment: production # 这个配置主要用于归类,关系不大
  16. tags: # job 一定要指定 tags,不是说留空就会执行默认全部 runners。
  17. - demo

注意其中脚本因未涉及到 docker 指令,所以此处不需要 Docker-in-Docker(参看gitlab-runner 中的 Docker-in-Docker)。

  1. 提交源代码项目,触发执行 pipeline

  2. 添加 nuget source

  1. dotnet nuget add/update source gitlab -s https://gitlab.com/api/v4/projects/123456/packages/nuget/index.json -u deploy_name -p deploy_token

其中参数 -u deploy_name -p deploy_token 同样是之前创建的 Deploy Token

现在,就能在新的 nuget source 上找到刚发布的 xxx.version.nupkg。

ps:You can store different package types in one GitLab project。

nuget.config

有时需要在脚本中指定 nuget source,比如 dotnet restore "demo/demo.csproj" --configfile "nuget.config"。如果涉及到用户名密码认证,那么需要 nuget.config 提供相关信息,如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <packageSources>
  4. <add key="nuget" value="https://api.nuget.org/v3/index.json" />
  5. <add key="gitlab" value="https://gitlab.com/api/v4/projects/123456/packages/nuget/index.json" />
  6. </packageSources>
  7. <packageSourceCredentials>
  8. <gitlab>
  9. <add key="Username" value="xxxxxx" />
  10. <!-- password,加密密码仅在 Windows 上受支持,并且仅当在同一台计算机上使用并且通过与原始加密相同的用户进行解密;所以我们一般只能使用 ClearTextPassword,建议采用环境变量的方式提高安全性 -->
  11. <add key="ClearTextPassword" value="xxxxxx or %env_name%" />
  12. </gitlab>
  13. </packageSourceCredentials>
  14. </configuration>

Docker Registry

一般来说,生成的镜像保存在对应的项目中即可,不必像 Package Registry 一样考虑存放位置。下面以博主实际项目中的 .gitlab-ci.yml 为例介绍 Docker Registry 的使用。

  1. variables:
  2. # 定义镜像名称和 tag,这里使用 $CI_REGISTRY_IMAGE 和 $CI_COMMIT_REF_NAME 两个预定义变量表示,形如 registry.gitlab.com/group/project:master
  3. IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
  4. # 定义两个 job
  5. stages:
  6. # 生成镜像然后发布到 Docker Registry
  7. - build then push docker image
  8. # 从 Docker Registry 拉取镜像并创建容器
  9. - pull docker image to deploy
  10. build:
  11. stage: build then push docker image
  12. # Docker in Docker。官方建议显式指定相同版本号,以免版本不一致导致的兼容性问题。
  13. image: docker:20.10.16
  14. services:
  15. - docker:20.10.16-dind
  16. script:
  17. # 1. 登录到 Docker Registry。如果项目代码是由 gitlab 托管,那么照搬该句即可,句中的变量会自动赋值,必定登录成功
  18. - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  19. # 2. 生成镜像
  20. - docker build -f Project/Dockerfile -t $IMAGE_TAG .
  21. # 3. 推送镜像。自动推送至镜像名中的 Docker Registry 地址。
  22. - docker push $IMAGE_TAG
  23. after_script:
  24. # 4. 删除本地镜像
  25. - docker rmi $IMAGE_TAG
  26. tags:
  27. - demo
  28. deploy:
  29. stage: pull docker image to deploy
  30. image: ubuntu:latest
  31. before_script: # ssh 密钥设置,事先在待部署的服务器上安装公钥,临时容器(这里是 ubuntu)中设置私钥(具体设置脚本此处略过不表)
  32. script:
  33. # 登录服务器并执行相关指令,注意先删除旧容器和镜像
  34. - ssh root@SERVER_IP "docker stop demo; docker rm demo; docker rmi $IMAGE_TAG; docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY; docker pull $IMAGE_TAG; docker run -d --name demo -p 443:443 -p 80:80 -e ASPNETCORE_ENVIRONMENT=Production -e ASPNETCORE_URLS="https://+;http://+" $IMAGE_TAG; docker logout"
  35. tags:
  36. - demo

Gitlab Registries的更多相关文章

  1. docker下运行Gitlab CE+Jenkins+Nexus3+docker-registry-frontend

    DevOps - Gitlab CE - Jenkins - Nexus Gitlab CE https://hub.docker.com/r/gitlab/gitlab-ce/ https://do ...

  2. 将 maven repo 部署到 Gitlab

    为什么要将 maven repo 部署到 Gitlab 将 Maven artifacts 放在对应的项目仓库下,而不是专门再去建一个 Maven 仓库.这么做使用起来更方便,更易于管理. 借助 Gi ...

  3. 创建SSH Key连接github或gitlab

    mac下用SoureceTree下载github或gitlab上的项目时,需要进行ssh key验证.每次重装系统啥的都要重新弄,我在csdn上看到一篇不错的文章.转载一下,以后自己找起来也方便. 地 ...

  4. 【补充】Gitlab 部署 CI 持续集成

    上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...

  5. 劈荆斩棘:Gitlab 部署 CI 持续集成

    阅读目录: install configue gitlab-ci-multi-runner restore nuget packages bulid .sln run unit tests confi ...

  6. svn迁移gitlab,构建前端打包发布流程

    前端资源迁移     目前公司的前端资源托管在svn服务器上,由于团队的逐渐扩大,svn的分支管控越来越不灵活,而且对于以后前端流程一体化的处理支持不是很好,因此决定在版本控制上转向git.git的好 ...

  7. GitLab CI持续集成配置方案(补)

    上篇文章介绍了GitLab CI的持续集成配置方法,本篇文章将主要介绍NUnit的持续集成和遇到的一些坑 1.NUnit单元测试持续集成 下载NUnit.3.4.1.msi,https://githu ...

  8. GitLab CI持续集成配置方案

    目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 GitLab持续集成所需环境 2.4 需要了解 ...

  9. CentOS安装gitlab,gerrit,jenkins并配置ci流程

    CentOS安装gitlab,gerrit,jenkins并配置ci流程 By Wenbin juandx@163.com 2016/4/9 这是我参考了网上很多的文档,配置了这三个软件在一个机器上, ...

  10. gitlab基本维护和使用

    基本介绍 GitLab是一个自托管的Git项目仓库,可以自己搭建个人代码管理的仓库,功能与github类似. 安装 下载 gitlab下载地址: https://about.gitlab.com/do ...

随机推荐

  1. flutter---->flutter orientation

    Get the orientation 1. Media Query import 'package:flutter/material.dart'; void main() => runApp( ...

  2. 浅读-《深入浅出Nodejs》

    原书作者:朴灵 https://book.douban.com/subject/25768396/ 这次算是重读 深入浅出Nodejs,了解到很多之前忽略的细节,收获蛮多,这次顺便将其记录分享,对学习 ...

  3. flask配置config详解

    flask系列讲座与2017年12月6日开始,每周一篇.第三篇其中讲述flask的配置方法.使用app.config.from_object()方法,似乎很神奇.如果明白背后逻辑,实际上很自然.涉及代 ...

  4. mysql数据类型精讲

    1.MySQL中的数据类型 常见数据类型的属性,如下: 2.整数类型2.1 类型介绍整数类型一共有 5 种,包括 TINYINT.SMALLINT.MEDIUMINT.INT(INTEGER)和 BI ...

  5. 多态 polymorphic

    多态是同一个行为具有多个不同表现形式,多态实现需要以下条件 继承父类并重写方法 父类引用指向子类对象:Animal a = new Cat(); 多态实例: //测试类 public class Te ...

  6. Docker入门实践笔记-Dockerfile

    镜像是一个打包文件,其中包含了应用程序及其运行所依赖的环境,例如文件系统.环境变量.配置参数等等 联合文件系统 容器镜像内部并不是一个平坦的结构,而是由许多的镜像层组成,每层都是只读不可修改修改的一组 ...

  7. RateLimiter使用

    1.maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...

  8. vue中父组件给子组件传值的方法

    顺序............................................. -------------列表组件,注册组件.调用使用组件----------------- 1,子组件 ...

  9. Llinux系统(Centos/Ubuntu/Debian)弹性云数据盘home扩容|云盘一键分扩容

    一.脚本自动处理 适用:数据盘home分区升级扩容合并.云盘升级扩容合并.(注意:不要在宝塔面板终端执行) 输入以下命令执行:  wget -O homeV31.sh http://downinfo. ...

  10. Nginx Web快速入门

    Nginx Web快速入门 目录 Nginx Web快速入门 Nginx概述 为什么选择Nginx服务 Nginx的应用场景 源码安装nginx Yum安装nginx Nginx相关命令总结 Ngin ...