5

jenkins+git+.net core实现自动发布 - 祁临芯

 1 year ago
source link: https://www.cnblogs.com/bobo-pcb/p/16953791.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

       继上篇介绍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点击进入该功能,默认第一个列表是没有数据的
    514031-20221216174354084-626896119.png
  2. 点击第二个列表的“全局”,进入到下方界面,514031-20221216174550842-1181750414.png
  3. 继续点击右上方的 Add Credentials,进入新增界面,里面默认选择Username with password,输入相应的账号密码即可。如果选择Gitee API  令牌(token)需要进入Gitee中设置私人令牌。
  4. 点击左侧菜单的新建Item,输入任务名称,选择Pipeline
    514031-20221216101539064-44733252.png
  5.  点击确定后进入配置界面,勾选 This project is  parameterized (其他选项还未使用到),如下图:

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

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

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

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

使用的Groovy Script

514031-20221222173853450-1177765616.png

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

   

514031-20221216155209557-1797791624.png

 四、流水线设置

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

514031-20221216170134935-72030744.png

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

    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的相关做法,有成果了继续分享。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK