Jenkins(集群与流水线配置)

Jenkins(集群与流水线配置)

Jenkins集群

集群化构建可以提升构建效率,也可以并发在多台机器上执行构建。

安装前提:内存至少512MB、Java 17 以上、Maven环境、Git环境

配置集群步骤

配置节点菜单

新建节点

查看节点配置状态

新建完节点,点击所配置的节点,查看配置状态

配置完,在该节点的root目录,可以看到

shell 复制代码
# 可以在/root目录下,看到该文件
remoting
remoting.jar

配置并发构建

默认情况,不会并发构建,只会主节点进行构建任务。

需要在该任务构建配置,勾选并发构建配置。

勾选后,进行并发构建

配置节点的并发构建的个数

在[构建执行状态],点击每个节点名称,进行配置构建个数

配置任务只能在某节点进行构建

在该任务进行配置,

shell 复制代码
# 基本语法有:
节点标签名1 || 节点标签名1    # 只能在节点1或节点2上执行
节点标签名1 && 节点标签名1    

Pipline流水线

流水线既能作为任务的本身,也能作为Jenkinsfile。

使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。

自动化构建

主要脚本

复制代码
pipeline:整条流水线
agent:指定执行器
stages:所有阶段
stage:某一阶段,可有多个
steps:阶段内的每一步,可执行命令

流水线配置

基础框架 -基本脚本:

dockerfile 复制代码
pipeline {
    agent any  
    # agent单独配置,
    # agent {
    #     node {
    #         label "master"  # 配置节点名称,在上面的配置集群时,指定的新建节点。例:jenkins-02
    #     }  
    # }

    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码完成'
            }
        }
        stage('执行构建') {
            steps {
                echo '执行构建完成'
            }
        }
    }
    post {
        always {
            echo "完成"
        }
        failure {
            echo "失败"
        }
    }
}

注意:每次更改脚本,需要手动,点击Approve(批准)即可。

否则执行任务,会出现该异常

java 复制代码
org.jenkinsci.plugins.scriptsecurity.scripts.UnapprovedUsageException: script not yet approved for use
    ...

点击Approve(批准)即可。

安装可视化界面

blue ocean可视化流水线界面

访问,查看新的UI界面

声明式流水线

在该任务的流水线,点击流水线语法,

Git配置
dockerfile 复制代码
# 生成的脚步
git credentialsId: 'gitee', url: 'https://gitee.com/yan418/jenkins.git'
配置Maven
dockerfile 复制代码
# 可通过命令配置
# 找到所下载的代码目录,对应的pom.xml文件位置,进行maven打包
# 单行写命令,sh "mvn --version"
# 多行写命令,在 sh """ xxx  """ 结尾
stage("执行构建") {
     steps {
         sh """ 
           cd demo
           mvn clean package
          """
          echo '构建完成'
      }
}
Pre Steps(前期步骤)
dockerfile 复制代码
# 生成的脚步
sshPublisher(publishers: [sshPublisherDesc(configName: 'testserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sh cmm.sh demo', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
Post Steps(后续步骤)

页面配置,与之前页面操作配置一样,点击下方,生成脚本。

dockerfile 复制代码
# 生成的脚步
sshPublisher(publishers: [sshPublisherDesc(configName: 'testserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'nohup /usr/local/java/jdk1.8.0_202/bin/java -jar /root/cmm/demo*.jar >/root/log/demo.log 2>&1 & sleep 1', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/cmm', remoteDirectorySDF: false, removePrefix: 'demo/target', sourceFiles: '**/demo/target/demo*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
对应完整的脚步

根据上面生产的脚步,进行完整拼接,配置该任务的脚步

dockerfile 复制代码
pipeline {
    agent any  
    tools {
        maven "maven-3.6.1"  # maven-3.6.1,是在Tools里配置的Maven名称
    }
    stages {
        stage('拉取代码') {
            steps {
            	# 从git仓库,拉取代码
            	git credentialsId: 'gitee', url: 'https://gitee.com/yan418/jenkins.git'
                echo '拉取代码完成'
            }
        }
        stage('执行打包项目') {
            steps {
            	# 找到所下载的代码目录,对应的pom.xml文件位置,进行maven打包
                # 单行写命令,sh "mvn --version"
                # 多行写命令,在 sh """ xxx  """ 结尾
                sh """ 
                cd demo
                mvn clean package
                """
                echo '构建完成'
            }
        }
        stage('执行Pre Steps') {
            steps {
                # Pre Steps(前期步骤)
                sshPublisher(publishers: [sshPublisherDesc(configName: 'testserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sh cmm.sh demo', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '执行构建完成'
            }
        }
        stage('发送jar包到测试服务器') {
            steps {
            	# Post Steps(后续步骤)
            	sshPublisher(publishers: [sshPublisherDesc(configName: 'testserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'nohup /usr/local/java/jdk1.8.0_202/bin/java -jar /root/cmm/demo*.jar >/root/log/demo.log 2>&1 & sleep 1', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/cmm', remoteDirectorySDF: false, removePrefix: 'demo/target', sourceFiles: '**/demo/target/demo*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '执行构建完成'
            }
        }
    }
    post {
        always {
            echo "完成"
        }
        failure {
            echo "失败"
        }
    }
}

配置完,进行构建任务,查看流水线情况,也可以单独执行某个环节的任务重启

配置多分支Job任务

一套代码,分为test分支和master分支,通过一个Jenkins,分别发送部署到测试服务和生产服务器。

再点击-创建流水线,如果在操作过程失败,点击设置按钮,进行手动配置

配置分支源

手动配置多分支源

配置Jenkinsfile

将不同的Jenkinsfile文件,提交不同的分支上。

查看页面配置

分别单独对不同的分支的代码,进行构建。也可以在多分支JOB运行,一次构建不同分支的任务构建。