将自由风格项目转换为管道项目 CI/CD

开发 前端
如今,许多公司都使用Jenkins完成了他们的持续集成,测试和持续部署。他们中的大多数使用freestyle作为默认项目类型,但这有其自身的局限性。根据需要,我最近开始将所有Freestyle迁移到Pipeline项目。

[[377343]]

 如今,许多公司都使用Jenkins完成了他们的持续集成,测试和持续部署。他们中的大多数使用freestyle作为默认项目类型,但这有其自身的局限性。根据需要,我最近开始将所有Freestyle迁移到Pipeline项目。那么什么时候触发这些工作呢?开发人员/所有者通过推送/提交更新存储库后,jenkins作业将触发这些作业-将生成一个二进制文件,另一个将运行单元测试以检查代码覆盖率。由于代码覆盖率单元测试需要大量时间才能完成,因此将这两个任务分成两个工作的必要性上升了。只要存储库中有更新,就会触发此作业,并在限制运行和执行构建前和构建后步骤的计算机中检入代码。

自由风格项目

全局配置

 

GitHub存储库配置


启用webhook配置


基于Shell的构建步骤


发布-根据结果构建任务

 

触发电子邮件通知,以在构建执行后通知项目所有者


为单元测试作业创建了相同的作业类型,在Build shell中进行了很少的改动,并添加了一些单元测试代码。

为什么要转换成Pipeline项目?

Freestyle的主要问题之一是,它不允许超过1个存储库的SCM轮询webhook触发器。这是我们的主要担忧,为管道迁移铺平了道路。上面的快照涵盖了将近7项任务,而单元测试的任务数约为10。那么我们可以使用管道代码来执行所有任务。下面是从上面的Freestyle转换而来的一个

  1. WSPACE = '/var/jenkins/workspace/Directory_Name/' 
  2. BRWSPACE = '/var/jenkins/workspace/' 
  3. pipeline { 
  4.     agent { 
  5.         node { 
  6.             label 'Node_Name' 
  7.             customWorkspace "${WSPACE}" 
  8.         } 
  9.     } 
  10.      
  11.     //清空构建目录 
  12.     stages { 
  13.         stage('Cleaning up the previous directory') { 
  14.             steps { 
  15.                 echo 'Deleteing the directory' 
  16.                 sh "rm -rf  /var/jenkins/workspace/Directory_Name/* " 
  17.             } 
  18.         } 
  19.          
  20.     // 下载代码和依赖 
  21.     stage('Checking out build repo and its dependencies') { 
  22.              steps { 
  23.                 dir("${WSPACE}/RepoName") { 
  24.                     git branch: 'master',  
  25.                         credentialsId: 'UserName',  
  26.                         url: 'https://github.com/path/repo.git' 
  27.                 } 
  28.                 dir("${WSPACE}/dir") { 
  29.                     git branch: 'master',  
  30.                         credentialsId: 'UserName',  
  31.                         url: 'https://github.com/path/repo1.git' 
  32.                 } 
  33.                 dir("${WSPACE}/dir3") { 
  34.                     git branch: 'master',  
  35.                         credentialsId: 'UserName2',  
  36.                         url: 'https://github.com/path/repo4.git' 
  37.               }     
  38.            } 
  39.     } 
  40.      
  41.     //执行构建 
  42.     stage('Versioning and executing the build') { 
  43.          steps { 
  44.                 dir ("${WSPACE}/repo1") { 
  45.                     script{ 
  46.                         sh label: '', script: '''/usr/bin/env 
  47.        cd /var/jenkins/workspace/ 
  48.        original=`cat patch_info` 
  49.        MAJOR=`cat patch_info | cut -d "." -f1` 
  50.        MINOR=`cat patch_info | cut -d "." -f2` 
  51.        PATCH=`cat patch_info | cut -d "." -f3` 
  52.        New_Value=`expr $PATCH + 1` 
  53.        New_Version=$MAJOR.$MINOR.$New_Value 
  54.        sed -i "s/$original/$New_Version/g" patch_info 
  55.        echo "$New_Version" 
  56.        cd /var/jenkins/workspace/path/repo4/ 
  57.        echo "Starting the Unit Testing" 
  58.        export GOPATH=$HOME/go 
  59.        export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin 
  60.        make format 
  61.        make clean build 
  62.        if  make unit-test ; then 
  63.         cd /var/jenkins/workspace/path/repo1/dir  
  64.        else 
  65.         cd /var/jenkins/workspace/path/repo2/dir2 
  66.        fi 
  67.        if make unit-test ; then 
  68.         echo " unit testing completed" 
  69.        fi 
  70.                         ''
  71.                     }  
  72.                 } 
  73.          } 
  74.   } 
  75.    
  76.   //发布HTML报告 
  77.   stage ('Publish HTML Report') { 
  78.        steps { 
  79.           dir ("/jenkins/workspace/") { 
  80.                script{ 
  81.                 sh label: '', script: '''/usr/bin/env 
  82.                 perl /jenkins/generate_build_meta_data.pl -jr http://gitlab.com:8080 -bNum ${BUILD_NUMBER} -bName ${JOB_NAME} -o /tmp -t /jenkins/template.html 
  83.                 export GOPATH=$HOME/go 
  84.                 export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin 
  85.                 cd /var/jenkins/workspace/path/repo1/service/ 
  86.                 go tool cover -html=c.out -o coverage.html 
  87.                 cd /var/jenkins/workspace/path/repo2/dir3 
  88.                 go tool cover -html=c.out -o output.html 
  89.                ''
  90.               publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false,  
  91.               reportDir: '/tmp/${JOB_NAME}/${BUILD_NUMBER}', reportFiles: '${JOB_NAME}-${BUILD_NUMBER}-manifest.html'
  92.               reportName: 'Email Output Subject', reportTitles: '']) 
  93.                }     
  94.           } 
  95.        } 
  96.   } 
  97.    
  98.   //发送邮件 
  99.   stage ('Send Email') { 
  100.        steps { 
  101.         dir ("${WSPACE}/repo4") { 
  102.          emailext attachmentsPattern: '**/coverage.html,**/dir4.html', body: '${FILE, path="/tmp/${JOB_NAME}/${BUILD_NUMBER}/${JOB_NAME}-${BUILD_NUMBER}-manifest.html"}', subject: 'Unit testing Email Output ${BUILD_NUMBER} Successful'to"EmailID@Domain2.com, EmailID2@Domain3.com" 
  103.     } 
  104.    } 
  105.   } 
  106.  } 

上面的代码为我们提供了编辑的空间及其凝聚力。管道作业的一个重要特征是阶段的输出以一种吸引人的方式呈现,我发现这很容易理解正在进行的过程。

总结

创建Freestyle或Pipeline项目完全取决于需求。在定制方面,Pipeline显示了主要空间,因为自由风格是启动您的第一份Jenkins工作的简便方法。

 

责任编辑:姜华 来源: DevOps云学堂
相关推荐

2023-04-18 08:17:11

GitLab持续集成

2022-02-22 09:00:00

软件开发CI/CD 管道工具

2023-05-04 16:03:50

KubernetesCI/CD集成

2021-07-02 16:30:01

CICDDevOps

2020-12-15 16:13:21

DevSecOpsCICD

2023-01-30 15:55:08

2023-02-19 15:28:39

CI/CD 管道集成开发

2022-05-19 09:00:00

安全CI/CD工具

2021-01-11 09:17:49

GitLabCIMonorepoDocker

2023-05-24 16:20:39

DevOpsCI/CD 管道软件开发

2018-08-24 09:00:00

DevOps持续集成连续部署

2019-07-25 10:31:55

AWSDevOps架构

2021-08-31 09:00:00

开发Azure DevOp集成

2021-03-31 09:00:00

管道集成工具

2021-09-26 09:26:46

开发安全CICD管道

2020-10-21 14:10:28

工具测试开发

2023-05-09 16:20:54

蓝绿部署CI/CD 管道自动化部署

2021-07-28 13:23:32

CICD管道安全漏洞

2021-01-31 18:28:13

二次元Python开发

2023-07-17 13:44:23

点赞
收藏

51CTO技术栈公众号