【CI/CD技术专题】「Jenkins实战系列」jenkins+pipeline构建自动化部署

简介: 【CI/CD技术专题】「Jenkins实战系列」jenkins+pipeline构建自动化部署

前提引言


  • Jenkins的精髓是Pipeline(流水线技术),那为什么要用Pipeline呢?实现自动化构建,其中Pipeline能够将以前project中的配置信息以steps的方式放在一个脚本里,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程,形成流水式发布,构建步骤视图化。
  • 简单来说,Pipeline适用的场景更广泛,能胜任更复杂的发布流程。举个例子,job构建工作在master节点,自动化测试脚本在slave节点,而不同节点的执行处理通过Pipeline可以。




基本概念


  • 【Stage: 阶段】,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
  • 【Node: 节点】,一个Node就是一个Jenkins节点,或者是Master,或者是slave,是执行Step的具体运行期环境。
  • 【Step: 步骤】,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。




Pipeline配置


新建一个“流水线”的job

image.png

配置Pipeline脚本

image.png

Pipeline也支持Poll SCM

image.png

pipline流水线流程

image.png


PIpeline语法


  1. Pipeline支持两种语法:Declarative Pipeline(在Pipeline 2.5中引入,结构化方式)Scripted Pipeline,两者都支持建立连续输送的Pipeline。


共同点


两者都是pipeline代码的持久实现,都能够使用pipeline内置的插件或者插件提供的steps,两者都可以利用共享库扩展。


不同点:


  • 两者不同之处在于语法和灵活性。Declarative pipeline对用户来说,语法更严格,有固定的组织结构,更容易生成代码段,使其成为用户更理想的选择。
  • 但是Scripted pipeline更加灵活,因为Groovy本身只能对结构和语法进行限制,对于更复杂的pipeline来说,用户可以根据自己的业务进行灵活的实现和扩展。



下面举例介绍两种语法的使用


Declarative Pipeline


windows环境脚本案例


pipeline {
    agent any  //在可用的节点运行
    stages{
  stage ('Prepare'){
            steps{
     //清空发布目录
                 bat '''if exist D:\\publish\\LoginServiceCore (rd/s/q D:\\publish\\LoginServiceCore)
                       if exist C:\\Users\\Administrator\\.nuget (rd/s/q C:\\Users\\Administrator\\.nuget) exit''' 
    } 
  } 
        //拉取git代码仓库
        stage ('Checkout'){
              steps{
                    checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], 
                    userRemoteConfigs: [[credentialsId: 'c6d98bbd-5cfb-4e26-aa56-f70b054b350d', 
                    url: 'http://xxx/xxx/xxx']]])
              }
        }
       //构建
       stage ('Build'){
          steps{
             bat '''cd "D:\\Program Files (x86)\\Jenkins\\workspace\\LoginServiceCore\\LoginApi.Hosting.Web"
                  dotnet restore
                  dotnet build
                  dotnet publish --configuration Release --output D:\\publish\\LoginServiceCore'''
                  }
            }
       //部署
      stage ('Deploy'){
          steps{
               bat '''cd D:\\PipelineScript\\LoginServiceCore
                  python LoginServiceCore.py'''
                  }
             }
      //自动化测试(python代码实现)
      stage ('Test'){
          steps{
               bat'''cd D:\\PipelineScript\\LoginServiceCore
              python LoginServiceCoreApitest.py'''   
                  }
             }
    }
 }
复制代码



Scripted Pipeline

node('master') {     //master节点运行,以下stage也可指定节点
    stage 'Prepare'  //清空发布目录
        bat '''if exist D:\\publish\\LoginServiceCore (rd/s/q D:\\publish\\LoginServiceCore)
               if exist C:\\Users\\Administrator\\.nuget (rd/s/q C:\\Users\\Administrator\\.nuget)
               exit'''
    //拉取git代码仓库
    stage 'Checkout'
        checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [],        submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c6d98bbd-5cfb-4e26-aa56-f70b054b350d', 
            url: 'http://xxx/xxx/xxx']]])
    //构建
    stage 'Build'
        bat '''cd "D:\\Program Files (x86)\\Jenkins\\workspace\\LoginServiceCore\\LoginApi.Hosting.Web"
            dotnet restore
            dotnet build
            dotnet publish --configuration Release --output D:\\publish\\LoginServiceCore'''
    //部署
    stage 'Deploy'
        bat '''
        cd D:\\PipelineScript\\LoginServiceCore
        python LoginServiceCore.py
        '''
    //自动化测试(python代码实现)    
    stage 'Test'
        bat'''
        cd D:\\PipelineScript\\LoginServiceCore
        python LoginServiceCoreApitest.py
        '''   
}
复制代码



Pipeline Docker脚本示例

node{  
  // 代码检出
  stage('get Code') {
    git credentialsId: 'git-credentials-id', url: 'http://192.168.19.250/libo/test.git'
  }
    // 镜像中进行单元测试
  stage('unit testing'){ 
    // 启动golnag:1.7并在golang内编译代码
    docker.image('golang:1.7').inside {
      sh './script/unittest.sh'
    }
  }
  // 镜像中代码构建
  stage('Build'){    
    def confFilePath = 'conf/app.conf'
    def config = readFile confFilePath
    writeFile file: confFilePath, text: config
    // 启动golnag:1.7并在golang内编译代码
    docker.image('golang:1.7').inside {
      sh './script/build.sh'
    }
  }
  // 编译镜像并push到仓库
  def imagesName = '192.168.18.250:5002/ufleet/uflow:v0.9.1.${BUILD_NUMBER}'  
  stage('Image Build And Push'){
    docker.withRegistry('http://192.168.18.250:5002', 'registry-credentials-id') {
      docker.build(imagesName).push()
    }
  }
  // 启动刚运行的容器
  stage('deploy iamegs'){    
    // 需要删除旧版本的容器,否则会导致端口占用而无法启动。
    try{
      sh 'docker rm -f cicdDemo'
    }catch(e){
        // err message
    }
    docker.image(imagesName).run('-p 9091:80 --name cicdDemo') 
  }
}
复制代码



git操作认证

withCredentials([usernamePassword(credentialsId: '<credentials-id>', passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
    sh '''
        printf "machine github.com\nlogin $GIT_USERNAME\n password $GIT_PASSWORD" >> ~/.netrc
        // continue script as necessary working with git repo...
    '''
}
复制代码



git拉取代码

checkout scm: ([
                    $class: 'GitSCM',
                    userRemoteConfigs: [[credentialsId: '******',url: ${project_url}]],
                    branches: [[name: 'refs/tags/${project_tag}']]
])






相关文章
|
1天前
|
运维 安全 应用服务中间件
自动化运维的利器:Ansible入门与实战网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第30天】在当今快速发展的IT时代,自动化运维已成为提升效率、减少错误的关键。本文将介绍Ansible,一种流行的自动化运维工具,通过简单易懂的语言和实际案例,带领读者从零开始掌握Ansible的使用。我们将一起探索如何利用Ansible简化日常的运维任务,实现快速部署和管理服务器,以及如何处理常见问题。无论你是运维新手还是希望提高工作效率的资深人士,这篇文章都将为你开启自动化运维的新篇章。
|
4天前
|
数据可视化 jenkins 测试技术
GitLab CI/CD 和 Jenkins对比
8月更文挑战第25天
35 5
|
3天前
|
运维 Ubuntu 应用服务中间件
自动化运维的利器:Ansible入门与实战应用
【8月更文挑战第28天】在现代IT运维领域,自动化已成为提升效率、确保一致性和可靠性的关键。本文将引导读者了解Ansible——一种流行的自动化工具,它通过简化配置管理、部署和任务自动化流程,助力运维人员轻松应对日常挑战。从基础安装到高级用法,我们将一步步探索Ansible的魔力,并通过实际案例展示如何有效利用Ansible优化运维工作。无论你是初学者还是有经验的管理员,这篇文章都将为你提供宝贵的知识和技能,让你的运维之旅更加顺畅。
|
10天前
|
jenkins Linux 持续交付
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
|
2天前
|
前端开发 jenkins 持续交付
jenkins学习笔记之二十:docker in docker运行pipeline
jenkins学习笔记之二十:docker in docker运行pipeline
|
3天前
|
Devops 持续交付 开发者
.NET自动化之旅:是Azure DevOps还是GitHub Actions能够打造完美的CI/CD流水线?
【8月更文挑战第28天】在现代软件开发中,持续集成(CI)与持续部署(CD)是提升代码质量和加速交付的关键实践。对于 .NET 应用,Azure DevOps 和 GitHub Actions 等工具可高效构建 CI/CD 流水线,提升开发效率并确保软件稳定可靠。Azure DevOps 提供一站式全流程管理,支持 YAML 定义的自动化构建、测试和部署;GitHub Actions 则以简洁灵活著称,适用于 .NET 项目的自动化流程。选择合适的工具可显著提高开发效率并确保高质量标准。
|
3天前
|
监控 Devops jenkins
DevOps实践:构建自动化CI/CD流水线
【8月更文挑战第28天】本文深入探讨了DevOps文化下,如何通过构建自动化的持续集成和持续部署(CI/CD)流水线来提高软件开发的效率和质量。文章不仅分享了构建流水线的步骤,而且提供了实际的代码示例,旨在帮助读者理解并实现自己的自动化流程。
|
7天前
|
运维 Devops 应用服务中间件
自动化运维工具:Ansible的实战应用
【8月更文挑战第24天】在现代IT运维管理中,自动化已成为提升效率、减少错误的关键。本文将深入探讨Ansible,一款流行的自动化运维工具,通过实际案例展示其在配置管理、任务执行等方面的应用。我们将从Ansible的基础架构出发,逐步解析其模块和插件的使用,以及如何构建Playbooks来自动化日常任务。文章不仅提供代码示例,还着重讨论了Ansible在实际工作中的最佳实践和问题解决策略,旨在帮助读者更好地理解和运用Ansible,以实现运维工作的高效和自动化。
|
1天前
|
运维 监控 应用服务中间件
自动化运维:打造高效、稳定的系统环境
【8月更文挑战第30天】本文将探讨如何通过自动化运维技术,提升系统的稳定性和效率。我们将从基础概念出发,逐步深入到实践应用,分享一些实用的工具和技术,以及如何将这些工具和技术融入到日常的运维工作中。无论你是运维新手,还是有一定经验的老手,都能在这篇文章中找到有价值的信息。让我们一起探索自动化运维的世界,提升我们的工作效率,让系统运行得更加平稳。
|
1天前
|
数据采集 运维 Devops
探索Python编程之美:从基础到进阶自动化运维的变革之路:从脚本到DevOps
【8月更文挑战第30天】在数字化时代的浪潮中,编程已经成为一门重要的技能。Python以其简洁明了的语法和强大的功能,成为了许多初学者的首选编程语言。本文将通过浅显易懂的语言,带领读者从Python的基础语法出发,逐步深入到面向对象编程、网络爬虫开发以及数据分析等高级应用,旨在帮助初学者构建扎实的编程基础,并激发他们进一步探索编程世界的热情。文章不仅分享实用的编程技巧,还将探讨如何将编程知识应用于解决实际问题,以期培养读者的问题解决能力和创新思维。

热门文章

最新文章

下一篇
云函数