由于部署个人博客系统的服务器只有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. 如何解决代码中if/else 过多的问题

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  2. 程序设计基础·Java学习笔记·面向对象(上)

    Java程序设计基础之面向对象(上) (自适应学习进度而进行记录的笔记,希望有一些小小的用处吧(^∀^●)ノシ) (新人上路,望多指教,如有错误,望指正,万分感谢(o゚v゚)ノ) 目录 一.面向对象 ...

  3. 6月15日 python学习总结 Django模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  4. 【freertos】005-启动调度器分析

    前言 本节主要讲解启动调度器. 这些都是与硬件相关,所以会分两条线走:posix和cortex m3. 原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/160 ...

  5. Mosquitto安装和使用

    Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发,它为我们提供了非常棒的轻量级数据交换的解决方案. 下载地址是: ht ...

  6. 面试问题之数据库:SQL优化的具体操作

    转载于:https://www.cnblogs.com/wangzhengyu/p/10412499.html SQL优化的具体操作: 1.尽量避免使用select *,返回无用的字段会降低查询效率. ...

  7. 对于 GC 方面,在使用 Elasticsearch 时要注意什么?

    1.SEE:https://elasticsearch.cn/article/32 2.倒排词典的索引需要常驻内存,无法 GC,需要监控 data node 上 segmentmemory 增长趋势. ...

  8. Spring-MVC 里面的ModelAndView

    作用: 由于本身http是无状态的并不会保存什么请求信息.  但是目标页面可能又需要一些信息.这时候可以用ModelAndView存放一些业务数据之类等.然后返回给页面 用法: 比较重要的方法: 往对 ...

  9. 如何获取所有的参数名和参数值?用request.getParameterNames(); Enumeration enu=request.getParameterNames(); while(enu.hasMoreElements()){ String paraName=(String)enu.nextElement(); System.out.println(paraName+"

    用request.getParameterNames();  Enumeration enu=request.getParameterNames();  while(enu.hasMoreElemen ...

  10. 学习Solr(三)

    本文以solr5为例说明在linux系统上单机安装过程. 一.    solr的安装 1.   solr能够安装在不同的操作系统上,安装solr前需要安装何时的JRE.当前版本5.5最低需要JRE1. ...