当前位置: 代码迷 >> 综合 >> 30.CICD&Jenkins
  详细解决方案

30.CICD&Jenkins

热度:26   发布时间:2024-02-20 17:31:33.0

艾编程架构课程Jenkins笔记

  • 一、DevOps
    • 1、什么是DevOps
    • 2、CICD&落地实现
  • 二、Jenkins
    • 1、安装
    • 2、使用
      • 1、参照文档使用
      • 2、远程构建访问

一、DevOps

1、什么是DevOps

Development和Operations的组合词;

在这里插入图片描述

在这里插入图片描述

DevOps: Development 和 Operations 的组合

  • DevOps 看作开发(软件工程)、技术运营和质量保障(QA)三者的交集。
  • 突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、 发布更加快捷、频繁和可靠。
  • DevOps 希望做到的是软件产品交付过程中 IT 工具链的打通,使得各个团队减少时间损 耗,更加高效地协同工作。专家们总结出了下面这个 DevOps 能力图,良好的闭环可以大大 增加整体的产出。

2、CICD&落地实现

在这里插入图片描述

1、持续集成(Continuous Integration)

持续集成是指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现 其中的错误。“持续集成”源自于极限编程(XP),是 XP 最初的 12 种实践之一。

CI 需要具备这些:

  • **全面的自动化测试。**这是实践持续集成&持续部署的基础,同时,选择合适的 自动化测试工具也极其重要;
  • 灵活的基础设施。容器,虚拟机的存在让开发人员和 QA 人员不必再大费周 折;
  • **版本控制工具。**如 Git,CVS,SVN 等;
  • 自动化的构建和软件发布流程的工具,如 Jenkins,flow.ci;
  • **反馈机制。**如构建/测试的失败,可以快速地反馈到相关负责人,以尽快解决达到一个更稳定的版本。

2、持续交付(Continuous Delivery)

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立 在高水平自动化持续集成之上。

灰度发布。

持续交付和持续集成的优点非常相似:

  • **快速发布。**能够应对业务需求,并更快地实现软件价值。
  • 编码->测试->上线->交付的频繁迭代周期缩短,同时获得迅速反馈;
  • 高质量的软件发布标准。整个交付过程标准化、可重复、可靠,
  • **整个交付过程进度可视化,**方便团队人员了解项目成熟度;
  • **更先进的团队协作方式。**从需求分析、产品的用户体验到交互 设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费。

3、持续部署(Continuous Deployment)

持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。这意味着,所有通过了一系列的自动化测试的改动都将自动部署到生产环境。它也可以被称为“Continuous Release”。

“开发人员提交代码,持续集成服务器获取代码,执行单元测试,根据测试结果决定是否部署到预演环境,如果成功部署到预演环境,进行整体*验收测试,如果测试通过,自动部署到产品环境,*全程自动化高效运转。

持续部署主要好处是,可以相对独立地部署新的功能,并能快速地收集真实用户的反馈。

“You build it, you run it”,这是 Amazon 一年可以完成 5000 万次部署, 平均每个工程师每天部署超过 50 次的核心秘籍。

在这里插入图片描述

在这里插入图片描述

一个代码敲完。整套自动化的流水线流程把应用直接上线。

jenkins主引擎+众多插件=无所不能

二、Jenkins

1、安装

docker run \-u root \-d \-p 8080:8080 \-p 50000:50000 \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \jenkinsci/blueocean#可选镜像 jenkins/jenkins:ltsdocker service create --name jenkins \
-u root \
-p 8080:8080 -p 50000:50000 \
--mount type=volume,source=jenkins-data,destination=/var/jenkins_home \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
--constraint node.role==manager \
jenkinsci/blueocean#把Jenkins调度manager。jenkins帮我们部署服务,docker service,docker stack
#jenkins是java写。docker方式安装的jenkins。jenkins容器中默认就有java环境啦
#密码
jenkinsci/blueocean 比  jenkins/jenkins:lts多了blueocean
blueocean?可视化的CICD。jenkinsfile不会写。通过可视化界面,可视化的创建流水线。
blueocean也可以自己再装。rancher;
参数化构建.....
#插件下载加速
注意:配置国内的镜像
官方下载插件慢 更新下载地址cd {
    你的Jenkins工作目录}/updates  #进入更新配置位置
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json这是直接修改的配置文件,如果前边Jenkins用sudo启动的话,那么这里的两个sed前均需要加上sudo
重启Jenkins,安装插件https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.jsonJAVA环境是好的,docker命令也是可用

使用jenkins的最佳实战。

  • 1、编写服务的jenkinsfile描述文件。成为Pipeline。流水线文件。解耦(不用我们每次手动配置jenkins的每一步做什么事情,以前都得一步一步自己配置流水线的流程。)
  • 2、jenkins只要拿到这个项目,发现了这个jenkinsfile文件,就能自动化的执行整个流程。

jenkins把项目拉倒jenkins服务器,放到workspace(一般我们的源代码都在这里),开始进行流水线处理。

自动拉取代码

  • 定时轮询
  • 远程触发,github会给我们jenkins(webhook(钩子程序))发送请求{jenkins需要公网能访问}。gitlab。
  • 手动构建(手动立即构建)

编写完–>jenkins全部流水完—>发送邮件。

发短信。

1、安装blueocean插件

2、按照官网流程,做下面实验

? 用 Maven 构建 Java 应用

用 Blue Ocean 创建流水线

2、使用

1、参照文档使用

pipeline {
    agent {
     docker 'maven:3.3.3' } #代理,stages {
      #阶段。stage('build') {
     #每一个阶段steps {
       #每一个步骤sh 'mvn --version'}}stage('test') {
    steps {
    sh 'echo success'}}}
}
#每一个流水线工程最终都在
/var/jenkins_home/workspace/流水线工程名#agent { docker 'maven:3.3.3' }
整个流水线工程
docker run -t -d -u 0:0 -w /var/jenkins_home/workspace/helloworld --volumes-from cd270036b30eada48bb123338864c1451ee8c7d30997a3b856c6d0174b1be2e2 -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** maven:3.3.3 cat
整个流水线的文件夹是在maven容器内运行的
#1、多步骤。steps{ sh ```多命令 ```}
#2、agent:jenkins接下来的流水线运行在哪个环境https://www.jenkins.io/doc/book/pipeline/syntax/#agentagent any:任意环境(立刻就能运行,不挑环境),agent none:顶级整个流水线环境,每个阶段stage,要定义自己的agent环境agent {
     label 'my-defined-label' }agent {
     node {
     label 'labelName' } } ;和agent {
     label 'labelName' }一个意思,agent {
    docker {
    image 'maven:3-alpine'label 'my-defined-label'args  '-v /tmp:/tmp'}} #指定当前流水线或者stage运行在使用docker下载来的这个环境下,用完就删了。如果这些环境有些数据需要永久保存我们就应该挂载出来。#3、环境变量,jenkins整个流水线过程中,我可以把经常要用的一些值,抽取为环境变量,在下面方便引用。environment {
    DISABLE_AUTH = 'true'DB_ENGINE    = 'sqlite'}#4、后置处理post {
    always {
    junit 'build/reports/**/*.xml'}aborted: {
    sh 'echo 666'}}
always:完成changed:阶段发生变化执行fixed:regression
Only run the steps in post if the current Pipeline’s or stage’s run’s status is failure, unstable, or aborted and the previous run was successful.aborted:手工停止failure
Only run the steps in post if the current Pipeline’s or stage’s run has a "failed" status, typically denoted by red in the web UI.success
Only run the steps in post if the current Pipeline’s or stage’s run has a "success" status, typically denoted by blue or green in the web UI.unstable
Only run the steps in post if the current Pipeline’s or stage’s run has an "unstable" status, usually caused by test failures, code violations, etc. This is typically denoted by yellow in the web UI.unsuccessful
Only run the steps in post if the current Pipeline’s or stage’s run has not a "success" status. This is typically denoted in the web UI depending on the status previously mentioned.cleanup
Run the steps in this post condition after every other post condition has been evaluated, regardless of the Pipeline or stage’s status.示例:构建失败的时候邮件通知
post {
    failure {
    mail to: 'team@example.com',subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",body: "Something is wrong with ${env.BUILD_URL}"}
}
#5、人工确认input "Does the staging environment look ok?"
#6、总结:Pipeline语法
pipeline {
    agent anystages {
    stage('第一阶段') {
    //steps {
    sh 'echo 111'emailext body: '哈哈', subject: '测试', to: '22222@qq.com'}}}
}
#所有不会写的语法,全部参照 流水线工程里面的 语法生成器。
片段生成器--》可以生产step里面不会写的内容
Declarative Directive Generator--》生成哪些指令不会用
post {
    always {
    // One or more steps need to be included within each condition's block.}aborted {// One or more steps need to be included within each condition's block.}success {
    // One or more steps need to be included within each condition's block.}failure {// One or more steps need to be included within each condition's block.}
}
    agent {
    docker {
    image 'maven:3-alpine'  #docker下载来的maven作为接下来的环境,容器用完就没了args '-v /root/.m2:/root/.m2'  #mvn从网上下载jar包。下载来的东西都挂载到linux的/root/.m2}}#默认使用docker的maven环境下载很慢。如何下载快的问题#1、改配置文件。进入linux的/root/.m2。修改settings-docker.xml#2、指定maven的配置。 2.1:先给项目里面放maven-setting.xml文件,配置好mirror,profile等。2.2:jenkins流水线,mvn -gs maven-setting.xml

2、远程构建访问

#远程的github代码提交了,jenkins流水线自动触发构建。jenkins只要公网能访问就行
#远程构建即使配置了github 的webhook,默认会403.我们应该使用用户进行授权
1、创建一个用户
2、一定随便登陆激活一次
3、生成一个apitoken
http://gitops:11d89e84d79bee5b3e0fdd852c3201697e@121.89.193.184:8080/job/simple-java-maven-app/build?token=helloworld
4、github的webhook地址如下
http://用户id:apiToken@111.229.61.54/job/simple-node-js-react-npm-app/build?token=hellojenkins
每个项目是自己的

在这里插入图片描述

远程触发: JENKINS_URL/job/simple-java-maven-app/build?token=TOKEN_NAME 请求即可

动态变量参照

http://121.89.193.184:8080/job/icoding-java-custom-jenkins/pipeline-syntax/globals