当前位置: 首页 > 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中可能会存在前导空格、尾随空格或…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...