zoukankan      html  css  js  c++  java
  • 最简单的window下使用Jenkins来做自动化部署的教程

    这里有个重点:

    要修改Jenkins服务的默认登录账号名称

    否则ps脚本跑起来有异常

    今天我们来说一下,如何使用Jenkins+powershell脚本,将我们的.NET CORE的脚本部署到对应的服务器上.

    这里我们使用的源码管理工具是TFS.虽然源码管理器比较老旧,但是原理都差不多.

    1.安装Jre,因为我们的Jenkins是基于java开发的,所以需要先在服务器上安装java的运行时环境

    这个安装过程比较简单,百度下载JRE,然后安装,暂且不表.

    下载地址:https://www.java.com/en/download/manual.jsp

    2.下载并安装Jenkins,这里服务器是Windows的,所以最好下载Windows版本的,安装好以后直接就以Windows服务的形式运行了.

    这个安装过程也是非常的简单,网上教程很多.

    https://jenkins.io/download/

    3.安装好Jenkins以后,根据需要我们安装权限插件,给不用的账号配置不通过的权限,(此步骤可选)

    具体可参看此文章,说的很详细:

    https://blog.csdn.net/qq_16320025/article/details/82897577

    4.最关键的一步来了,就是如何使用Jenkins来自动部署我们的代码.

    这里主要分以下几个小点,下面我会贴出详细的代码.

    1)获取TFS中的最新源码,这里我并没有通过Jenkins去获取代码,而是通过tf命令去拉取代码的.

    这样的好处就是,所有的Jenkins任务的源代码,我都可以使用同一份,而不用每个任务单独去拉取一份代码.

    2)拉取到代码以后,自然就是通过命令来编译我们的代码,熟悉.net的朋友们应该都知道,无非就那几个命令了

    3)代码发布出来以后,自然就是要将代码copy到我们的站点或者Windows服务下面去.

    这一步也很简单,无非就是通过命令停止iis站点和应用程序池;copy代码;重启启动对应的站点即可

    一套下来,打完收工.

    下面贴出几个关键步骤的截图:

    1.Jenkins创建自由风格的任务

    2.其他什么都可以不选,只要我们使用powershell脚本,需要Jenkins支持powershell也需要安装插件

    可参看如下链接:https://blog.csdn.net/ff55fff/article/details/76804966

     3.点击保存,一套搞定.点击build now即可

    ps:下面给出详细的powershell脚本,非常简单这里就不详述了,大家一看代码就明白了

     1 net stop Test1Job
     2 
     3 C:WindowsSystem32inetsrvappcmd.exe stop site Test1.test.com
     4 C:WindowsSystem32inetsrvappcmd.exe stop site Test1.api.test.com
     5 
     6 
     7 C:WindowsSystem32inetsrvappcmd.exe stop apppool /apppool.name:"test1.test.com"
     8 C:WindowsSystem32inetsrvappcmd.exe stop apppool /apppool.name:"Test1.api.test.com"
     9 
    10 dir "$PSScriptRootlib" -Filter "*.ps1" | foreach {
    11  . $_.fullName
    12  Write-Host "Import $($_.fullName)"
    13 }
    14 
    15 
    16 
    17 
    18 #1.获取源码
    19 D:	est	oolsget_tfs.bat
    20 
    21 #2.编译源码
    22 dotnet build D:	estSourceMToolsSource-PromotionTest.API.csproj -nowarn:msb3202,nu1503,cs1591 #--no-restore
    23 echo API OK
    24 
    25 dotnet build D:	estSourceMToolsSource-PromotionTest.Web.csproj -nowarn:msb3202,nu1503,cs1591 #--no-restore
    26 echo WEB OK
    27 
    28 dotnet build D:	estSourceMToolsSource-PromotionTest.Job.WindowsService.csproj -nowarn:msb3202,nu1503,cs1591 #--no-restore  -v q
    29 echo job OK
    30 
    31 
    32 Sleep 20
    33 
    34 
    35 #3.发布
    36 
    37 CCopy D:	estSourceMToolsTest.Source-PromotionTest.APIinDebug
    etcoreapp2.1 D:TestTest1api
    38 CCopy D:	estSourceMToolsTest.Source-PromotionTest.WebinDebug
    etcoreapp2.1 D:TestTest1web
    39 CCopy D:	estSourceMToolsTest.Source-PromotionTest.Webwwwroot D:TestTest1webwwwroot
    40 CCopy D:	estSourceMToolsTest.Source-PromotionTest.Job.WindowsServiceinDebug
    etcoreapp2.1win-x64 D:TestTest1job
    41 
    42 
    43 
    44 net start Test1Job
    45 C:WindowsSystem32inetsrvappcmd.exe start site Test1.test.com
    46 C:WindowsSystem32inetsrvappcmd.exe start site Test1.api.test.com
    47 
    48 
    49 C:WindowsSystem32inetsrvappcmd.exe start apppool /apppool.name:"test1.test.com"
    50 C:WindowsSystem32inetsrvappcmd.exe start apppool /apppool.name:"Test1.api.test.com"
    51 
    52 
    53 Write-Host "success"
    54 Get-Date
    View Code
     1 function  CCopy($folder_a_path,$folder_b_path)
     2 {
     3     if(!(test-path $folder_b_path))
     4     {
     5         md $folder_b_path
     6     }
     7 
     8     #遍历源文件夹下所有文件
     9     $folders_a = gci $folder_a_path -Recurse
    10     foreach ($folder_a in $folders_a)
    11     {
    12     
    13      if($folder_a.fullname -like "*appsettings.json*")
    14      {
    15         continue
    16      }
    17     
    18       #通过替换的方式,取目标文件的全路径名称
    19       $b = $folder_a.fullname.replace($folder_a_path,$folder_b_path) 
    20       #判断目标文件是否存在,如果存在则先判断新旧
    21       If (test-path $b)
    22         {
    23          #判断目标是否为目录,如果是目录则跳过,如果不跳过,则会创建一级空目录
    24          If (!((gi $b).PSIsContainer))
    25           {
    26            #判断目标文件、源文件的新旧情况,如果目标已存在文件的修改时间早于源文件,则重新拷贝覆盖
    27            If ((gci $b).lastwritetime -lt $folder_a.lastwritetime)
    28             {
    29              copy-item $folder_a.fullname $b -force
    30             }
    31           }
    32         
    33         }
    34       #如果目标文件不存在,则直接拷贝
    35       Else
    36         {
    37          copy-item $folder_a.fullname $b
    38         }
    39         
    40     }
    41 }
    复制文件

    一套打完手工,大家有什么意见和建议,请提出~

    后续将进一步写通过powershell将程序发布到其他服务器上,以及发布完成以后,邮件告知结果

    "D:Program Files (x86)Microsoft Visual Studio2019EnterpriseCommon7IDECommonExtensionsMicrosoftTeamFoundationTeam ExplorerTF.exe" workspaces /collection:http://tfs.xx.net:8080/tfs/xxerp  /login:leishen,pwd
    
    "D:Program Files (x86)Microsoft Visual Studio2019EnterpriseCommon7IDECommonExtensionsMicrosoftTeamFoundationTeam ExplorerTF.exe" get  /recursive $/MTools /login:leishen,pwd
    TFS获取代码

    待续...

  • 相关阅读:
    时间单位转化
    快速排序算法
    用virtualenv建立Python独立开发环境
    Shell正则表达式之grep、sed、awk实操笔记
    Objective-C 30分钟入门教程
    base64加密后字符串长度
    error: synthesized property 'name' must either be named the same as a compatible instance variable or must explicitly name an instance variable问题解决
    Ubuntu系统下通过Clang编译器编写Objective-C
    MongoDB 聚合Group(二)
    MongoDB聚合(单一用途的聚合方法)
  • 原文地址:https://www.cnblogs.com/xinzhyu/p/10924311.html
Copyright © 2011-2022 走看看