Jenkins

Jenkins是基于Java开发的一种持续集成工具。

Jenkins功能包括:

  1. 持续的软件版本发布/测试项目。
  2. 监控外部调用执行的工作。

安装jenkins

在linux上使用docker进行安装,代码如下

docker pull jenkinsci/blueocean

或直接执行下边代码安装并运行

docker run \
  -u root \
  --rm \关闭时自动删除Docker容器
  -d \后台运行容器,避免在终端窗口中输出正在运行的此容器的Docker日志
  -p 8080:8080 \主机端口:容器端口
  -p 50000:50000 \基于JNLP的Jenkins代理默认通过TCP端口50000与Jenkins主机通信
  -v jenkins-data:/var/jenkins_home \将容器中的目录映射到Docker 卷jenkins-data
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean
docker run \
  -u root \
  --rm \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

使用该docker exec 命令通过终端/命令提示符访问 容器

docker exec -it jenkins-blueocean bash

其中的Jenkins-blueocean是改好的容器名,docker改名命令如下:

docker rename OLDNAME NEWNAME

运用war包进行安装

  1. 将最新的稳定Jenkins WAR文件下载 到计算机上的相应目录中。
  2. 打开下载目录的终端/命令提示符窗口。
  3. 运行命令java -jar jenkins.war。
  4. 浏览http://localhost:8080并等待Unlock Jenkins页面出现。
  5. 继续下面的安装后设置向导。

注意:此过程不会自动安装Blue Ocean功能,需要通过Jenkins中的Manage Jenkins > Manage Plugins页面单独安装

使用Maven构建Java应用程序

在Docker中运行Jenkins

linux上

docker run \
  --rm \
  -u root \
  -p 8080:8080 \
  -v jenkins-data:/var/jenkins_home \ 使用名称 /var/jenkins_home将容器中的目录映射到Docker 卷jenkins-data。如果此卷不存在,则此docker run命令将自动为您创建卷
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v "$HOME":/home \ $HOME将主机(即本地)计算机上的/Users/<your-username>目录(通常是目录)映射到/home容器中的目录。
  jenkinsci/blueocean
docker run \
  --rm \
  -u root \
  -p 8080:8080 \
  -v jenkins-data:/var/jenkins_home \ 
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v "$HOME":/home \ 
  jenkinsci/blueocean

windows上

docker run ^
  --rm ^
  -u root ^
  -p 8080:8080 ^
  -v jenkins-data:/var/jenkins_home ^
  -v /var/run/docker.sock:/var/run/docker.sock ^
  -v "%HOMEPATH%":/home ^
  jenkinsci/blueocean

访问Jenkins/Blue Ocean Docker容器

docker exec -it jenkins-tutorials bash

Jenkins Pipline

声明性管道Declarative

Jenkinsfile(声明性管道)
pipeline {
    agent any 	# 在任何可用的代理上执行此管道或其任何阶段
    stages {
        stage('Build') { # 定义“构建”阶段。
            steps {
                // 执行与“构建”阶段相关的一些步骤。
            }
        }
        stage('Test') { #“测试”阶段
            steps {
                // 
            }
        }
        stage('Deploy') {   #部署阶段
            steps {
                // 
            }
        }
    }
}

脚本管道基础

# 以下内容我也看不懂是啥了
在Scripted Pipeline语法中,一个或多个node块在整个管道中执行核心工作。虽然这不是Scripted Pipeline语法的强制要求,但将Pipeline的工作限制在node 块内部有两个作用:

1. 通过向Jenkins队列添加项目来计划要运行的块中包含的步骤。只要执行程序在节点上空闲,步骤就会运行。

2. 创建工作空间(特定于该特定管道的目录),可以对从源控件检出的文件执行工作。
警告:根据您的Jenkins配置,某些工作空间可能会在一段时间不活动后自动清除。有关详细信息,请参阅JENKINS-2111链接的门票和讨论 。

三个阶段: build阶段:汇编、编译、打包源码的阶段

使用Jenkins文件

字符串插值

两种方式插入字符串:

def singlyQuoted = 'Hello'
def doublyQuoted = "World"

只有后一个字符串才支持基于dollar-sign($)的字符串插值,例如:

def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"

显示结果:
Hello Mr. ${username}
I said, Hello Mr. Jenkins

并行

stage('Build') {
    /* .. snip .. */
}

stage('Test') {
    parallel linux: {
        node('linux') {
            checkout scm
            try {
                unstash 'app'
                sh 'make check'
            }
            finally {
                junit '**/target/*.xml'
            }
        }
    },
    windows: {
        node('windows') {
            /* .. snip .. */
        }
    }
}

pipeline 大汇总

pipeline {
    agent any
    environment{
        QJBL = '这个变量是全局的,整个stages都能用'
    }
    parameters {   //加入parameters之后jenkins中立即构建变为了build
        string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
        booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') 
    }
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('工作环境') {
            steps {
                echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
            }
        }
        stage('验证参数') {
            steps {
                echo "${params.Greeting} World!"
            }
        }
        stage('building阶段名') {
            environment{
                username = 'Mark'
            }
            steps {
                echo "This is ${username}"
            }
        }
        stage('Testing阶段名') {
            steps {
                echo 'Testing'
                sh 'cd /root'
                sh 'ls'    //这里显示的时/root/.jenkins/workspace/项目名 里的内容。每次只执行sh的目录都在这里,因此需要我这里均使用了绝对路径或者
                sh 'pwd'
                sh 'cd /data/zzh && cp -r pipeline_test01/ pipeline_test02'
            }
        }
        stage('Deploying部署阶段') {
            if (currentBuild.result == null || currentBuild.result == 'SUCCESS') { 
            echo 'Deploying'
        }
        }
    }
    
    post{
        always {
           //运行,无论Pipeline运行的完成状态如何。 
        }
        等等···
    }
}

各个小的模块,具体在pipeline总的位置,见下图

post

post{
        always {
           //运行,无论Pipeline运行的完成状态如何。 
        }
        changed {
            //只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行。
        }
        failure {
            //仅当当前Pipeline处于“失败”状态时才运行,通常在Web UI中用红色指示表示。
        }
        success {
            //仅当当前Pipeline具有“成功”状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。
        }
        unstable {
            //只有当前Pipeline具有“不稳定”状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。
        }
        aborted {
            //只有当前Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。
        }
    }

option

options {
        timeout(time: 1, unit: 'HOURS') 
    }
    
    buildDiscarder(logRotator(numToKeepStr: '1'))
    // 持久化工件和控制台输出,用于最近Pipeline运行的具体数量。 
    
    disableConcurrentBuilds()
    // 不允许并行执行Pipeline。可用于防止同时访问共享资源等
    
    skipDefaultCheckout()
    // 在agent指令中默认跳过来自源代码控制的代码
    
    skipStagesAfterUnstable()
    // 一旦构建状态进入了“不稳定”状态,就跳过阶段
    
    timeout(time: 1, unit: 'HOURS')
    // 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline
    
    retry(3)
    // 失败后,重试整个Pipeline指定的次数
    
    timestamps()
    // 预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间

触发器

triggers {
        cron('H 4/* 0 0 1-5')
    }
triggers {
        pollSCM('H 4/* 0 0 1-5')
    }

工具

支持的工具有maven、jdk、gradle

tools{
    maven 'apache-maven-3.0.1'
}

when

stage('Example Deploy') {
            when {
                branch 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
        
还有:
    branch 'master'
    // 当正在构建的分支与给出的分支模式匹配时执行阶段。请注意,这仅适用于多分支Pipeline。
    
    environment name: 'DEPLOY_TO', value: 'production'
    // 当指定的环境变量设置为给定值时执行阶段
    
    expression { return params.DEBUG_BUILD } 
    // 当指定的Groovy表达式求值为true时执行阶段
    
    not { branch 'master' }
    // 嵌套条件为false时执行阶段。必须包含一个条件
    
    allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } 
    // 当所有嵌套条件都为真时,执行舞台。必须至少包含一个条件
    
    anyOf { branch 'master'; branch 'staging' }
    // 当至少一个嵌套条件为真时执行舞台。必须至少包含一个条件