jenkins从入门到精通

第一章 认识Jenkins

1.1 Jenkins简介

jenkins是一个自动化服务器,目前发展超过15年,比较成熟的CI根据(也可以是CD)能够实现自动化集成发布。建立好流水线后,期间无需专业运维人员介入,开发人员随时发布部署。

1.2 部署应用场景

1、集成svn/git客户端实现源代码下载检查
2、集成maven/ant/gradle/npm等构建工具实现源码编译打包单元测试
3、集成sonarqube对源代码进行质量检查
4、集成Jmeter/Soar/Kubernetes
5、可以自定义插件或者脚本通过jenkins传参运行

第二章 安装Jenkins

2.1 基于Linux系统部署(推荐)

安装依赖
sudo apt install openjdk-11-jdk

下载
wget https://mirrors.jenkins.io/debian/jenkins_2.363_all.deb
安装
dpkg -i jenkins_2.361.3_all.deb 
查看启动状态
service jenkins status
查看登录密码
cat /var/lib/jenkins/secrets/initialAdminPassword

2.2 安装后配置

2.2.1 加速插件下载速度

1 页面更改为国内地址
>进入 Manage Jenkins -》 Manage Plugin -> Advanced 最下面有 Update Site,设置为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 或者 http://mirror.xmission.com/jenkins/updates/update-center.json
![](https://devopstack.cn/wp-content/uploads/2022/11/1797195d1a72d85a4ad51b2a7aac3c68.png)

2 修改服务器配置

sed -i 's/updates.jenkins.io\/download/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json
sed -i 's/www.google.com/www.baidu.com/g' /var/lib/jenkins/updates/default.json

2.2.2 安装中文插件

安装中文插件

jenkins从入门到精通

设置默认语言为中文

2.2.3 邮件配置及触发报警邮件

https://devopstack.cn/devops/883.html

第三章 JenkinsPipeline

3.1 Pipeline定义

Pipeline是通过Jenkinsfile描述的流水线,安装声明式插件Pipeline:Declarative
Jenkensfile的组成:
    指定node节点/workspace
    指定运行选项
    指定stages阶段
    指定构建后操作

3.2 Pipeline语法

3.2.1 agent指定node节点/workspace

可选参数:
any表示任何可用的节点上执行pipeline
none为agent的默认值
label表示在指定节点上运行
node表示允许额外的选项

agent {
    node {
        label "master" // 指定运行节点的标签或名称
        customWorkspace "${workspace}" // 指定运行的工作目录(可选)
    }
}

3.2.2 options指定运行选项

options指令允许从流水线内部配置特定的流水线选项,也可以由插件提供:

buildDiscarder:为最近的流水线运行的特定数量保存组件和控制台输出
disableConcurrentBuilds:不允许同时执行流水线,可防止同时访问共享资源
overriderIndexTriggers:允许覆盖分支索引触发器的默认处理
timeout:设置超时时间
retry:失败后重新尝试的次数
skipStagesAfterUnstable:一旦构建状态变为UNSTABLE,就跳过该阶段
options {
    timestamps() // 在日志中打印时间
    skipDefaultCheckout() // 删除隐式的checkout scm 语句
    disableCouncurrentBuilds() // 禁止并行
    timeout(time:1, unit:'HOURS') // 流水线超时设置为1H
}

3.2.3 stages指定stages阶段

包含了一个或多个stage指令,用于连接交付过程中每个离散的部分
stages{
    stage("PullCode") { // 阶段名称
        steps { // 步骤
            timeout(time:5, unit:'MINUTES') { // 指定步骤的超时时间
                script { // 指定运行的脚本
                    println("获取代码")
                }
            }
        }
    }
    stage("Build") { // 阶段名称
        steps { // 步骤
            timeout(time:20, unit:'MINUTES') { // 指定步骤的超时时间
                script { // 指定运行的脚本
                    println("应用打包")
                }
            }
        }
    }
    stage("CodeScan") { // 阶段名称
        steps { // 步骤
            timeout(time:30, unit:'MINUTES') { // 指定步骤的超时时间
                script { // 指定运行的脚本
                    println("代码扫描")
                }
            }
        }
    }
}

3.2.4 post指定构建后操作

post-condition块:

always{}:总是执行
success{}:成功后执行
failure{}:失败后执行
aborted{}:取消后执行
changed{}:当流水线或阶段完成状态和之前不同时执行
unstable{}:当流水线或阶段状态为unstable时执行
post {
    always {
        println("总是执行")
    }
    success {
        script {
            // currentBuild是一个全局变量
            // description是构建描述
            currentBuild.description += "\n 构建成功!"
        }
    }
    failure {
        script {
            currentBuild.description += "\n 构建失败!"
        }
    }
    aborted {
        script {
            currentBuild.description += "\n 构建取消!"
        }
    }
}

3.2.5 enviroment环境变量

用于指定一个键值对序列,用于定义所有/特定阶段步骤的环境变量,取决于environment定义的位置。支持credentials()方法,用于通过标识符访问jenkins预定义的凭证。相当于定义一个变量,可以在后续使用

pipeline {
    agent any
    enviroment {
        CC = 'clang'
    }
    stages {
        stage("example") {
            enviroment {
                ACC_KEY = credentails("my-secret-text")
            }
            steps {
                sh 'printenv'
            }
        }
    }
}

3.2.6 parameter参数

为流水线运行时设置项目相关的参数

parameters {
    string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')
    booleanParam(name: 'DEBUG_BUILD', defaultValue: true, descrptio: '')
}

3.2.7 trigger触发器

构建触发器:

cron计划任务定期执行构建:triggers{cron('H */4 * * 1-5')}
pollSCM与cron类型,由jenkins定期检测源码变化:triggers{pollSCM('H */4 * * 1-5')}
upstream接受都好分割的工作字符串和阈值,当字符串中任何作业以最小阈值结束时,流水线被重新触发.
triggers { upstream(upstreamProjects: 'job1,job2',threshold: hudson.model.Result.SUCCESS)}

3.2.8 input人工确认

input由人工确认是否继续进行

message:呈现给用户的提示信息
id可选默认为stage名称
ok默认表单的ok文本
submitter:可选,逗号分隔的用户列表或允许提交的外部组名,默认允许任何用户
parameter:提示提交者提供一个可选的参数列表
pipeline {
    agent any

    stages {
        stage('SayHello') {
            input {
                message "Should we continue"
                ok "Yes, we should"
                submitter "xd1998"
                parameters {
                    string(name: "PERSON", defaultValue: "JXD", description: "Who are you?")
                }
            }
            steps {
                echo "Hello ${PERSON}"
            }
        }
    }
}

3.2.9 when语法

放置在stage中,条件为true,stage执行。

branch:构建的分支和给定的分支匹配则执行,适用于多分支流水线:when {branch 'master'}
environment:指定环境变量是给定值执行:when {environment name: 'DEPLOY_TO', value:'prooduction'}
expression:当指定的Groovy表达式评估为true时才执行:when {expression {return params.DEBUG_BUILD}}

when语法根据参数值跳过执行的阶段

not:当嵌套条件为false时执行:when {not {branch 'master'}}
allOf:当所有嵌套条件都为true才执行:when {allOf {branch 'master'; environment name: 'DEPLOY_TO, value: 'production}}
anyOf:当至少有一个嵌套条件为true时执行

3.2.10 parallel

声明式流水线的阶段可以在他们内部声明多隔嵌套阶段, 它们将并行执行。 注意,一个阶段必须只有一个 steps 或 parallel的阶段。 嵌套阶段本身不能包含 进一步的 parallel 阶段, 但是其他的阶段的行为与任何其他 stageparallel的阶段不能包含 agent 或 tools阶段, 因为他们没有相关 steps。

另外, 通过添加 failFast true 到包含parallel的 stage中, 当其中一个进程失败时,你可以强制所有的 parallel 阶段都被终止。

示例:

pipeline {
    agent any
    stages {
        stage('Non-Parallel Stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
        stage('Parallel Stage') {
            when {
                branch 'master'
            }
            failFast true #第一个失败,都会失败。
            parallel {
                stage('Branch A') {
                    agent {
                        label "for-branch-a"
                    }
                    steps {
                        echo "On Branch A"
                    }
                }
                stage('Branch B') {
                    agent {
                        label "for-branch-b"
                    }
                    steps {
                        echo "On Branch B"
                    }
                }
            }
        }
    }
}

3.2.11 step步骤script

script 步骤需要 [scripted-pipeline]块并在声明式流水线中执行。对于大多数用例来说,应该声明式流水线中的“脚本”步骤是不必要的,但是它可以提供一个有用的”逃生出口”。非平凡的规模和/或复杂性的script块应该被转移到 共享库 。

示例:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'

                script {
                    def browsers = ['chrome', 'firefox']
                    for (int i = 0; i < browsers.size(); ++i) {
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}

第四章 Jenkins Share Library

Jenkins工具集成

4-1 构建工具集成
    4-1-1 集成maven
    4-1-2 集成ant
    4-1-3 集成gradle
    4-1-4 集成npm
4-2 Ldap用户认证集成
    4-2-1 安装Ldap服务
    4-2-2 安装Ldap控制台
    4-2-3 配置Ldap服务
    4-2-4 创建OU组织用户数据
    4-2-5 Jenkins集成Ldap
4-3 Gitlab集成
    4-3-1 Jenkins集成Gitlab SSO单点登录
    4-3-2 WebHook集成
4-4 Jenkins集成SaltStack批量自动化发布
4-5 Jenkins制品库集成-Nexus
4-6 Jenkins集成禅道
4-7 Jenkins集成制品库-Artifactory
4-8 Jenkins集成SonarQube

第六章 Jenkins流水线实践

6-1 前端静态资源发布流水线
6-2 NodeJs项目发布流水线
6-3 Dotnet项目发布流水线
6-4 JAVA-Springboot项目发布流水线
6-5 Golang项目发布流水线
6-6 移动端Android项目发布流水线
    6-6-1 搭建Android打包环境(Centos)
    6-6-2 手动发布Android项目
    6-6-3 Jenkins发布流水线(Fir|蒲公英)
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: