背景

在.gitlab-ci.yml里面,我们有4个场景

  • dotnet build、dotnet pack和dotnet push
  • 单元测试
  • SSH到http服务器,更新对应的版本号文件里面的版本数字
  • 触发下游

Gitlab里面的“变量”

这个“变量”,最好是放在Group里

.gitlab-ci.yml

内容如下

# This file is a template, and might need editing before it works on your project.
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml # This is a sample GitLab CI/CD configuration file that should run without any modifications.
# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts,
# it uses echo commands to simulate the pipeline execution.
#
# A pipeline is composed of independent jobs that run scripts, grouped into stages.
# Stages run in sequential order, but jobs within stages run in parallel.
#
# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages stages:          # List of stages for jobs, and their order of execution
  - build
  - test
  - update-version
  - trigger-other-project variables:
    EVENT_RECORDER_VERSION_ID : 2022.51.$CI_PIPELINE_IID
    EVENT_RECORDER_NUPKG_OUTPUT_DIR : $CI_PROJECT_DIR/nupkg
    # Use no compression for caches
    CACHE_COMPRESSION_LEVEL: "fastest" build-job:       # This job runs in the build stage, which runs first.
  stage: build
  before_script:
    - bash $DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME
  script:
    - echo "Compiling the code..."
    - cd .
    - dotnet build "src/Yee.Change.EventRecorder.Application/Yee.Change.EventRecorder.Application.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.Application.Contracts/Yee.Change.EventRecorder.Application.Contracts.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.Blazor/Yee.Change.EventRecorder.Blazor.csproj" -c Release --force -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.BlazorServerUI/Yee.Change.EventRecorder.BlazorServerUI.csproj" -c Release --force -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.Blazor.Server/Yee.Change.EventRecorder.Blazor.Server.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.Blazor.WebAssembly/Yee.Change.EventRecorder.Blazor.WebAssembly.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.Domain/Yee.Change.EventRecorder.Domain.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.Domain.Shared/Yee.Change.EventRecorder.Domain.Shared.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.EntityFrameworkCore/Yee.Change.EventRecorder.EntityFrameworkCore.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.HttpApi/Yee.Change.EventRecorder.HttpApi.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.HttpApi.Client/Yee.Change.EventRecorder.HttpApi.Client.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet build "src/Yee.Change.EventRecorder.Web/Yee.Change.EventRecorder.Web.csproj" --force -c Release -p:Version=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Application/Yee.Change.EventRecorder.Application.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Application.Contracts/Yee.Change.EventRecorder.Application.Contracts.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Blazor/Yee.Change.EventRecorder.Blazor.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.BlazorServerUI/Yee.Change.EventRecorder.BlazorServerUI.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Blazor.Server/Yee.Change.EventRecorder.Blazor.Server.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Blazor.WebAssembly/Yee.Change.EventRecorder.Blazor.WebAssembly.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Domain/Yee.Change.EventRecorder.Domain.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Domain.Shared/Yee.Change.EventRecorder.Domain.Shared.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.EntityFrameworkCore/Yee.Change.EventRecorder.EntityFrameworkCore.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.HttpApi/Yee.Change.EventRecorder.HttpApi.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.HttpApi.Client/Yee.Change.EventRecorder.HttpApi.Client.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - dotnet pack "src/Yee.Change.EventRecorder.Web/Yee.Change.EventRecorder.Web.csproj" -c Release --no-build -o $EVENT_RECORDER_NUPKG_OUTPUT_DIR -p:PackageVersion=$EVENT_RECORDER_VERSION_ID
    - echo "Deploying application..."
    - cd $EVENT_RECORDER_NUPKG_OUTPUT_DIR
    - dotnet nuget push *.$EVENT_RECORDER_VERSION_ID.nupkg -k $NUGET_API_KEY -s $NEXUS_REPO
    - echo "Application successfully deployed." 更新版本号:   # This job runs in the test stage.
  stage: update-version    # It only starts when the job in the build stage completes successfully.
  script:
    - echo "SSH到http服务器,更新文件里的版本号……"
    - bash $DIRECTORY_BUILD_UPDATE_VERSION_SH $DIRECTORY_BUILD_DIST_SERVER_USER $DIRECTORY_BUILD_DIST_SERVER $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME "Directory.Build.Change.EasyComment.props" $EASY_COMMENT_VERSION_ID
   
触发下游:
  stage: trigger-other-project
  trigger:
    project: change/wechat-mp
    branch: main

上述文件,解释如下:

1、EVENT_RECORDER_VERSION_ID : 2022.51.$CI_PIPELINE_IID

这是版本号,一个解决方案下,所有的项目,版本号是相同的。这里用到了Gitlab提供的变量$CI_PIPELINE_IID。您可以使用自己的命名规范,按需求使用其它的Gitlab提供的变量。

2、EVENT_RECORDER_NUPKG_OUTPUT_DIR : $CI_PROJECT_DIR/nupkg

dotnet pack命令的输出目录。打包好的文件是放在这里的。$CI_PROJECT_DIR这个变量也是Gitlab提供的,表示“作业”执行时,当前解决方案的根目录。

3、bash $DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME

$DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES是我们制作的docker-linux-dotnet8.0的image中,download.sh的绝对路径。

$DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME是我们分发Directory.Build.props及其相关文件的网站的主机名字。

4、dotnet nuget push *.$EVENT_RECORDER_VERSION_ID.nupkg -k $NUGET_API_KEY -s $NEXUS_REPO

$NEXUS_REPO就是nuget存储库的网址

$NUGET_API_KEY是nuget存储库里,用户的Api Key。有了这个key,dotnet nuget push就能在命令行里直接上传。

这里有个知识点,上述Api Key只能用于“上传”,对“下载”是没有作用的。NuGet.Config文件里面,配置登入nuget服务器,只能使用用户名和迷惑。或者把nuget服务器配置为允许匿名访问。

5、bash $DIRECTORY_BUILD_UPDATE_VERSION_SH $DIRECTORY_BUILD_DIST_SERVER_USER $DIRECTORY_BUILD_DIST_SERVER $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME "Directory.Build.Change.EasyComment.props" $EASY_COMMENT_VERSION_ID

$DIRECTORY_BUILD_UPDATE_VERSION_SH

就是制作docker-linux-dotnet8.0时,update-remote-version-number.sh的绝对路径

$DIRECTORY_BUILD_DIST_SERVER_USER

http服务器上的linux用户,SSH的时候要用到

$DIRECTORY_BUILD_DIST_SERVER

http服务器的IP地址或者DNS名称

$DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME

SSH登入远程服务器后,去这个目录下操作。为了让服务器更安全,我们的docker-linux-dotnet8.0的image里面,规范(写死了)网站的集中存放的根目录,这里的参数只能写子目录的名字。

"Directory.Build.Change.EasyComment.props"

这个只有在当前stage里面才用到一次,所以没有做成变量。就是去上述目录下,操作这个具体的文件。

$EASY_COMMENT_VERSION_ID

版本号。

额外说明

为什么dotnet push的动作,放在dotnet pack的“作业”里?

因为我们可能有多个Gitlab Runner的实例,不同实例的工作目录是不同的。只有在一个“作业”里,才能去相同的$EVENT_RECORDER_NUPKG_OUTPUT_DIR目录下操作你期望的包文件。放在同一个stage里添加dependencies依赖关系都不行。

为什么更新版本号不放在dotnet push这个作业里?

因为dotnet pack出来的产品,虽然推送到了nuget存储库,但是这些包是没有经过单元测试的,难以保证质量。所以要放在“单元测试”的场景之后。

本文的.gitlab-ci.yml忽略了单元测试的场景的定义。

Gitlab中的打包作业完成后,更新http服务器里的版本号文件的更多相关文章

  1. static final修饰的静态变量修改后更新到服务器,重启无法生效的问题

    今天在工作中碰到这样一个问题,有一个常量类,将工程中常用的一些变量定义在了里面.今天我要修改其中的某个变量.修改完后将编译好的.class文件更新到了服务器上,但是重启服务器后发现始终没有变化,还是以 ...

  2. Pychram 在model中修改class属性值后更新到Navicat Premium中

    一.pycharm数据更新的问题bug问题 1.在更改user_email字端属性后出现数据库信息无法更新到数据库,出现的bug原因是数据库修改了属性之后没有做migrate 和 makemigrat ...

  3. gitlab上fork别人的代码后更新的2种解决方式

    1.解决方式1 首先要先确定一下是否建立了主repo的远程源: git remote -v如果里面只能看到你自己的两个源(fetch 和 push),那就需要添加主repo的源: git remote ...

  4. Unity3d:编辑器中运行正常,发布后的exe提示找不到文件

    解决方案1:查看文件路径拼写方式,如果是用“+”拼接的,请改用System.IO.Path.Combine()方式拼接.经过测试,两种拼接方式打印出来的路径是一样的,但为什么 加号 的方式拼接unit ...

  5. WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 前言 GIS代码进行更新后,由于用户前端已有缓存,导致更新的功能不 ...

  6. 在Bootstrap开发框架的工作流模块中实现流程完成后更新资料状态处理

    在开发查看流程表单明细的时候,在Web界面中,我们往往通过使用@RenderPage实现页面内容模块化的隔离,减少复杂度,因此把一些常用的如审批.撤销.会签.阅办等等的流程步骤都放到了通用处理的页面V ...

  7. SQL Server 2008 R2中配置作业失败后邮件发送通知

    SQL Server日常维护中难免会遇到作业失败的情况.失败后自然需要知道它失败了,除了例行检查可以发现出错以外,有一个较实时的监控还是很有必要的.比较专业的监控系统比如SCOM虽然可以监控作业执行情 ...

  8. 【iOS】Jenkins Gitlab持续集成打包平台搭建

    Jenkins Gitlab持续集成打包平台搭建 SkySeraph July. 18th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点: ...

  9. 解放双手 | Jenkins + gitlab + maven 自动打包部署项目

    前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ...

  10. linux中tar 打包指定路径文件

    linux中tar打包指定路径文件www.111cn.net 编辑:yahoo 来源:转载在linux系统中打包与解压文件我都可以使用tar命令来解决,只要使用不同的参数就可以实现不同的需要了,下面来 ...

随机推荐

  1. [转帖]nacos开启强鉴权

    注意 Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险. Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系. 如果 ...

  2. [转帖] 这grep咋还不支持\d呢(BRE,ERE,PCRE)

    https://www.cnblogs.com/codelogs/p/16060372.html 简介# 对于刚使用Linux不久的同学,肯定会遇到这个问题,就是用grep匹配数字时,发现\d匹配不了 ...

  3. vue中$children的理解

    官网介绍 $children $children 获取当前实例的直接子组件 .需要注意 $children 并不保证顺序,也不是响应式的.[特别重要] 如果你发现自己正在尝试使用 $children ...

  4. vue3关于.sync的用法

    场景描述 我们都知道,子组件是不能够去修改父组件传递过来的数据. 因为如果子组件去修改父组件件传递过来的数据. 会导致数据的应用流向变得难以理解. 但是有些时候,我们需要当子组件的数据变化后,父组件的 ...

  5. 【学习日志】Java基本数据类型的自动装箱和拆箱

    // 测试代码 public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Intege ...

  6. Gin 获取请求参数

    1.获取URL?后的参数(不区分请求方式) // 获取请求url ? 后的参数(url:8080/add?name=kelvin) func GetUrlParam(ctx *gin.Context) ...

  7. Vue +Spring Boot 前后端分离 的 项目 笔记

    Vue +Spring Boot 前后端分离 的 项目 笔记 前端部分 Vue 脚手架的搭建 1.在创建目录的上一目录执行命令 命令为 vue init webpack 项目名 再创建项目的时候会自动 ...

  8. 12c/19c新特性官方文档快速参考

    工作中会经常遇到被询问Oracle某一个新特性,是在哪个版本开始引入,通常都去查官方文档New Features部分章节,下面列出从12.1.0.1 到 19c的对应在线官方文档的链接,方便快速检索: ...

  9. Git操作--Pycharm

    声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 一--在idea中配置git: 1. 更改git的安装路径:file-->settings,找到versio ...

  10. typescript 实现enum枚举值定义为对象

    壹 ❀ 引 最近因为有一些闲散时间,所以一直在做将Class组件重构为typescript + hooks组件的工作,结果今天就遇到一个有趣的问题.我们知道react Class组件一般都会定义Com ...