当前位置: 首页 >  技术宝典 >  Gitlab Registries

Gitlab Registries

导读:在项目开发和部署过程中,我们常常需要一套私有仓库,比如 Code Repository、Package Repository,Docker.Registry 等。.Code Repository:在 github 或 gitlab 或 gitee 等平台上创建私有项目;或搭建本地

在项目开发和部署过程中,我们常常需要一套私有仓库,比如 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 步添加的变量。

    image: mcr.microsoft.com/dotnet/sdk:6.0 # 默认每次 runner 执行时都会重新拉取镜像,可在 config.toml 中设置 pull_policy = “if-not-present”,本地没有时再拉取

    stages:

     - deploy
    

    deploy domain: stage: deploy script: - dotnet build -c Release xxx/xxx.csproj # 微软官网说 dotnet pack(不带 –no-build) 会先自动 build,实则不然,所以加了这句 - dotnet pack –no-build -c Release Domain/Domain.csproj - 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 平台暂不支持该场景下的密码加密,所以配置为明文传输 - dotnet nuget push "xxx/bin/Release/*.nupkg" --source gitlab 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. - if: \)CI_COMMIT_BRANCH == “master” changes: - “xxx/*/
    environment: production # 这个配置主要用于归类,关系不大 tags: # job 一定要指定 tags,不是说留空就会执行默认全部 runners。 - demo

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

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

  2. 添加 nuget source

    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 提供相关信息,如下:

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

Docker Registry

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

variables:
 # 定义镜像名称和 tag,这里使用 $CI_REGISTRY_IMAGE 和 $CI_COMMIT_REF_NAME 两个预定义变量表示,形如 registry.gitlab.com/group/project:master
 IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME

# 定义两个 job
stages:
 # 生成镜像然后发布到 Docker Registry
 - build then push docker image
 # 从 Docker Registry 拉取镜像并创建容器
 - pull docker image to deploy

build:
 stage: build then push docker image
 # Docker in Docker。官方建议显式指定相同版本号,以免版本不一致导致的兼容性问题。
 image: docker:20.10.16
 services:
  - docker:20.10.16-dind
 script: 
  # 1. 登录到 Docker Registry。如果项目代码是由 gitlab 托管,那么照搬该句即可,句中的变量会自动赋值,必定登录成功
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  # 2. 生成镜像
  - docker build -f Project/Dockerfile -t $IMAGE_TAG .
  # 3. 推送镜像。自动推送至镜像名中的 Docker Registry 地址。
  - docker push $IMAGE_TAG
 after_script:
  # 4. 删除本地镜像
  - docker rmi $IMAGE_TAG
 tags:
  - demo

deploy:
 stage: pull docker image to deploy
 image: ubuntu:latest
 before_script: # ssh 密钥设置,事先在待部署的服务器上安装公钥,临时容器(这里是 ubuntu)中设置私钥(具体设置脚本此处略过不表)
 script:
  # 登录服务器并执行相关指令,注意先删除旧容器和镜像
  - 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"
 tags:
  - demo

上一篇:4.10 x64dbg 反汇编功

下一篇:CesiumJS Primiti

内容
  • 昇腾实战丨DVPP媒体数据处理图片解码问题案例
    昇腾实战丨DVPP媒体数据处理图
    2023-12-08
    摘要: 本期就分享几个关于DVPP图片解码问题的典型案例,并给出原因分析及解决方法。.本文分享自华为云社区《DVPP媒体
  • 千乎万唤始出来,支持gpt3和gpt4支持画图,的在线gpt应用接入案例开源上线啦
    千乎万唤始出来,支持gpt3和g
    2023-12-04
    了解OPEN AI 平台用户一直在说,这个接口要怎么对接,如何在体验。 由于我一直忙于接口中台开发,所以在线基于OPEN
  • 2023你需要使用的最佳VSCode扩展
    2023你需要使用的最佳VSCo
    2023-12-02
    Visual Studio Code(VSCode)是一款广受欢迎的多功能代码编辑器,在最新的Stack.Overflo
  • 【短道速滑十】非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰度图 28ms/帧的速度)。
    

SSE图像算法优化系列十四:局部均方差及局部平方差算法的优化SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)SSE图像算法优化系列十四:局部均方差及局部平方差算法的优化
    【短道速滑十】非局部均值滤波的指
    2023-12-04
    非局部均值滤波(Non Local.Means)作为三大最常提起来的去燥和滤波算法之一(双边滤波、非局部均值、BM3D)
  • C#结合OpenCVSharp4使用直方图算法比较图片相似度
    C#结合OpenCVSharp4
    2023-12-04
    C#结合OpenCVSharp4使用直方图算法比较图片相似度.直方图有灰度直方图、颜色直方图,如果是灰度图像,那么就用灰
  • 语音平台源码搭建开发之表情功能的实现
    语音平台源码搭建开发之表情功能的
    2023-12-10
    从飞鸽传书到网络聊天时代,人与人之间聊天方式有了极大地改变,也让不管是远在天边,还是近在眼前的朋友或家人,都能实现相当于