ASP.NET Core + Jenkins 实现自动化发布

一、安装Jenkins

我这边服务器是Linux CentOS 7 ,使用SSH 登录云服务器后,输入以下命令安装jenkins.

sudo wget -O /etc/yum.repos.d/jenkins.repo \https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum upgrade
# Add required dependencies for the jenkins package
sudo yum install java-11-openjdk
sudo yum install jenkins
sudo systemctl daemon-reload
systemctl enable jenkins
sudo systemctl start jenkins

安装成功后,在浏览器中输入服务器 公网IP地址+8080端口访问

上图提示你需要从服务器上的initialAdminPassword文件复制jenkins的初始登录密码进行输入,输入后点击继续。

然后选择 安装Jenkins推荐的插件,然后等待所有推荐插件安装完成.

安装完后,创建一个登录Jenkins的账号

访问地址配置用默认的就好(通过8080端口访问)。

二、安装Gitee插件

这边以我的个人博客代码为例子,因为目前我的个人博客代码是托管到码云上,因此这里利用Gitee插件来实现持续发布功能.

点击左侧 Dashboard->Manage Jenkins(系统管理) 菜单,并点击Manage Plugins(插件管理)

选择可选插件,然后输入Gitee,然后点 Download now and install after restart,

这个插件主要是用于接收gitee WebHook通知(如:代码提交、PR等)并触发jenkins构建

安装成功后,前往 Jenkins -> Manage Jenkins(系统管理) -> Configure System(系统配置) -> Gitee Configuration(Gitee配置) ,对插件进行配置。

添加一个新的证书令牌,按照如下配置,GiteeAPIV5 私人令牌可以通过页面:https://gitee.com/profile/personal_access_tokens 生成,然后点击添加。

这个时候点击测试连接会发现报错,无法连上,https://gitee.com/oschina/Gitee-Jenkins-Plugin/issues/I4NQAJ 这里面提出了解决方案 , javax.ws.rs-api jar包可以在这里(https://repo1.maven.org/maven2/javax/ws/rs/javax.ws.rs-api/2.1.1/)下载。

需要注意的是:安装完相应jar包或者Jersey 2 API 插件后后记得重启jenkins才能生效。

mkdir -p /var/cache/jenkins/war/WEB-INF/lib
cd /var/cache/jenkins/war/WEB-INF/lib
wget https://repo1.maven.org/maven2/javax/ws/rs/javax.ws.rs-api/2.1.1/javax.ws.rs-api-2.1.1.jarchmod a+x javax.ws.rs-api-2.1.1.jar
systemctl restart jenkins

按照以上方法试了后,我这边还是不行,可能是我那个流程没有操作对。

然后安装Jersey 2 API后,重启jenkins发现可行(我这边jenkins版本比较新)

三、服务器相关编译环境配置

  • 安装.net core sdk.用于编译,我这边用的dotnet版本还是.net core 3.1,输入以下命令安装

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1
  • 安装git

sudo yum install git

四、新建自动构建任务

进入 Dashboard->新建任务,输入任务名称,然后选择流水线。

General配置

配置构建触发器

配置流水线

点击Credentials 右下方的添加按钮,添加用于拉取代码用的身份验证凭据。

需要注意的是:如果使用git ssh 协议(也就是格式为git开头的仓储地址),则添加身份验证凭据的时候,凭据类型只支持:Username with password (用户名和密码验证)、SSH Username with private key(用户名和私钥验证),用户名就是gitee的登录账号。

创建身份验证凭据秘钥前,需要将服务器登录用户先切换到jenkins用户,不然以root用户创建的秘钥文件,将无法拉取代码(存在权限问题),切换到jenkins用户前,先执行以下命令,以便允许jenkins用户登录。

sudo usermod -s /bin/bash jenkins

切换到jenkins用户

sudo su - jenkins

在服务器上输入以下命令创建身份验证凭据私钥,-C 后面的参数可以是任意内容,但通常用邮箱账号。

ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"

生成后,服务器上输入以下命令读取公钥内容,然后将公钥内容复制到gitee指定项目的 管理->部署公钥管理->添加公钥中添加指定公钥,

cat ~/.ssh/id_ed25519.pub

gitee上添加公钥后,在服务器上执行以下命令

ssh -T git@gitee.com

通过执行以下命令读取ssh身份验证私钥内容,并输入到 jenkins 身份验证凭据的以下位置。

cat ~/.ssh/id_ed25519

添加身份验证凭据后,按照下图配置。

在jenkins 服务器上执行以下命令,创建ssh 身份认证秘钥,并将公钥复制到应用服务器上,以便在编译成功后,直接复制dll到应用服务器上,而无需输入应用服务的登录密码,需要注意的是,创建秘钥前,先切换到jenkins用户账号。

sudo su - jenkins
ssh-keygen -t rsa

以下命令表示将jenkins所在服务器生成的公钥复制到应用服务器(因为~/.ssh/目录下已经有其他的秘钥,因此这边指定复制哪一个公钥)

ssh-copy-id -i ~/.ssh/id_rsa.pub root@115.159.114.65 -p 1200

以上两个命令执行成功后,可以创建一个文本文件进行测试,看下是否能无需输入密码就可以复制文件到应用服务器。

cd ~
touch test.txt
echo "测试内容" >> test.txt

以下命令用于将jenkins服务器上用户主目录下的test.txt文件复制到应用服务器上用户主目录。

# -P 表示应用服务器的ssh登录端口(如果不是22,必须指定),-i 后面跟的是jekins服务器上生成的私钥文件。
scp -P 1200 -i ~/.ssh/id_rsa ~/test.txt root@115.159.114.65:~

在项目的解决方案文件(.sln)同级目录下新建名称为jenkinsfile的文件,并输入以下脚本内容

pipeline {agent anystages {stage('build') {steps {echo '开始拉取代码'sh 'git pull origin dev:dev'echo '切换到本地dev分支'sh 'git checkout dev'echo '当前工作目录及文件列表如下'sh 'pwd'sh 'ls -al'dir("${WORKSPACE}/BlogSys") {echo '开始编译博客前端站点'sh 'dotnet publish ./BlogSys.csproj -c Release -r linux-x64 --no-restore'}//WORKSPACE表示存放代码的根目录。dir("${WORKSPACE}/BlogSysManagement"){echo '开始编译博客后台站点'sh 'dotnet publish ./BlogSysManagement.csproj -c Release -r linux-x64 --no-restore'}}}stage('deploy'){steps {echo '开始发布流程,当前工作目录如下'sh 'pwd'echo '开始发布个人博客前端系统'echo '停止前端站点'sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -T "systemctl stop blogsys"'//dir函数里面要用环境变量记得用双引号,该函数用于改变当前目录,dir函数块里面包含的所有相对路径都是相对于dir指定的目录。dir("${WORKSPACE}/BlogSys/bin/Release/netcoreapp3.1/linux-x64/publish/"){//-i 用于指定ssh传输身份验证私钥,-r表示复制目录下的所有文件及子目录以及子目录下的所有文件,也可以将这个文件夹打包压缩后再传输。sh 'scp -P 1200 -i ~/.ssh/id_rsa -r ./ root@115.159.114.65:/var/www/blogsys'}echo '重启前端站点'//这里不能使用-t 选项,应该使用-T 或 -tt 代理,否则无法正确执行。sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -T "systemctl restart blogsys"'echo '开始发布个人博客后台管理系统'echo '停止后台站点'sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -tt "systemctl stop blogsysmgr"'dir("${WORKSPACE}/BlogSysManagement/bin/Release/netcoreapp3.1/linux-x64/publish/"){sh 'scp -P 1200 -i ~/.ssh/id_rsa -r ./ root@115.159.114.65:/var/www/blogsysmgr'}echo '重启后台站点'sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -tt "systemctl restart blogsysmgr"'echo '系统发布成功'}}}
}

完成以上步骤后就可以开始测试构建啦.

gitee+jenkins 实现代码自动发布流程大概的流程

总结起来就是:

1、提交代码到gitee

2、gitee通过Webhook钩子通知jenkins gitee插件

3、gitee插件触发构建(Gitee API V5 Token验证)

4、git插件拉取代码(通过SSH Username with Private key身份验证方式)

5、执行编译脚本

6、发布到应用服务器,另外需要注意的是 jenkins 默认是以jenkins用户来执行的,因此需要开通jenkins用户能执行bash的权限,以及创建git插件身份验证秘钥的时候一定要以jenkins用户登录去创建,否则要拉取代码的时候会出现权限问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86310.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目RestfulAPI设计最佳实践

大家好,我是锋哥。今天分享关于【Java项目RestfulAPI设计最佳实践】面试题。希望对大家有帮助; Java项目RestfulAPI设计最佳实践 超硬核AI学习资料,现在永久免费了! 设计一个高效、易维护的 Java 项目中的 RESTful API 涉及到一…

FANUC机器人教程:用户坐标系标定及其使用方法

目录 概述 工作站创建 任务描述 用户坐标系标定方法 用户坐标系标定操作 用户坐标系手动测试 用户坐标系在程序中的应用 用户坐标系选择指令介绍 机器人示教编程 仿真运行 仿真案例资源下载 概述 FANUC机器人的用户坐标系,是用户对每个作业空间定义的直…

动态库与静态库【Linux】

程序编译过程 源代码(.cpp) → 预处理(.i) → 编译(.s) → 汇编(.o) → 链接(可执行文件) g -o main.i -E main.cpp 参数说明: 参数功能输出文件类型-E仅预处理.i-S预处理 编译.s-c预处理 编译 汇编.o无完整流程(预处理→编译→汇编→链接&…

MySQL MHA 故障转移-VIP

MHA故障转移-VIP #手工在主库添加VIP ifconfig ens33:1 192.168.80.200/24配置VIP脚本 vim /usr/local/bin/master_ip_failoverchmod x /usr/local/bin/#!/usr/bin/env perl use strict; use warnings FATAL > all;use Getopt::Long;my ( $command, $ssh_user, $orig_mast…

Elasticsearch索引字段的类型

在 Elasticsearch 中,索引字段的类型(即 Mapping 中的字段类型)对搜索和存储性能影响很大。下面是各种常用数据类型的用途及推荐使用场景总结: 1. keyword 类型(精确匹配) 适合数据: 不需要分词…

kubernetes证书续签-使用kubeadm更新证书(下)

#作者:任少近 文章目录 查看kubelet证书查看kubelet当前所使用的证书 更换 node上的kubelet证书生成node1所需要的kubelet.conf文件生成node2所需要的kubelet.conf文件查看csr 更新 ~/.kube/config 文件重启相关组件 查看kubelet证书 以上少了kubelet的证书&#…

AI智能体长期记忆系统架构设计:从认知模型到生产实践

1 长期记忆:AI智能体的认知基石 1.1 人类记忆与AI记忆的类比 #mermaid-svg-VIPKAFe7VgN4UHFA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VIPKAFe7VgN4UHFA .error-icon{fill:#552222;}#mermaid-svg-VIPKAFe7V…

快速上手:利用音频大模型与Java提取视频文案

文章目录 1、前言2、需求说明2.1 需求说明2.2 数据准备 3、功能实现3.1 使用视频理解大模型能力3.1.1 三方平台视频在线链接解析3.1.2 三方平台视频内网链接解析3.1.3 三方平台视频转存本地服务 3.2 使用音频识别大模型能力3.2.1 三方平台视频在线链接解析3.2.2 三方平台视频详…

LLM复杂记忆存储-多会话隔离案例实战

导读:在多用户并发的对话系统中,会话隔离问题往往成为开发者面临的技术难题。当数千个用户同时与AI助手交互时,如何确保每个用户的对话历史完全独立,避免数据混淆和隐私泄露? 本文深入剖析了基于RunnableWithMessageHi…

【PX4-AutoPilot教程-TIPS】PX4系统命令行控制台ConsolesShells常用命令(持续更新)

PX4系统命令行控制台 Consoles & Shells 常用命令 查看每个应用程序的堆栈使用情况获取所有可用命令和APP的列表应用程序启动、停止和状态查询查看本地文件系统查看剩余的可用RAM查看工作队列中正在运行的内容以及运行速率查看特定的uORB话题调试uORB话题进行模式切换和故障…

国内优秀wordpress主题推荐

在国内,WordPress 主题市场虽然不如国外那样庞大,但依然有许多优秀且适合中国用户需求的主题。以下是一些经过评估和推荐的国内优秀WordPress主题,涵盖不同类型的网站需求,如博客、企业官网、资源站、社区论坛等。 WP汉主题 WP汉…

第 6 章:进阶话题

第 6 章:进阶话题 过拟合vs欠拟合:模型复杂度和泛化能力的关系 在前面的章节中,我们已经学习了神经网络的基础知识、常见架构和基本训练流程。然而,在实际的深度学习项目中,仅仅掌握这些基础知识是不够的。我们还需要…

4.2_1朴素模式匹配算法

知识总览: 什么是字符串的模式匹配: 主串:想从该串获取结果的串 模式串:想搜索的内容,不一定在主串中能搜到,子串一定能在主串中搜到 字符串模式匹配:在主串找模式串并返回找到的第一个模式串…

华为云Flexus+DeepSeek征文|华为云ModelArts搭建Dify-LLM应用开发平台(AI智能选股大模型)

前言 在当今数字化时代,人工智能(AI)技术在金融领域的应用愈发广泛,其中 AI 智能选股大模型备受关注。为了构建高效且精准的 AI 智能选股大模型,选择合适的开发平台和工具至关重要。华为云 ModelArts 作为一款面向 AI …

C4.5算法深度解析:决策树进化的里程碑

C4.5是机器学习史上最经典的算法之一,由ID3之父Ross Quinlan在1993年提出。作为ID3的革命性升级,它不仅解决了前代的核心缺陷,更开创了连续特征处理和剪枝技术的先河,成为现代决策树的奠基之作。 本文由「大千AI助手」原创发布&am…

leetcode 65

#include <string> #include <vector> #include <unordered_map> using namespace std;class Solution { public:bool isNumber(string s) {// 定义状态转移表vector<unordered_map<char, int>> states {{{ , 0}, {s, 1}, {d, 2}, {., 4}}, // …

微服务(nacos+myibatis)中如何在一个模块调用多数据库源的一种方案

#nacos配置默认数据库 spring.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.datasource.driverNamecom.mysql.jdbc.Driver #默认数据库名 master spring.datasource.dynamic.primarymaster spring.datasource.dynamic.strictfalse spring.datasource.d…

高标准通信国际接轨,Ethercat与PROFINET网关实现全自动化生产线

在呼和浩特&#xff0c;集成商以其先进的食品饮料行业解决方案&#xff0c;为乳制品行业打造了一个智能化工厂的典范。这个工厂的核心是PROFINET全集成自动化&#xff08;TIA&#xff09;&#xff0c;它通过SIMATIC S7-1200 PLC和ethercat系统&#xff0c;构建了一个强大的PROF…

Netty 引用计数抽象类 AbstractReferenceCountedByteBuf 详解

核心类图 ----------------------------- ---------------------------------- | ReferenceCountUpdater | | AbstractReferenceCountedByteBuf | | <T extends ReferenceCounted>| | (extends AbstractByteBuf) | ----------…

用Python做一个手机镜头

文章目录 设置光学参数添加光学器件 设置光学参数 官方文档&#xff1a;设计手机镜头 rayoptics中提供了OpticalModel类&#xff0c;可用于创建光学模型对象。OpticalModel类中的【optical_spec】成员&#xff0c;是一个OpticalSpecs对象&#xff0c;可用于指定光圈、视野、光…