当前位置: 首页 > news >正文

使用gitlab ci/cd来发布一个.net 项目

gitlab runner的安装和基本使用:https://bear-coding.blog.csdn.net/article/details/120591711

安装并给项目配置完gitlab runner后再操作后面步骤。

实现目标:

  1. master分支代码有变更的时候自动构建build。

  1. 当开发人员在gitlab上给项目打一个tag标签分支的时候自动触发流水线,根据标签名称和分支名称来自动发布;

例如分支名称为"test_3.1.1.1_project1&project2"则发布到测试环境

例如分支名称为"prod_3.1.1.1_project1&project2"则发布到生产环境

在项目根目录下创建以下文件:

创建好之后,提交到gitlab上,就直接可以使用了

.gitlab-ci.yml 流水线文件

stages:- build- test- prod#当master分支变更的时候触发
build:stage: buildscript: sh ./build.shonly:- master  #master主干有变更的发起编译任务tags:- trade_runner  #任务标签,根据此标签匹配gitlab runner的标签。test:stage: testscript: sh ./test.shonly:refs:- tags #创建tag分支且格式为”test_44.55.66.77_project1.project2“的时候发起发布任务variables:- $CI_COMMIT_TAG =~ /^test_[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+_[a-zA-Z0-9&\.]+$/tags:- trade_runnerprod:stage: prodscript: sh ./prod.shonly:refs:- tags #创建tag分支且格式为”prod_44.55.66.77_project1.project2“的时候发起发布任务variables:- $CI_COMMIT_TAG =~ /^prod_[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+_[a-zA-Z0-9&\.]+$/tags:- trade_runnerwhen: manual #设置需要手动触发

build.sh 执行编译项目的脚本文件

#!/bin/shecho "start build task,job_name=$CI_JOB_NAME"#判断流水线任务必须是build
if [ "$CI_JOB_NAME" != "build" ]; thenecho "error job name: $CI_JOB_NAME"exit 1
ficd GitLabTest/
dotnet build $build_args
#获取构建结果
build_result=$?
echo "end build task,$build_result"
exit $build_result

test.sh 执行发布测试环境的脚本

#!/bin/shthetime=`date +%Y%m%d%H%M`
tag_msg=`echo "$CI_COMMIT_TAG" | awk -F '_' '{print $3}' `
echo "start test task,tag=$CI_COMMIT_TAG,job_name=$CI_JOB_NAME,tag_message=$tag_msg,time=$thetime"#判断流水线任务必须是deploy
if [ "$CI_JOB_NAME" != "test" ]; thenecho "error job name: $CI_JOB_NAME"exit 1
fi#要发布的项目列表
programs=(${tag_msg//&/ })for program in ${programs[@]}
do#切换到要发布的项目里,并发布项目cd GitLabTest/$programecho "start publish $program"dotnet publish -c Release -r linux-x64 -p:PublishSingleFile=true $build_args -p:DebugSymbols=true -p:DebugType="portable"if [ $? != 0 ]; thenecho "publish $program failed"exit 1fiecho "publish $program success"cd ../../
donebase_pwd=`pwd`
build_path_middle="publish"for program in ${programs[@]}
do#将发布好的文件复制到发布目录下#也可以将文件打包成tar,传输到远程服务器上,或者生成docker镜像,推送到镜像服务器。见后面注释部分echo "start copy $program"#预先创建存放发布文件的目录,并将权限给到gitlab-runner#mkdir /usr/local/publish#chown -R gitlab-runner:gitlab-runner /usr/local/publishmkdir -p /usr/local/$build_path_middle/$program/cp -rf $base_pwd/GitLabTest/$program/bin/Release/net7.0/linux-x64/* /usr/local/$build_path_middle/$program/echo "copy $program success"
done#将文件打包成tar,传输到远程服务器上,
#        rm -f program.tar.gz
#        tar zcf program.tar.gz -C publish --exclude "*.tar.gz" .
#        ssh -p $server_port $server_ip "mkdir -p $deploy_base_pwd/$program/"
#        ssh -p $server_port $server_ip "{ cd $deploy_base_pwd/$program/ && [ -s program.tar.gz ] && mv -f program.tar.gz program_bak.tar.gz; } || true"
#        scp -P $server_port program.tar.gz $server_ip:$deploy_base_pwd/$program/#将文件生成docker镜像,并推送到镜像仓库
#docker build -f /usr/local/$build_path_middle/$program/Dockerfile -t 镜像仓库地址/trade-$program:${thetime} .
#docker push 镜像仓库地址/trade-$program:${thetime} 
#docker rmi 镜像仓库地址/trade-$program:${thetime} 

prod.sh 执行发布到生产环境的脚本,与test.sh基本一至,根据实际需要更改

#!/bin/shthetime=`date +%Y%m%d%H%M`
tag_msg=`echo "$CI_COMMIT_TAG" | awk -F '_' '{print $3}' `
echo "start product task,tag=$CI_COMMIT_TAG,job_name=$CI_JOB_NAME,tag_message=$tag_msg,time=$thetime"#判断流水线任务必须是deploy
if [ "$CI_JOB_NAME" != "prod" ]; thenecho "error job name: $CI_JOB_NAME"exit 1
fi#要发布的项目列表
programs=(${tag_msg//&/ })for program in ${programs[@]}
do#切换到要发布的项目里,并发布项目cd GitLabTest/$programecho "start publish $program"dotnet publish -c Release -r linux-x64 -p:PublishSingleFile=true $build_args -p:DebugSymbols=true -p:DebugType="portable"if [ $? != 0 ]; thenecho "publish $program failed"exit 1fiecho "publish $program success"cd ../../
donebase_pwd=`pwd`
build_path_middle="publish"for program in ${programs[@]}
do#将发布好的文件复制到发布目录下#也可以将文件打包成tar,传输到远程服务器上,或者生成docker镜像,推送到镜像服务器。见后面注释部分echo "start copy $program"#预先创建存放发布文件的目录,并将权限给到gitlab-runner#mkdir /usr/local/publish#chown -R gitlab-runner:gitlab-runner /usr/local/publishmkdir -p /usr/local/$build_path_middle/$program/cp -rf $base_pwd/GitLabTest/$program/bin/Release/net7.0/linux-x64/* /usr/local/$build_path_middle/$program/echo "copy $program success"
done#将文件打包成tar,传输到远程服务器上,
#        rm -f program.tar.gz
#        tar zcf program.tar.gz -C publish --exclude "*.tar.gz" .
#        ssh -p $server_port $server_ip "mkdir -p $deploy_base_pwd/$program/"
#        ssh -p $server_port $server_ip "{ cd $deploy_base_pwd/$program/ && [ -s program.tar.gz ] && mv -f program.tar.gz program_bak.tar.gz; } || true"
#        scp -P $server_port program.tar.gz $server_ip:$deploy_base_pwd/$program/#将文件生成docker镜像,并推送到镜像仓库
#docker build -f /usr/local/$build_path_middle/$program/Dockerfile -t 镜像仓库地址/trade-$program:${thetime} .
#docker push 镜像仓库地址/trade-$program:${thetime} 
#docker rmi 镜像仓库地址/trade-$program:${thetime} 

相关文章:

使用gitlab ci/cd来发布一个.net 项目

gitlab runner的安装和基本使用:https://bear-coding.blog.csdn.net/article/details/120591711安装并给项目配置完gitlab runner后再操作后面步骤。实现目标:master分支代码有变更的时候自动构建build。当开发人员在gitlab上给项目打一个tag标签分支的时候自动触发…...

笔试题-2023-蔚来-数字芯片设计【纯净题目版】

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.24应聘岗位:校招-芯片逻辑综合工程师-智能硬件笔试时长:90min笔试平台:nowcoder牛客网题目类型:不定项选择题(15道)、填空题…...

ThreadLocal 详解

ThreadLocal简介JDK源码对ThreadLocal类的注释如下:ThreadLocal提供线程局部变量,使得每个线程都有自己的、独立初始化的变量副本ThreadLocal实例通常是类中的private static字段,用于将状态与线程相关联,如用户ID、事务ID只要线程…...

【Java 面试合集】重写以及重载有什么区别能简单说说嘛

重写以及重载有什么区别能简单说说嘛 前述 这是一道非常基础的面试题,我们在回答的过程中一定要逐一横向比较。 从方法的 修饰符,返回值,方法名,含义,参数等方面进行逐一分析来比较不同。 话不多话,看下…...

到底什么是股票委托接口?

在量化股票市场上,常见的股票委托接口其实有着不一样的交集,就拿股票交易接口,在量化股票跟程序化交易中,有共同之处就是在于直接委托执行下单,并且能很快的就能够将策略输出在账户持仓数据中,继续缓存下来…...

Linux驱动:VPU

1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 概述 VPU 是用来进行图像、视频数据进行硬件编、解码的硬件模块。内部集成了 Encoder、Decoder 功能部件进行图像、视频数据进行硬件编、解码&a…...

简介Servlet

目录 一、maven中心库 二、简介Servlet 三、实现Servlet动态页面 1、创建一个maven项目 2、引入依赖 3、创建目录结构 4、编写Servlet代码 5、打包 6、部署 7、验证程序 四、Servlet的运行原理 五、Tomcat伪代码 1、Tomcat初始化 a、让Tomcat先从指定的目录…...

Learning C++ No.7

引言: 北京时间:20223/2/9/22:20,距离大一下学期开学还有2天,昨天收到好消息,开学不要考试了,我并不是害怕考试,考试在我心里,地位不高,可能只有当我挂了,才能…...

【MyBatis】第八篇:一级,二级缓存

其实缓存字面的意思就是将一些内容缓存下来,等下次使用的时候可以直接调用,通过数据库得到数据,有时候会使用相同的数据,所以mybatis自然也支持缓存。 而mybatis按照缓存的效果可以分两大类:一级缓存和二级缓存。 一…...

【大唐杯备考】——5G基站开通与调测(学习笔记)

📖 前言:本期介绍5G基站开通与调测。 目录🕒 1. 概述🕒 2. 5G基站开通与调测基础🕘 2.1 3.5GHz单模100MHz配置(S111)🕘 2.2 3.5GHz单模100MHz配置(S111111)&a…...

redhat7 忘记root密码,重置办法

来自https://www.tracymc.cn/archives/802 亲测可用,太感谢了,在此记录一下,原文有图 1.启动的时候,在有启动项界面,相应启动项内核名称上按“e”; 2.进入后,找到linux16开头的地方,按“end”键或者controle到最后,输入rd.break,再按ctrlx进…...

QML- 对象属性

QML- 对象属性一、概述二、id 属性三、Property 属性1. 定义属性1. 自定义属性定义中的有效类型2. 为属性属性赋值1. 初始化时的值赋值2. 命令式赋值3. 静态值和绑定表达式值4. 类型安全5. 特殊属性类型1. 对象列表属性2. 分组属性6. 属性别名1. 属性别名的注意事项2. 属性别名…...

将.js文件转成vue标签结构的样式

例如:下图所示: 依次识别获取.js文件中的tag和props,可以理解为字符串拼接,将整个vue的标签结构看作是一个字符串。 话不多说,先放上完整代码,思路看代码备注。(自己实现的时候,可以…...

前端知识点复盘

组件和jsx <body><div id"root"></div><script type"text/babel">const root ReactDOM.createRoot(document.getElementById("root"))class App extends React.Component {render() {return (<div> <h1>s…...

前端JavaScript获取图片文件的真实格式

常见方式判断图片格式 当我们进行前端开发&#xff0c;需要处理图片上传功能&#xff0c;针对图片格式做判断时&#xff0c;常规的方法都是使用文件后缀名来判断&#xff0c;如下代码所示&#xff1a; input.addEventListener(change, (e) > {const file e.target.files[…...

今天面了一个来华为要求月薪25K,明显感觉他背了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

11 Advanced CNN

文章目录GoogLeNetInception Module1x1 Conv计算效果代码实现总结ResNet (残差网络)问题引入梯度消失与传统神经网络的比较代码实现课程来源&#xff1a; 链接对于前篇中所提到问题&#xff0c;设计出的是一种类似于LeNet5的线性结构&#xff0c;而对于大多数问题&#xff0c;简…...

亿级高并发电商项目---万达商城项目搭建(二)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

UML术语标准和分类

一、UML术语标准 1&#xff0e;中文UML术语标准 中国软件行业协会&#xff08;CSIA&#xff09;与日本UML建模推进协会&#xff08;UMTP&#xff09;共同在中国推动的UML专家认证&#xff0c;两个协会共同颁发认证证书、两国互认&#xff0c;CSIA与UMTP共同推出了UML中文术语…...

LeetCode 刷题系列 -- 151. 反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格或…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...