zoukankan      html  css  js  c++  java
  • Jenkins的流水线

    什么是Jenkins的流水线

    Jenkins 流水线 (或简单的带有大写"P"的"Pipeline") 是一套插件,它支持实现和集成持续交付流水线 到Jenkins。

    (CD) pipeline_是你的进程的自动表达,用于从版本控制向用户和客户获取软件。 你的软件的每次的变更 (在源代码控制中提交)在它被释放的路上都经历了一个复杂的过程 on its way to being released. 这个过程包括以一种可靠并可重复的方式构建软件, 以及通过多个测试和部署阶段来开发构建好的软件 (c成为 "build") 。

    流水线提供了一组可扩展的工具,通过 Pipeline domain-specific language (DSL) syntax. [1]对从简单到复杂的交付流水线 "作为代码" 进行建模。

    对Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile),该文件可以被提交到项目的源代码的控制仓库。 [2] 这是"流水线即代码"的基础; 将CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。 创建 Jenkinsfile并提交它到源代码控制中提供了一些即时的好处:

    • 自动地为所有分支创建流水线构建过程并拉取请求。
    • 在流水线上代码复查/迭代 (以及剩余的源代码)。
    • 对流水线进行审计跟踪。
    • 该流水线的真正的源代码 [3], 可以被项目的多个成员查看和编辑。

    While定义流水线的语法, 无论是在 web UI 还是在 Jenkinsfile 中都是相同的, 通常认为在Jenkinsfile 中定义并检查源代码控制是最佳实践

    声明式和脚本化的流水线语法

    Jenkinsfile 能使用两种语法进行编写 - 声明式和脚本化。
    声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:

    • 相比脚本化的流水线语法,它提供更丰富的语法特性,
    • 是为了使编写和读取流水线代码更容易而设计的

    然而,写到Jenkinsfile中的许多单独的语法组件(或者 "步骤"), 通常都是声明式和脚本化相结合的流水线。 在下面的 [pipeline-concepts] 和 [pipeline-syntax-overview] 了解更多这两种语法的不同。

    Why Pipeline?

    本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 流水线向Jenkins中添加了一组强大的工具, 支持用例 简单的持续集成到全面的CD流水线。通过对一系列的相关任务进行建模, 用户可以利用流水线的很多特性

    • Code: 流水线是在代码中实现的,通常会检查到源代码控制, 使团队有编辑, 审查和迭代他们的交付流水线的能力。
    • Durable: 流水线可以从Jenkins的主分支的计划内和计划外的重启中存活下来。
    • Pausable: 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线。
    • Versatile: 流水线支持复杂的现实世界的 CD 需求, 包括fork/join, 循环, 并行执行工作的能力。
    • Extensible:流水线插件支持扩展到它的DSL [1]的惯例和与其他插件集成的多个选项。

    然而, Jenkins一直允许以将自由式工作链接到一起的初级形式来执行顺序任务, [4] 流水线使这个概念成为了Jenkins的头等公民。

    构建一个的可扩展的核心Jenkins值, 流水线也可以通过 Pipeline Shared Libraries 的用户和插件开发人员来扩展。 [5]

    下面的流程图是一个 CD 场景的示例,在Jenkins中很容易对该场景进行建模

    image

    流水线概念

    下面的概念是Jenkins流水线很关键的一方面 , 它与流水线语法紧密相连 (参考 overview below).

    流水线

    流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。

    另外 , pipeline 块是 声明式流水线语法的关键部分.

    节点

    节点是一个机器 ,它是Jenkins环境的一部分 and is capable of执行流水线。
    另外, node块是 脚本化流水线语法的关键部分

    阶段

    stage 块定义了在整个流水线的执行任务的概念性地不同的的子集

    jenkins创建Pipeline项目

    本次环境为:

    主机名 IP地址 安装的应用 系统版本
    jenkins 192.168.23.143 tomcat jenkins CentOS 8
    客户机 192.168.23.144 tomcat jenkins CentOS 8

    安装Pipeline、Publish Over SSH、Publish Over SSH、SSH Build Agents、Git、GitHub、GitLab、Gitee插件
    image

    • Gitee配置公钥
    [root@jenkins ~]# ssh-keygen -t rsa -b 2048 -C "yanchuanglol@163.com" -N "" -f /root/.ssh/id_rsa
    Generating public/private rsa key pair.
    Created directory '/root/.ssh'.
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:MtYf5/dFCJuwZ37E4sO3as6b5r0i3xbdoArF1ABiQv8 qinghao_yu@163.com
    The key's randomart image is:
    +---[RSA 2048]----+
    |   .o o ...o     |
    |     + .  . .    |
    |      .  o. .    |
    |       o  oo =.. |
    |      + E.o B.+oo|
    |     . o.. X.o..o|
    |         ...* +..|
    |          o.+O.o.|
    |           BO==..|
    +----[SHA256]-----+
    
    • 登录Gitee然后将公钥复制进去
      image

    • 添加私钥

    [root@jenkins ~]# cat /root/.ssh/id_rsa
    -----BEGIN OPENSSH PRIVATE KEY-----
    ······
    DVnODEbPs8q/FQM09wp8Cjk5ephdqdkyiUIyQPAAAAAwEAAQAAAQEAttAv7CgVzBpdYyyN
    O0Lkzo0W/vmEtkI+O7kThleV9OBao8usZShckZyprJp0S376JG9W/ipG2FvF583ipR+Ulf
    sEFD14o8OhoGa2E82WIr+sVjKM0tlJh0ncJGqd9aFAk23LEDcAAACBAN+sdj81xrcRXWob
    EfqJGeXHHtiHgrtFBIzGnduthLCUJn97IrnSV0Tj+0AE6o1CKrko4ZuOFjMuGpFfN62sjC
    yw8w1MVMG7xAfkvJiRDbetPeRa8mfMXTKiBPi5Bx8NDW9ctXSDomv8ChP25b7CEh71imLk
    ......
    -----END OPENSSH PRIVATE KEY-----
    

    创建一个项目

    image

    image

    image

    image

    image

    image

    image

    image

    image

    //在本地查看拉取下来的代码
    [root@jenkins ~]# cd .jenkins/
    [root@jenkins .jenkins]# ls
    com.dabsquared.gitlabjenkins.connection.GitLabConnectionConfig.xml
    com.dabsquared.gitlabjenkins.GitLabPushTrigger.xml
    com.gitee.jenkins.connection.GiteeConnectionConfig.xml
    com.gitee.jenkins.trigger.GiteePushTrigger.xml
    config.xml
    hudson.model.UpdateCenter.xml
    hudson.plugins.git.GitTool.xml
    identity.key.enc
    jenkins.install.InstallUtil.lastExecVersion
    jenkins.install.UpgradeWizard.state
    jenkins.model.JenkinsLocationConfiguration.xml
    jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml
    jenkins.security.QueueItemAuthenticatorConfiguration.xml
    jenkins.security.UpdateSiteWarningsConfiguration.xml
    jenkins.telemetry.Correlator.xml
    jobs
    logs
    nodeMonitors.xml
    nodes
    org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml
    plugins
    queue.xml
    queue.xml.bak
    secret.key
    secret.key.not-so-secret
    secrets
    updates
    userContent
    users
    workflow-libs
    workspace
    [root@jenkins .jenkins]# cd workspace/
    [root@jenkins workspace]# ls
    tomcat_demo
    [root@jenkins workspace]# ls tomcat_demo/
    db  Dockerfile  LICENSE  pom.xml  README.md  src
    
    • 开始打包
      image

    image

    pipeline {
        agent any
        
        stages {
            stage('pull code') {
                steps {
                    git 'http://github.com/lizhenliang/tomcat-java-demo.git'
                }
            }
    
            stage('package') {
                steps {
                    sh """
                    mvn clean
                    mvn package
                    """
                }
            }
            
            
        }
    }
    
    • 看到下面内容表示拉取完成
      image

    • 给客户机做免密认证

    [root@Jenkins ~]# ssh-keygen -t rsa
    [root@Jenkins ~]# ssh-copy-id root@192.168.23.144
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@192.168.23.144's password: 
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'root@192.168.23.144'"
    and check to make sure that only the key(s) you wanted were added.
    
    yc
    //关闭防火墙与selinux0
    setenforce 0
    systemctl disable  --now firewalld
    

    image

    //图中完整代码为
    pipeline {
        agent any
        
        stages {
            stage('pull code') {
                steps {
                    git 'http://github.com/lizhenliang/tomcat-java-demo.git'
                }
            }
            stage('package') {
                steps {
                    sh """
                    mvn clean
                    mvn package
                    """
                }
            }
            stage('deploy') {
                steps {
                    sh """
                    scp target/ly-simple-tomcat-0.0.1-SNAPSHOT.war root@192.168.23.144:/usr/src/tomcat/webapps/
                    ssh root@192.168.23.144 '/usr/src/tomcat/bin/catalina.sh stop && /usr/src/tomcat/bin/catalina.sh start'
                    """
                }
            }
        }
    }
    
    • 看到与下图内容相同则成功
      image

    • 浏览器访问yc的ip看到下图内容则成功
      image

  • 相关阅读:
    使用VMWare实现主机一拖二(笔记本分身术)
    Implementing RelativeSource binding in Silverlight
    CLRProfiler V4 Released
    Host WCF on IIS 7.5
    增加智能感知的RichTextBox扩展控件(WPF)
    Troubleshooting Visual Studio 2010 and QT 4.7 Integration
    windows命令行下如何查看磁盘空间大小
    模拟谷歌今日使用的css动画
    粗聊Mysql——你会建库建表么?
    彩票项目难点分析
  • 原文地址:https://www.cnblogs.com/Ycqifei/p/14778981.html
Copyright © 2011-2022 走看看