一、前言

继上篇介绍jenkins过去2年多了,最近整理了一下,希望这篇能介绍到一些更实用的方法和知识。

  本次使用的jenkins版本是2.375.1、jdk 17、WinRAR、git;发布时,可以选择生产、测试并替换相应的配置文件,并做站点目录的切换。

二、搭建发布环境

安装jenkins及所需插件,本文用到的插件如下:

    1. Active Choices Plug-in:
    2. Build With Parameters
    3. Gitee Plugin
    4. Hidden Parameter plugin
    5. Pipeline
    6. Pipeline: Stage View Plugin
    7. PowerShell plugin
    8. Workspace Cleanup
    9. Persistent Parameter Plugin
    10. Credentials Binding

三、创建、配置jenkins任务

  1. 创建任务之前,先把后续可能用的凭据设置好,例如git账号、svn账号、gitee的token等信息,凭据添加方式:点击Manage Jenkins 进入到管理界面,在Security 找到Manage Credentials点击进入该功能,默认第一个列表是没有数据的
  2. 点击第二个列表的“全局”,进入到下方界面,
  3. 继续点击右上方的 Add Credentials,进入新增界面,里面默认选择Username with password,输入相应的账号密码即可。如果选择Gitee API  令牌(token)需要进入Gitee中设置私人令牌。
  4. 点击左侧菜单的新建Item,输入任务名称,选择Pipeline
  5. 点击确定后进入配置界面,勾选 This project is  parameterized (其他选项还未使用到),如下图:

  6. 对于一些敏感参数可以选择Hidden Parameter,这样在构建时就可以起到隐藏敏感信息的作用;

  7. 对于一些可能需要修改的字符串参数,可以使用String Parameter,在构建时可以根据需要进行修改,例如:项目代码的地址、需要编译的项目、解决方案名称。
  8. 对于需要选择的参数,可以选择 Choice Parameter,选项值为一个一行,设置如下:

这样在构建时就可以选择需要发布的环境。

9.对于需要根据上一个参数动态设置的参数,可以选择 Active Choices Reactive Parameter,比如选完环境后,需要根据环境设置服务器地址,就可以使用该参数,设置如下:

使用的Groovy Script

referenced parameters 填写的是引用参数的名称

四、流水线设置

这步最为重要了,先选择Pipeline script,在这里可以写构建脚本,如果对流水线语法不熟悉的可以点击下方的流水线语法,点击后会打开新的页面,里面可以根据需求去生成脚本,十分的好用。 

流水线脚本里我主要是做了这几件事:

    1. 签出代码到指定的目录下;
    2. 执行编译、打包、上传、修改iis目录和应用程序池
    3. 清理工作空间

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文件中首先是设置我们需要用的参数,例如:接收传进来的参数;设置编译产物目录、发布的版本号、脚本地址、解决方案路径等

这些基础工作做完后,就可以进行后续步骤了。

  1. .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
  2. 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
  3. 打包编译产物
    @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
  4. 编译产物上传
    //使用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
  5. 最后是修改IIS,因为是远程发布,所以需要用到远程执行命令工具psexec,但是该工具需要服务器开放445端口且需要开启Admin$共享(一般是默认开启),但是一般的云服务器服务商只允许在局域网内访问,公网大部分都是屏蔽的(阿里云是),所以在deploy_xxx.bat文件中最后就是 psexec \\%1 -u 管理员账号  -p  密码 -c -f %batPath%\iisweb_%2.bat %2 %3 %SVN_REVISION% -d
  6. 修改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
  7. 该脚本稍作修改即可实现多服务器发布

六、总结

项目发布工作结束了,中间也踩了很多坑,查阅资料和请教同事后也都解决了。下一步是研究如何发布到linux服务器上和使用docker的相关做法,有成果了继续分享。

最新文章

  1. jQuery网页版五子棋小游戏源码下载
  2. iteye上总结的编程精华资源
  3. FFmpeg-20160418-snapshot-bin
  4. MapReduce 2简介
  5. python启动服务器
  6. magento提速的一些小技巧,列举manegnto网站提速的
  7. Android 使用 Gmail 来发送邮件
  8. 【转】Pjax是什么以及为什么推荐大家用
  9. java变量、二进制、数据类型、原码、补码、反码
  10. 【mongodb系统学习之十】mongodb查询(一)
  11. 在 WinForm 中 如何实现 加载等待功能
  12. SQL连接:内连接、外连接、交叉连接。
  13. C# 导出Excel表格
  14. Python实现常用的逻辑数据结构
  15. (转)Nuts and Bolts of Applying Deep Learning
  16. 禁用loop back check
  17. springboot中报异常Whitelabel Error Page
  18. MongoDB(六):使用C#代码连接并读取MongoDB数据库
  19. Effective C++笔记(六):继承与面向对象设计
  20. [Android Studio] Android Studio中查看类的继承关系

热门文章

  1. ​打造企业自己代码规范IDEA插件(中)
  2. js动态获取当前时间(年、月、日、上午/下午、时、分、秒)
  3. Codeforces Round #710 (Div. 3)
  4. 洛谷P1656 炸铁路 (求割边)
  5. java中的栈(利用数组实现栈)
  6. 齐博x1标签之无刷新显示更多
  7. 【MySQL】Navicat15 安装
  8. 重新整理 .net core 实践篇 ———— linux上排查问题 [外篇]
  9. 创建base公共组件
  10. 加速乐逆向 cookies 参数