jenkins+git+.net core实现自动发布
一、前言
继上篇介绍jenkins过去2年多了,最近整理了一下,希望这篇能介绍到一些更实用的方法和知识。
本次使用的jenkins版本是2.375.1、jdk 17、WinRAR、git;发布时,可以选择生产、测试并替换相应的配置文件,并做站点目录的切换。
二、搭建发布环境
安装jenkins及所需插件,本文用到的插件如下:
- Active Choices Plug-in:
- Build With Parameters
- Gitee Plugin
- Hidden Parameter plugin
- Pipeline
- Pipeline: Stage View Plugin
- PowerShell plugin
- Workspace Cleanup
- Persistent Parameter Plugin
- Credentials Binding
三、创建、配置jenkins任务
- 创建任务之前,先把后续可能用的凭据设置好,例如git账号、svn账号、gitee的token等信息,凭据添加方式:点击Manage Jenkins 进入到管理界面,在Security 找到Manage Credentials点击进入该功能,默认第一个列表是没有数据的
- 点击第二个列表的“全局”,进入到下方界面,
- 继续点击右上方的 Add Credentials,进入新增界面,里面默认选择Username with password,输入相应的账号密码即可。如果选择Gitee API 令牌(token)需要进入Gitee中设置私人令牌。
- 点击左侧菜单的新建Item,输入任务名称,选择Pipeline
点击确定后进入配置界面,勾选 This project is parameterized (其他选项还未使用到),如下图:
对于一些敏感参数可以选择Hidden Parameter,这样在构建时就可以起到隐藏敏感信息的作用;
- 对于一些可能需要修改的字符串参数,可以使用String Parameter,在构建时可以根据需要进行修改,例如:项目代码的地址、需要编译的项目、解决方案名称。
- 对于需要选择的参数,可以选择 Choice Parameter,选项值为一个一行,设置如下:
这样在构建时就可以选择需要发布的环境。
9.对于需要根据上一个参数动态设置的参数,可以选择 Active Choices Reactive Parameter,比如选完环境后,需要根据环境设置服务器地址,就可以使用该参数,设置如下:
使用的Groovy Script
referenced parameters 填写的是引用参数的名称
四、流水线设置
这步最为重要了,先选择Pipeline script,在这里可以写构建脚本,如果对流水线语法不熟悉的可以点击下方的流水线语法,点击后会打开新的页面,里面可以根据需求去生成脚本,十分的好用。
流水线脚本里我主要是做了这几件事:
- 签出代码到指定的目录下;
- 执行编译、打包、上传、修改iis目录和应用程序池
- 清理工作空间
Pipeline代码
pipeline {
agent any
//checkoout 可以考虑使用并行的方式
stages {
//签出代码
stage('checkout') {
steps {
checkout([
$class: 'GitSCM', branches: [[name: '*/master']],
extensions:
[
[$class: 'RelativeTargetDirectory', relativeTargetDir: './DeployConfig'],//签出到指定目录
[$class: 'SparseCheckoutPaths', sparseCheckoutPaths: [[path: 'config/']]]//签出源代码指定文件夹
],
userRemoteConfigs: [[credentialsId: GitId, url: ConfigGit]]
])
checkout([
$class: 'GitSCM', branches: [[name: '*/master']],
extensions:
[
[$class: 'RelativeTargetDirectory', relativeTargetDir: './DeployScript'],//签出到指定目录
[$class: 'SparseCheckoutPaths', sparseCheckoutPaths: [[path: 'lr_bat/']]]//签出源代码指定文件夹
],
userRemoteConfigs: [[credentialsId: GitId, url: ConfigGit]]//credentialsId为上一步设置的凭据ID
])
checkout([
$class: 'GitSCM', branches: [[name: '*/master']],
extensions:
[
[$class: 'RelativeTargetDirectory', relativeTargetDir: './DeployCode']//签出项目源码
],
userRemoteConfigs: [[credentialsId: GitId, url: GitLR]]
])
}
}
//执行编译、打包、上传、部署IIS等脚本
stage('build') {
steps {
echo 'build....'
bat """ cd /d "./DeployScript/lr_bat"
call deploy_%Environment%.bat %IP% %Environment% ${JOB_NAME} ${WORKSPACE} %BuildPath% %SolutionName% %GitLR% No %UploadPackage% """
}
}
//清理工作目录
stage('clean'){
steps{
echo 'clean....'
cleanWs()
}
}
}
}
签出代码脚本不难,下面重点说一下第二步。
五、编译、打包、上传、修改IIS
这一步使用批处理(也称bat)命令脚本去处理项目编译、编译产物打包、包上传服务器、设置IIS站点。每一段批处理命令都可以单独创建一个bat文件,然后使用一个统一的入口bat文件依次调用即可:call xxx.bat 参数1 参数2 ....
bat代码说明
//bat """ cd /d "./DeployScript/lr_bat" call deploy_%Environment%.bat %IP% %Environment% ${JOB_NAME}
//${WORKSPACE} %BuildPath% %SolutionName% %GitLR% No No """
//cd "xxxx" 是切换到xxxx目录,call deploy_%Environment%.bat 是执行 deploy_SIT(SIT是选择的发布环境)bat脚本;
//%IP% 是Jenkins中自定义的参数,${JOB_NAME}是Jenkins内置的变量,${WORKSPACE}是当前Jenkins的工作空间。
//在bat脚本中,接收参数可以这么写:set IP=%1,%0 这个参数一般是bat脚本文件名。
在deploy_xxx.bat文件中首先是设置我们需要用的参数,例如:接收传进来的参数;设置编译产物目录、发布的版本号、脚本地址、解决方案路径等
这些基础工作做完后,就可以进行后续步骤了。
- .net core代码编译
@echo off&setlocal EnableDelayedExpansion
::==== %1 evn %2 jobname %3 svn version %4 sonar
//编译产物存放地址
set outPath= D:\JenkinspProduct\%2\%3
//创建目录
::mkdir %outPath%
//切换到代码根目录
cd ..\..\DeployCode\源码目录\ echo 还原nuget包
dotnet restore -s https://api.nuget.org/v3/index.json echo 编码源代码
//编码源代码并输出到%outPath% -o就是 -output 的缩写
dotnet publish -c Release -o %outPath%
exit /b - net framework代码编译
::%1 JobName %2 Svn Version %3 BuildPath %4 SolutionName
@echo off&setlocal EnableDelayedExpansion set outPath=E:\JenkinspProduct\%1\%2 echo restore nuget
cd ..\..\DeployCode\源码目录\
.nuget\NuGet.exe restore "%4" -source "https://api.nuget.org/v3/index.json" echo build project msbuild "%3" /m
/t:Rebuild
/t:ResolveReferences;Compile
/t:_CopyWebApplication
/p:Configuration=Release
/p:WebProjectOutputDir=%outPath%
/p:OutputPath=%outPath%\bin
/p:SolutionDir=..\
exit /b - 打包编译产物
@echo off&setlocal EnableDelayedExpansion
::==== %1 evn %2 jobname %3 svn version %4 WORKSPACE set localPath=D:\JenkinspProduct\zip\%2\%3.zip //压缩包全路径
set binPath=D:\JenkinspProduct\%2\%3 //编译产物目录
set configPath=%4\\DeployConfig\config\%2_config\%1 //配置文件目录 if exist %binPath% (
echo 开始打包
) else (
echo ERROR : %2 编译产物不存在
exit 1
) echo 替换%Environment%环境配置文件
xcopy %configPath% %binPath% /e /y echo 校验压缩包是否存在
if exist %localPath% (
goto Deletezip
) else ( goto Next) :Deletezip
echo 删除压缩包%localPath%.zip
del %localPath% :Next
echo 开始压缩产物
mkdir D:\JenkinspProduct\zip\%2
echo %localPath%
echo %binPath%
//这里需要安装WinRAR,且配置到系统环境变量中,如果不配环境变量的话,WinRAR 需要替换成"安装路径/WinRAR.exe"
WinRAR a -r -ep1 -m1 %localPath% %binPath%
echo 压缩完成 set err=%errorlevel%
exit /b - 编译产物上传
//使用FTP上传的话,需要在目标服务器上搭建一个FTP站点
@echo off&setlocal EnableDelayedExpansion
::==== %1 ip %2 evn %3 jobname %4 git version
echo 开始上传ftp至应用服务器%1
//本次未修改ftp的默认端口,测试时修改了端口,不管多大的文件都上传不上去,各种配置都检查了一遍还是未解决,最后放弃了
set localPath= E:\JenkinspProduct\zip\%3\%4.zip
set ftpip=%1
set username=账号
set password=密码
set ftpPath=.\%3
Echo open %ftpip% >ftp.up
Echo %username%>>ftp.up
Echo %password%>>ftp.up
Echo mkdir %ftpPath%>>ftp.up
Echo Cd %ftpPath% >>ftp.up
Echo binary>>ftp.up
Echo put %localPath%>>ftp.up
Echo bye>>ftp.up
FTP -s:ftp.up
del ftp.up /q
del %localPath% set err=%errorlevel%
exit /b - 最后是修改IIS,因为是远程发布,所以需要用到远程执行命令工具psexec,但是该工具需要服务器开放445端口且需要开启Admin$共享(一般是默认开启),但是一般的云服务器服务商只允许在局域网内访问,公网大部分都是屏蔽的(阿里云是),所以在deploy_xxx.bat文件中最后就是 psexec \\%1 -u 管理员账号 -p 密码 -c -f %batPath%\iisweb_%2.bat %2 %3 %SVN_REVISION% -d
- 修改IIS
::====%1 evn %2 jobname %3 GIT_REVISION
::@set "sitePath=%~dp0"
::@set "sitePathDer=%~d0"
::@set "sitePath=%cd%"
//压缩包文件路径
@set "zipPath=D:\\JenkinspProduct\zip\%2\%3.zip"
//站点目录
@set "sitePath=D:\%1\%2"
//站点文件目录
@set "siteFilePath=D:\%1\%2\%3\" echo zipPath: %zipPath%
echo sitePath: %sitePath%
echo siteFilePath: %sitePathDer%
//创建站点目录
mkdir %sitePath% echo 准备解压
"C:\Program Files\WinRAR\WinRAR.exe" x -y "%zipPath%" "%sitePath%"
echo 解压完成 :更改当前目录及其所有子目录中指定文件的
@echo Access Configuration start...
cacls %siteFilePath% /t /e /g everyone:f
@echo Access Configuration finished...
echo= :应用程序池名称
@set ApplicationPool_Name="%2" :应用程序池.NETCLR版本 示例:""->无托管代码,"v4.0","v2.0"
::可以考虑设置输入参数
@set ApplicationPool_NETCLRVersion="" :IISWeb站点名称
@set WebSiteName="%2" :IIS站点端口
@set WebSitePort="8081" :启用32位应用程序;默认:false;支持 true 或者 false;
@set Enable32BitAppOnWin64="false" @echo off
echo=
@echo ---------------------------------------------------
@echo Start Deploy WebSite %WebSiteName%
echo= :新建应用程序池
@echo Create IIS ApplicationPool start...
@C:\Windows\System32\inetsrv\appcmd.exe add apppool /name:%ApplicationPool_Name% /managedRuntimeVersion:%ApplicationPool_NETCLRVersion% /Enable32BitAppOnWin64:%Enable32BitAppOnWin64%
@echo Create IIS ApplicationPool finished...
echo= :新建IIS站点
@echo Create IIS Web Site start...
@C:\Windows\System32\inetsrv\appcmd.exe add site /name:%WebSiteName% /bindings:http/*:%WebSitePort%: /applicationDefaults.applicationPool:%ApplicationPool_Name% /physicalPath:%siteFilePath%
@echo Create IIS Web Site finished...
echo= :停止IIS站点
@echo stop WebSite start...
@C:\Windows\System32\inetsrv\appcmd.exe stop site %WebSiteName%
@echo stop WebSite finished...
echo= :启动IIS站点
@echo Restart WebSite start...
@C:\Windows\System32\inetsrv\appcmd.exe start site %WebSiteName%
@echo Restart WebSite finished...
echo= @echo Finished Deploy WebSite %WebSiteName%
echo=
@echo ---------------------------------------------------
echo=
exit /b - 该脚本稍作修改即可实现多服务器发布
六、总结
项目发布工作结束了,中间也踩了很多坑,查阅资料和请教同事后也都解决了。下一步是研究如何发布到linux服务器上和使用docker的相关做法,有成果了继续分享。
jenkins+git+.net core实现自动发布的更多相关文章
- 使用jenkins 实现 .net core项目自动发布到 docker
在Docker内运行Jenkins pull镜像 docker pull jenkins/jenkins:lts Dockerfile FROM jenkins/jenkins:lts USER r ...
- Jenkins集成Docker镜像实现自动发布
1. 思路&流程 Jenkins集成Docker镜像实现自动发布与Jenkins发布mavne项目思路一样总体流程 为:Jenkins 拉去远端源码 -- gitl实现应用打包 -- jenk ...
- Jenkins持续集成(下)-Jenkins部署Asp.Net网站自动发布
环境:Windows 2008 R2.Jenkins2.235.1.Visual Studio 2017: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成S ...
- windows server 服务器安装jenkins 并通过git拉取代码实现自动发布到IIS
Jenkins是一个开源软件,可以通过一定的配置进行自动构建,测试,部署等功能. 首先,服务器应安装好 .NET Core环境和JDK, 下载Jenkins安装包 https://www.jenkin ...
- Jenkins+git+gitlab实现持续自动集成部署
1 实验环境 三台服务器 gitlab 192.168.7.139 Jenkins 192.168.7.140 java 192.168.7.141 [root ...
- jenkins 配置 gitlab webhook 实现自动发布
测试环境需要git提交代码后,Jenkins自动部署,需要gitlab配置project webhook. 1,Jenkins版本2.89 gitlab 8.11 2,Jenkins需要安装插件:G ...
- Jenkins+Git的搭建和自动部署
前言 Jenkins在工作中都使用过,之前都是运维去搭建部署,弄好了之后给我一个网址去构建项目就可以了,所以也都是一直没了解过安装过程. 今天在自己的服务器上搭建了一遍,中间有遇到很多坑,特在此归纳总 ...
- 手把手教你用Jenkins自动发布dotnet core程序
Jenkins部分 首先,我们要有个Jenkins咯,下载链接:https://jenkins.io/download/ 我们安装官网教程安装好jenkins,安装教程略.... 嗯?不是说好手把手么 ...
- Docker+Jenkins+Git发布SpringBoot应用
Doccker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之 ...
- gitlab+jenkins自动发布Python包到私有仓储
背景 有个私有仓储,地址为https://your.repo.com/pypi/ 代码存储在gitlab, 地址为https://gitlab.company.com/software.git CI为 ...
随机推荐
- nsis新插件:Aero.dll
可以使安装界面在 win7 Aero特效下非客户区透明并美化BrandingText定义的字串 下载:http://nsis.sourceforge.net/Aero_plug-in nsis交流群: ...
- Opencv环境配置及踩坑
Opencv环境配置及踩坑 1.什么是Opencv OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和[ ...
- 【Spring boot】启动过程源码分析
启动过程结论 推测web应用类型. spi的方式获取BootstrapRegistryInitializer.ApplicationContextInitializer.ApplicationCont ...
- 用 VS Code 搞Qt6:使用 PySide 6
一般来说,用C++写 Qt 应用才是正宗的,不过,为了让小学生也能体验 Qt 的开发过程,或者官方为了增加开发者人数,推出了可用 Python 来编程的 Qt 版本.此版本命名比较奇葩,叫 PySid ...
- C++面向对象编程之类模板、函数模板等一些补充
1.static数据 和 static函数: 对于 非static函数 在内存中只有一份,当类对象调用时,其实会有该对象的this pointer传进去,那个函数就知道要对那个对象进行操作: stat ...
- vulnhub靶场之JANGOW: 1.0.1
准备: 攻击机:虚拟机kali.本机win10. 靶机:JANGOW: 1.0.1,地址我这里设置的桥接,,下载地址:https://download.vulnhub.com/jangow/jango ...
- 2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
文章目录 1.maven下载 2.maven环境变量的配置 3.查看maven是否配置成功 4.配置文件的修改 5.IDEA集成maven 6.导入项目时jar包下载不成功的问题解决 maven教程: ...
- 怎样在vue中隐藏el-form-item中的值、设置输入框的值是只读
1.如何在前端vue中隐藏某一个元素(el-form-item怎样隐藏) 给每项表单项添加一个自己的id名,并用v-model绑定相对应的数据,利用v-if根据上一个表单项的数据值来进行显示或隐藏 & ...
- 测试架构师CAP原理(最简单)
测试架构师CAP原理(最简单) 很多人都不是很了解CAP理论,其实CAP很简单,不要想复杂了! C:一致性,就是数据一致性,就是数据不出错! A:可用性,就是说速度快,不延迟,无论请求成功失败都很快返 ...
- awk变量
awk变量 awk参数 参数 解释 -F 指定分割字段符 -v 定义或修改一个awk内部的变量 -f 从脚本文件中读取awk命令 对于awk而言,变量分为 内置变量 自定义变量 内置变量 解释 FS ...