通过Jenkins在IIS上布署站点

当需要在多台服务器的IIS上布署站点时,如果纯粹靠人工手动完成此任务的话,过于低效,而借助Jenkins之类的自动化工具,则可以极大提升工作效率。

以下便是Jenkins Pipeline所使用的脚本,它的DSL语法基于groovy,稍微学习一下的话,便能很快上手。在写这段脚本的时候,主要的难点是对是否已存在站点的判断。因为当执行appcmd list site /name:MyNewSite命令时,若是没有找到此站点,命令会返回非零的结果。而当Jenkins得到的是非零结果时,会认为是异常,将会停止整个脚本的运行。解决的办法是把bat方法中的可选参数returnStatus设置为true,这样做既能得到执行结果,又能让Jenkins正常地继续运行脚本。得到的执行结果若是零,说明该站点已经存在,可以先停掉它,复制完相关代码后再次启动;若是非零值,说明该站点不存在,可以执行一系列的建站操作。

pipeline {
    agent any
    stages {
        stage("Deploy web application") {
            steps {
                script {
                    def websiteFolder = 'C:\\publish\\MyNewSite'
                
                    // 文件夹不存在的话就先创建它
                    if (!fileExists(websiteFolder)) {
                        bat 'mkdir -p ' + websiteFolder
                    }

                    def appcmd = 'C:\\Windows\\System32\\inetsrv\\appcmd.exe '
                    
                    // 判断是否已布署过该站点
                    def result = bat(returnStatus: true, script: appcmd + 'list site /name:"MyNewSite"')
                    if (result == 0) {
                        // 站点与应用程序池先停掉
                        appcmd + 'stop apppool /apppool.name:MyNewSite'
                        appcmd + 'stop site /site.name:MyNewSite'

                        // 复制需要发布的文件到websiteFolder目录下

                        // 站点与应用程序池重新启动
                        appcmd + 'start apppool /apppool.name:MyNewSite'
                        appcmd + 'start site /site.name:MyNewSite'                        
                    } else {
                        // 复制需要发布的文件到websiteFolder目录下            
            
                        // 未布署该站点场景,先创建站点并绑过端口号,以及物理路径
                        bat appcmd + 'add site /name:MyNewSite /bindings:"http/*:81:" /physicalPath:' + websiteFolder
                        // 再创建新的应用程序池,可以同时设置托管运行时的版本
                        bat appcmd + 'add apppool /name:MyNewSite /managedRuntimeVersion:v4.0'
                        // 将站点中应用程序所关联的应用程序池设置为新建的应用程序池
                        bat appcmd + 'set app /app.name:"MyNewSite/" /applicationPool:MyNewSite'
                    }                    
                }
            }
        }
    }
}

相关资料:
Jenkins Pipeline
fileExists
Windows Batch Script
AppCmd

posted @ 2018-06-03 23:31  Ken.W  阅读(1119)  评论(0编辑  收藏  举报