前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >将自由风格项目转换为Pipeline项目CI/CD

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

作者头像
DevOps云学堂
发布2021-12-15 20:53:29
1.3K0
发布2021-12-15 20:53:29
举报
文章被收录于专栏:DevOps持续集成DevOps持续集成

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

那么什么时候触发这些工作呢?开发人员/所有者通过推送/提交更新存储库后,jenkins作业将触发这些作业-将生成一个二进制文件,另一个将运行单元测试以检查代码覆盖率。

由于代码覆盖率单元测试需要大量时间才能完成,因此将这两个任务分成两个工作的必要性上升了。只要存储库中有更新,就会触发此作业,并在限制运行和执行构建前和构建后步骤的计算机中检入代码。

自由风格项目

全局配置

GitHub存储库配置

启用webhook配置

基于Shell的构建步骤

发布-根据结果构建任务

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

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

为什么要转换成Pipeline项目?

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

代码语言:javascript
复制
WSPACE = '/var/jenkins/workspace/Directory_Name/'
BRWSPACE = '/var/jenkins/workspace/'
pipeline {
    agent {
        node {
            label 'Node_Name'
            customWorkspace "${WSPACE}"
        }
    }
    
    //清空构建目录
    stages {
        stage('Cleaning up the previous directory') {
            steps {
                echo 'Deleteing the directory'
                sh "rm -rf  /var/jenkins/workspace/Directory_Name/* "
            }
        }
        
    // 下载代码和依赖
    stage('Checking out build repo and its dependencies') {
             steps {
                dir("${WSPACE}/RepoName") {
                    git branch: 'master', 
                        credentialsId: 'UserName', 
                        url: 'https://github.com/path/repo.git'
                }
                dir("${WSPACE}/dir") {
                    git branch: 'master', 
                        credentialsId: 'UserName', 
                        url: 'https://github.com/path/repo1.git'
                }
                dir("${WSPACE}/dir3") {
                    git branch: 'master', 
                        credentialsId: 'UserName2', 
                        url: 'https://github.com/path/repo4.git'
              }    
           }
    }
    
    //执行构建
    stage('Versioning and executing the build') {
         steps {
                dir ("${WSPACE}/repo1") {
                    script{
                        sh label: '', script: '''/usr/bin/env
       cd /var/jenkins/workspace/
       original=`cat patch_info`
       MAJOR=`cat patch_info | cut -d "." -f1`
       MINOR=`cat patch_info | cut -d "." -f2`
       PATCH=`cat patch_info | cut -d "." -f3`
       New_Value=`expr $PATCH + 1`
       New_Version=$MAJOR.$MINOR.$New_Value
       sed -i "s/$original/$New_Version/g" patch_info
       echo "$New_Version"
       cd /var/jenkins/workspace/path/repo4/
       echo "Starting the Unit Testing"
       export GOPATH=$HOME/go
       export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
       make format
       make clean build
       if  make unit-test ; then
        cd /var/jenkins/workspace/path/repo1/dir 
       else
        cd /var/jenkins/workspace/path/repo2/dir2
       fi
       if make unit-test ; then
        echo " unit testing completed"
       fi
                        '''
                    } 
                }
         }
  }
  
  //发布HTML报告
  stage ('Publish HTML Report') {
       steps {
          dir ("/jenkins/workspace/") {
               script{
                sh label: '', script: '''/usr/bin/env
                perl /jenkins/generate_build_meta_data.pl -jr http://gitlab.com:8080 -bNum ${BUILD_NUMBER} -bName ${JOB_NAME} -o /tmp -t /jenkins/template.html
                export GOPATH=$HOME/go
                export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
                cd /var/jenkins/workspace/path/repo1/service/
                go tool cover -html=c.out -o coverage.html
                cd /var/jenkins/workspace/path/repo2/dir3
                go tool cover -html=c.out -o output.html
               '''
              publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, 
              reportDir: '/tmp/${JOB_NAME}/${BUILD_NUMBER}', reportFiles: '${JOB_NAME}-${BUILD_NUMBER}-manifest.html',
              reportName: 'Email Output Subject', reportTitles: ''])
               }    
          }
       }
  }
  
  //发送邮件
  stage ('Send Email') {
       steps {
        dir ("${WSPACE}/repo4") {
         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"
    }
   }
  }
 }
}

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

总结

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps云学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
持续集成
CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档