由于部署个人博客系统的服务器只有2G内存,每次利用jenkins编译,发布的时候jenkins老是挂,因此新买了一台轻量应用服务器,专门用于个人博客系统的持续发布任务,下面讲解如何利用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.jar
 chmod 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 any
stages {
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 实现代码自动发布流程大概的流程总结起来就是:提交代码到gitee->gitee通过Webhook钩子通知jenkins gitee插件->gitee插件触发构建(Gitee API V5 Token验证)->git插件拉取代码(通过SSH Username with Private key身份验证方式)->执行编译脚本->发布到应用服务器,另外需要注意的是 jenkins 默认是以jenkins用户来执行的,因此需要开通jenkins用户能执行bash的权限,以及创建git插件身份验证秘钥的时候一定要以jenkins用户登录去创建,否则要拉取代码的时候会出现权限问题。

参考:

https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos

https://gitee.com/help/articles/4193#article-header2

https://gitee.com/oschina/Gitee-Jenkins-Plugin/issues/I4NQAJ

https://gitee.com/oschina/Gitee-Jenkins-Plugin/issues/I27J6U?from=project-issue

https://stackoverflow.com/questions/60184012/jenkins-does-not-show-configured-git-credentials

https://gitee.com/help/articles/4181

https://www.cnblogs.com/zinan/p/14106186.html

https://stackoverflow.com/questions/21434064/how-to-become-a-jenkins-user

https://stackoverflow.com/questions/7114990/pseudo-terminal-will-not-be-allocated-because-stdin-is-not-a-terminal

https://www.cyberciti.biz/faq/force-ssh-client-to-use-given-private-key-identity-file/

https://unix.stackexchange.com/questions/494483/specifying-an-identityfile-with-ssh

asp.net core + jenkins 实现自动化发布的更多相关文章

  1. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)

    上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...

  2. Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署

    写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级 ...

  3. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1)

    相关博文: Ubuntu 简单安装和配置 GitLab Ubuntu 简单安装 Docker Ubuntu Docker 简单安装 GitLab Ubuntu Docker 安装和配置 GitLab ...

  4. .NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线

    Powered by ASP.NET Core on Linux! 我们全站的 .NET Core 迁移工作如火如荼,这是我们今年上半年的重要工作. 今天我们终于完成了博问产品(q.cnblogs.c ...

  5. [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  6. [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  7. [翻译] ASP.NET Core 2.1.0 发布

    原文: ASP.NET Core 2.1.0 now available 今天,我们很高兴可以发布 ASP.NET Core 2.1.0!这是我们 .NET平台下开源的.跨平台的 Web 框架的最新版 ...

  8. ASP.NET Core Web应用在发布时选择是否对视图进行编译

    原文:ASP.NET Core Web应用在发布时选择是否对视图进行编译 在我们发布ASP.NET Core Web应用程序时,选择以文件形式发布,发布方法选择文件系统 默认情况下,会把Views的视 ...

  9. Asp.net Core Jenkins Docker 实现一键化部署

    写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker ...

随机推荐

  1. MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)

    今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...

  2. sql注入之简要注入

    #mysql简要注入流程 mysql注入简要流程如下图: 由于还没学习完先结合sqlilabs的第一关讲解信息收集的一部分和数据注入的information_schema的有据查询. #sqli-la ...

  3. js学习笔记-Java script正则表达式

    创建正则表达式 js中的正则包含在两个斜杠之间:/abc+v/ 正则中的特殊字符 \: 1.当后面不是特殊字符时表示字符边界 2.当后面是特殊字符时表示转义 ^: 1.匹配首位,例如,/^A/ 并不会 ...

  4. github新手使用指南

    常用命令:   Git 速查表(摘自 AI有道) 一.常见命令 git init : 初始化 git 仓库,即将一个文件夹初始化为一个 git 仓库.具体的操作是创建一个 .git 隐藏文件夹 git ...

  5. 一、mycat介绍

    一.背景 随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘.IO.系统开销,甚至性能上的瓶颈,而一台服务的资源终究是有限的,因此需要对数据库和表进 ...

  6. 简单描述 MySQL 中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面) ?

    索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针. 普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的 ...

  7. 说说 Redis 哈希槽的概念?

    Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点 ...

  8. springboot使用jar包方式启动,找不到resources目录中的配置文件(运行时)FileNotFoundException

    将springboot项目打包成jar包,使用 java -jar jar包进行启动,富文本框使用ckeditor+ckfinder: 因为ckfinder自定义配置文件了,上传图片时出现了异常 De ...

  9. 如果我不输入<!DOCTYPE HTML>,HTML 5能工作吗?

    No,浏览器将无法识别HTML文件,并且HTML 5标签将无法正常工作.

  10. 【代码开源】GreaterWMS 抖音SDK调用教程

    应用介绍 GreaterWMS 抖音SDK调用教程 SDK具体功能: 1,一仓多店,多仓多店 2,库存同步,商品同步 3,快递发货,物流轨迹 4,订单拦截 5,字节云仓 6,精选联盟 7,供应分销 8 ...