精华内容
参与话题
问答
  • Jenkins 多分支构建

    万次阅读 2018-08-10 15:20:43
    今天终于搞定了 Jenkins 的多分支构建的配置。 以前在使用 gitlab-ci 时,可以根据不同的分支执行不同的构建,比如 release 分支执行发布到 fir 上的构建,其他分支只执行编译。但因为服务器上的 4G 内存还要跑其他...

    Jenkinsfile pipeline配置请查看我另一篇博文:https://blog.csdn.net/maosidiaoxian/article/details/86569288


    今天终于搞定了 Jenkins 的多分支构建的配置。

    以前在使用 gitlab-ci 时,可以根据不同的分支执行不同的构建,比如 release 分支执行发布到 fir 上的构建,其他分支只执行编译。但因为服务器上的 4G 内存还要跑其他服务,而 gitlab 又是个耗内存大户,经常报 5xx 错误而不得不重启(我后来不得不使用 cron 设置了隔几天自动重启的定时任务)。之后想起了一个 go 开发的 git 托管服务 gogs,于是老大把它给部署上,将项目从 gitlab 上迁移过来。

    gogs 没有 gitlab 那样有非常完善的一整套组件,如自动构建需要搭配 jenkins来完成。老大又把 jenkins 给装上,然后让我去配置项目。一番研究之后,算是解决了提交到 gogs 后触发 jenkins 构建的需求,但却有一个问题:
    如果项目中的 release 分支和 develop 分支都指向同一个节点,并且都推上去的话,jenkins 在构建时会把它当作是 develop 分支,从而导致没有触发自动构建。这样的话就不得不先推 release 分支,等 jenkins 开始构建后再推 develop 分支,但这样还是不便。
    之后就开始研究 Jenkins 的多分支构建,毕竟这才是解决这个问题的正确道理。

    多次尝试之后,今天终于摸索成功,过程记录如下:
    首先创建一个 Multibranch Pipeline 的任务,具体步骤网络教程较多,这里不作赘述。

    然后在项目的分支下新建一个 Jenkinsfile,编写构建规则。Jenkinsfile 使用 groovy 语法,我这里根据需求写了一个很简单的规则,代码如下:

    node {
      checkout scm
      echo "current branch: $BRANCH_NAME"
      if (BRANCH_NAME.startsWith("release/")) {
        sh "./gradlew clean -Ppublish assemble -PLOCAL_USERNAME=$LOCAL_USERNAME -PLOCAL_PASSWORD=$LOCAL_PASSWORD"
      } else {
        sh "./gradlew clean assembleTest -PLOCAL_USERNAME=$LOCAL_USERNAME -PLOCAL_PASSWORD=$LOCAL_PASSWORD"
      }
    }
    

    这里的 BRANCH_NAME 是内置的变量,值为当前的分支。
    当代码提交并且推上去,并触发 Jenkins 对 Multibranch Pipeline 的扫描之后,它会找到有 Jenkinsfile 的分支,并创建对应的 job,然后执行里面的操作(如果已有的分支没有更新则不会执行)。

    为了能够让代码推上去就能触发构建,需要到 gogs 上去添加 web hook。我按之前的思路添加了一个 webhook,地址是 jenkins 的 gogs 插件的地址格式,如下:

    http://192.168.1.3:8080/gogs-webhook/?job=IOP-Android-Multibranch
    

    测试了一下,能收到并触发构建。
    但是在推送一个新的分支时,却发现失败了:
    这里写图片描述
    原因是 Jenkins 并不存在这个分支的流行线。也就是我们需要触发 Jenkins 对 Multibranch Pipeline 的重新扫描,让它发现这个分支。
    于是又去配置触发器。但发现这里只有一种定时触发器可以设置,如下:
    这里写图片描述
    为了能较快地触发构建,我启用了这里的触发器并把时间设置为 5 分钟。问题能解决。并且 gogs 也不用再去配置 webhook,因此这里当扫描到有更新时也会自己触发构建。

    但这仍然不是我想要的,我希望的还是通过 webhook 的方式来实时触发,从下图来看,Multibranch Pipeline 应该是支持这种方式的,但是我却不知道怎么配置这一 url。
    这里写图片描述

    之后苦寻 google,终于在一条没有被点赞的答案看到了解决之法,地址为:https://stackoverflow.com/a/48444614/2673757 。答案如下:

    The easiest option by far (that I’m aware of) is to remotely tell the Jenkins Git plugin that there’s a new commit for a defined repository. However, this will not trigger Jenkins to start a job immediately. What happens is that the Git plugin starts (re-)indexing the specific repository. If changes are detected the Jenkins job is then started.

    From your repository (GitHub, GitLab, etc.) you should trigger the following URL:

    http://my-jenkins-host/git/notifyCommit?url=git@gitlab.example.com:group/repository.git&delay=0sec

    The value for url must match the SCM URL you configured in the Jenkins job (Git plugin)!

    Gotcha: it may be that your Jenkins is not deployed under the root context (/) in which case the URL would be http://my-jenkins-host/context-path/git/...

    于是回到 gogs 的项目设置上,重新添加 webhook,如下:
    这里写图片描述
    并触发推送设置一下,然后在 jenkins 上的 Scan Multibranch Pipline Log 上能看到最新的扫描日志,确实是触发了。现在,可以关掉 Jenkins 上的定时扫描的触发器了。

    最终总结关键点如下:

    1. Jenkinsfile 的简单实现。
    2. Multibranch 可以不配置定时扫描的触发器。
    3. 由 gogs 的 webhook 来触发 Jenkins,url 的格式为 http://{Jenkins的host}/git/notifyCommit?url={Multibranch Pipeline里面配置的项目地址}
    展开全文
  • 这篇文章,就说明下,自动化打包的其他配置,参数化构建,多分支构建等等。 本文内容: 参数化构建 多分支构建 定时构建 一、参数化构建 在新建的项目里,点击左侧配置 进入配置页面,【G...

    上篇,Android之Jenkins自动化打包流程及问题处理(一) 完成Jenkins最基本的自动化国建过程。
    但是,我们正式的项目往往需要配置很多的参数,设置等等。所以,最进本的打包,是无法满足我们的要求的。
    这篇文章,就说明下,自动化打包的其他配置,参数化构建,多分支构建等等。

    本文内容:

    一、参数化构建

    在新建的项目里,点击左侧配置
    在这里插入图片描述

    进入配置页面,【General】-勾选【参数化构建过程(This project is parameter)】这个选项。

    点击添加参数,可以看到好几个选项,有boolean类型参数,String类型参数,选择的参数等等,用哪个类型的参数,需要根据我们的需求来选择。
    在这里插入图片描述
    现在,我们来模拟2个场景,来看下,这些参数怎么使用。

    配置Gradle打包命令

    1,一般的Android项目,都会有测试环境,开发环境,生产环境。
    我们会配置productFlavors,如下

    Android{
    	flavorDimensions "env"
        productFlavors {
            online {
                buildConfigField "String", "API_HOST", "\"${cfg["apiUrlRelease"]}\""
                dimension "env"
            }
            //开发版本
            dev {
                buildConfigField "String", "API_HOST", "\"${cfg["apiUrlDev"]}\""
                dimension "env"
            }
            //测试版(本地)
            local {
                buildConfigField "String", "API_HOST", "\"${cfg["apiUrlDebug"]}\""
                dimension "env"
            }
        }
    }
    
    

    通常,这样的情况,我们本地打包的命令是这样

    gradlew assembleOnlineRelease //生产环境
    gradlew assembleDevRelease //开发环境
    

    这种情况的话,我们打不同环境的包,就需要 assebleXXXRelease这样的命令。
    这样,我们就需要添加一个带选择的参数(环境就几个,是固定的)来跟我们的task命令关联起来,。

    说干就干。

    • 我们添加一个选项参数
      在这里插入图片描述
      这里的3个选项,对应我们项目里面的3个测试环境(选项跟build.gradle里面的环境名字(local,dev,online)需要一样)。

    • 修改构建的task
      在这里插入图片描述
      这里,我们使用了 ${API_HOST} 替换了打包时候(gradlew assembleXXXRelease),中间的那个环境(XXX)。

    这样的话,在构建项目的时候,就可以通过选项来构建不同环境的包。

    配置项目APP的属性

    上面,我们是通过参数来配置打包命令的,并没有涉及到修改APP里面的属性。

    这样,我们强行加戏,再来一个动态添加版本名(versionName),这个属性。

    添加参数,其实,在构建的时候会替换掉项目gradle.properties里面的相同的参数。所以,我们在Jenkins里面添加参数后,需要在gradle.properties里面也添加相应的参数,这样,我们才可以使用。

    知道了,怎么替换后,我们的步骤就是:

    • 1,在Jenkins里,添加String参数,在构建的时候写入进去
    • 2,在Android项目的gradle.properties里添加一个相同的参数
    • 3,在build.gradle里面引用gradle.properties的参数
    • 4,这样能行吗。。。。

    1, 我们先在添加一个String参数的选项了。如下
    在这里插入图片描述
    2,在项目的gradle.properties里面也添加这个APP_VERSION_NAME参数

    gradle.properties

    # Project-wide Gradle settings.
    # IDE (e.g. Android Studio) users:
    # Gradle settings configured through the IDE *will override*
    # any settings specified in this file.
    # For more details on how to configure your build environment visit
    # http://www.gradle.org/docs/current/userguide/build_environment.html
    # Specifies the JVM arguments used for the daemon process.
    # The setting is particularly useful for tweaking memory settings.
    
    APP_VERSION_NAME=2.0.0
    

    3,我们在项目里面引用这个参数

    在app的module里的build.gradle引用这个版本名

    build.gradle

    android {
    	...
        defaultConfig {
            versionName APP_VERSION_NAME
    		...
    	}
    	...
    }
    

    4,这样能行么?

    事实上,我们做完了上面的3个步骤的话,还是不行的。
    我们需要把Jenkins配置的参数,映射到代码里。

    步骤:
    配置 - 构建 - 高级 - 勾选Pass all job parameters as Project properties
    如下图
    在这里插入图片描述
    到这里就可以构建我们的参数了

    最后,回到Jenkins里我们创建的项目里。点击Build with Parameters
    在这里插入图片描述
    点击完成后,会让我们配置,我们的参数
    在这里插入图片描述
    当我们配置完成后,就可以开心的构建我们的项目了。

    二、多分支构建

    在添加完了参数化构建后,项目确实方便了不少。

    但是,我们发现,我们的项目有很多分支,难道说,每个分支都要创建一个项目么,这不科学啊。

    后来发现,我们可以通过Git Parameter这个插件,可以实现多个分支的切换。

    安装Git Parameter插件

    系统管理 - 插件管理
    在这里插入图片描述
    进去后,点击可用插件,搜索git parameter
    在这里插入图片描述
    然后,安装
    在这里插入图片描述

    安装完成

    参数化构建,添加Git Parameter参数

    参数化构建 - 添加Git Parameter
    在这里插入图片描述
    看下Git Parameter需要设置哪些参数
    在这里插入图片描述
    Parameter Type 选择Branch or Tag,这样,分支跟tag都可以显示选择。
    默认分支,选择的还是master
    到这里,参数就填写完了。

    修改源码管理,默认的master分支

    修改我们在设置git地址时候,添加的默认的分支(*/master)

    在这里插入图片描述
    这里的指定分支用我们刚才构建 的参数替换(前面要加上‘$’符号)

    开始构建

    返回,Jenkins的项目里面,点击Build with Parameters

    我们就看到了,我们远程的分支就都显示出来了。

    在这里插入图片描述

    现在,我们就可以自由的选择分支来打包了。

    三、定时构建

    1,我们还是进入项目,选择,左侧的配置

    在这里插入图片描述

    2,选择构建触发器下面的Build periodically(定时构建)

    在这里插入图片描述
    Build periodically表示周期性的对项目进行构建。到指定的时间,触发构建任务。

    3,填写定时构建的规则

    在这里插入图片描述
    定时构建规则:
    定时构建有5颗星组成。每个星代表不同的含义。


    * * * * *

    • 第一颗*,表示分钟,取值范围0~59
    • 第二颗*,表示小时,取值范围0~23
    • 第三颗*,表示一月的第几天,取值1~31
    • 第四颗*,表示第几个月,取值1~12
    • 第五颗*,表示一周的第几天,取值0~7(0和7都是周日)

    1,10分钟构建一次
    H/10 * * * *
    2,每2小时构建一次
    H H/2 * * *
    3,每月的1-10号,每个2天构建一次
    H H 1-10/2 * *
    4,每周的周一,周五的下午8点,构建一次
    H 18 * * 1,5

    1,多个指定的时间点,用逗号“,”隔开(比如,H H * * 1,3,5)
    2,“/”,表示间隔时间,每隔多长时间,执行一次
    3,“1-10”,表示取值返回,连续的日期(分?时?天?)来构建

    填写好构建时间后,下面就会显示出来优化的规则和执行的时间。

    到这里,这3种构建就说完啦。
    Jenkins里面的功能还有好多好多,push自动构建,构建完成自动上传到蒲公英,钉钉提示,发邮件等等等等。后面,等尝试完了,在补充。

    展开全文
  • 之前的《Jenkins 多分支构建》解决了多分支项目的构建问题,但是却漏了一个问题,那就是邮件通知。 作为开发,我们的主要精力是集中在开发实现上,所以也不能每次推完代码之后都去等着看构建结果,我们需要在构建...

    之前的《Jenkins 多分支构建》解决了多分支项目的构建问题,但是却漏了一个问题,那就是邮件通知。
    作为开发,我们的主要精力是集中在开发实现上,所以也不能每次推完代码之后都去等着看构建结果,我们需要在构建失败的时候,Jenkins 能够通知我们去处理,所以邮件配置是不可少的。
    在简单的 Freestyle 项目中,我们可以进行如下配置:
    这里写图片描述
    然后在系统设置中配置好邮件通知就好:
    这里写图片描述

    但是当我们使用 Pipeline 时,就需要自己在配置脚本里添加邮件发送的配置了。
    由于之前是在 node 里添加构建命令的,它并没有 post 这个 DSL,因此在里面并不能在里面使用 post{...} 配置。但是它可以使用 emailext 方法,因此,我们可以修改一下我们的脚本,当发生异常——即构建失败时,发送邮件到对应的开发者。脚本如下:

    node {
        checkout scm
        echo "current branch: $BRANCH_NAME"
        try {
            if (BRANCH_NAME.startsWith("release/")) {
                sh "./gradlew clean -Ppublish assemble -PLOCAL_USERNAME=$LOCAL_USERNAME -PLOCAL_PASSWORD=$LOCAL_PASSWORD"
            } else {
                sh "./gradlew clean assembleTest -PLOCAL_USERNAME=$LOCAL_USERNAME -PLOCAL_PASSWORD=$LOCAL_PASSWORD"
            }
            currentBuild.result = 'SUCCESS'
        } catch (any) {
            currentBuild.result = 'FAILURE'
            throw any
        } finally {
            if (currentBuild.result == 'FAILURE') {
                emailext(
                    subject: "Jenkins build is ${currentBuild.result}: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                    mimeType: "text/html",
                    body: """<p>Jenkins build is ${currentBuild.result}: ${env.JOB_NAME} #${env.BUILD_NUMBER}:</p>
                             <p>Check console output at <a href="${env.BUILD_URL}console">${env.JOB_NAME} #${env.BUILD_NUMBER}</a></p>""",
                    recipientProviders: [[$class: 'CulpritsRecipientProvider'],
                                         [$class: 'DevelopersRecipientProvider'],
                                         [$class: 'RequesterRecipientProvider']]
                )
            }
        }
    }

    除此之外,由于这里使用的是 Jenkins 的 Email Extension Plugin 插件,所以还得去系统设置里配置这个插件的发件人相关配置。
    在 Jenkins 的主界面,进入系统管理,系统设置,然后找到 Extended E-mail Notification,添加与邮件通知类似的配置,如下:
    这里写图片描述

    以上是所有的相关配置,最后验证我们的配置结果。
    提交一下会编译失败的代码,收到邮件如下:
    这里写图片描述
    打开邮件里的链接即可直接查看控制台里的输出,至此大功告成。

    展开全文
  • 文章目录Jenkins Multi-branch Pipeline前言典型场景前置条件在GitHub上生成Personal Access Token在Jenkins中配置GitHub Personal Access ...Jenkins Pipeline适合对一个分支进行构建,并部署到一个环境中。 如果相

    用Jenkins Multi-branch Pipeline实现多分支构建和多环境部署

    前言

    Jenkins Pipeline适合对一个分支进行构建,并部署到一个环境中。

    如果需要对多个分支进行构建,并部署到多个环境中,可以使用Jenkins Multi-branch Pipeline。

    典型场景

    1. 开发人员从GitHub repository的master分支上创建一条新的分支feature-xxxxxx一般为任务编号)。

    2. 开发人员在本地开发测试,并push代码到feature-xxx分支。

    3. GitHub通过Webhook通知Jenkins运行构建,Jenkins对feature-xxx分支进行构建。

    4. feature-xxx分支的pipeline构建成功后,开发人员发起PR(Pull Request),试图合并到master 分支。

    5. GitHub通过Webhook通知Jenkins运行构建,Jenkins对PR进行构建。

    6. 代码评审人员在Pull Request中可以看到feature-xxxPR是否构建通过。

    7. 代码经过评审后,被合并到master分支。

    8. GitHub repository的Webhook通知Jenkins,Jenkins对master分支进行构建。

    前置条件

    确保在Jenkins上已安装以下插件:

    在GitHub上生成Personal Access Token

    在GitHub上,打开https://github.com/settings/tokens,点击Generate new token,填写Note,在Select scopes中勾选repo。记住生成的token值,后面需要在Jenkins中配置credential。

    在Jenkins中配置GitHub Personal Access Token

    在Jenkins上,新建一个Global的Credential (凭据),选择类型为“Username with password", Scope为“全局”,Username为jenkins-user,Password为上一步生成的GitHub Personal Access Token的值,ID值为一个有意义的字符串,Description中填入相应的描述。

    新建Jenkins Multi-branch Pipeline

    在Jenkins,New Item,输入流水线名称,选择“多分支流水线(Multi branch pipeline)”。

    在Branch Sources中,点击Add source,选择GitHub。

    在Credentials中选择上一步配置的GitHub personal access token。

    选择Repository HTTPS URL,输入GitHub repository URL。

    点击Validate按钮验证Jenkins是否可以正常访问指定的GitHub repository URL。

    在Behaviours中:

    • Discover branches的Strategy选择“Exclude branches that are also filed as PRs"
    • Discover pull requests from origin的Strategy选择为“Merging the pull request with the current target branch revision"
    • Discover pull requests from forks的Strategy选择为”Merging the pull request with the current target branch revision",Trust为“From users with Admin or Write permission"。

    在Build strategies中,点击Add,选择Build included regions strategy中输入改动哪个地方的文件时才触发自动构建。确保填写正确的路径,如果路径不正确,则不会触发自动构建。

    在Build Configuration中,选择Mode为by Jenkinsfile,Script Path为Jenkinsfile。如果Jenkinsfile不是放在根目录下或叫其他名字,则在Script Path中填入相应的值。

    在Scan Repository Triggers中,勾选Scan by webhook,在Trigger token中输入一个唯一的字符串(不同Jenkins job该token值不同)。可以用openssl rand -hex 8来生成一个随机字符串来作为该token。

    在GitHub中配置Webhook

    在GitHub上,打开相应的repository的settings,选择Webhook。

    点击Add webhooks。

    在Payload URL中填入:https://<jenkins_url>/multibranch-webhook-trigger/invoke?token=<token>

    Token为Jenkins job配置时“Scan Repository Trigger”中填写的token (注意,不要和GitHub Personal Access Token混淆了)。

    示例: https://jenkins.xdevops.cn/multibranch-webhook-trigger/invoke?token=a6cb104552964dc2

    Content type为"application/json"。

    Secret保留为空,不填写。(这个Secret和Payload URL中的token没有关系)

    SSL verification默认为Enable SSL verification。如果Jenkins是http协议,则勾选Disable。

    勾选“Send me everything"。

    默认勾选“Active”。

    保存。

    测试

    参照前面的“典型场景”进行测试。

    维护Jenkinsfile

    为一个GitHub repo的所有分支只维护一个Jenkinsfile。

    在Jenkinsfile中对分支前缀进行判断,以区分不同的pipeline逻辑。

    建议的分支命名规范:

    • 主分支:mastermain
    • 开发分支:developdev
    • 特性分支:feature-*
    • Release分支:release-*
    • Hofix分支:hotfix-*fix-*

    Pull request:

    • PR: PR-*

    参考文档

    展开全文
  • 由于公司内部项目众多,大量的项目使用同-套流程做CICD,那么势必会存在大量的重复代码,因此本章主要通过使用groovy实现Jenkins的sharedL ibrary的开发,以提取项目在CICD实践过程中的公共逻辑,提供一系列的流程的...
  • 最近研究CI/CD,项目多分支情况下怎么能高效持续集成、持续部署,造过jenkins的老铁们都知道,Jenkins 1.x是通过界面手动操作来“描述”部署流水线,那么Jenkins2.x给我们带来了福音,2.x支持pipeline as code,即...
  • jenkins选择分支构建

    万次阅读 2017-06-28 11:43:54
    jenkins有个插件Git Parameter ,可以实现在构建时,选择分支构建,从而可以减少一些操作。一.下载安装插件 在管理中选插件,输入Git Parameter,点击安装。或者访问...
  • Jenkinsfile的多分支流水线构建配置

    万次阅读 2019-01-21 09:49:43
    我之前的博客《Jenkins 多分支构建》及《Jenkins 多分支构建中的邮件配置》探索了在多分支构建中Jenkinsfile的配置。然而在我的配置中,根节点为node,但里面却没有使用Jenkinsfile的DSL去声明构建的流程,而是通过...
  • 一、先做好jenkins和gitlab的webhook自动构建 二、选择哪个分支(我这是test分支) 三、选择build Triggers 四、过滤test分支 五、保存即可 转载于:...
  • Jenkins多分支流水线(Multibranch Pipeline )项目类型能够在同一个项目的不同分支上实现不同的Jenkinsfile。在多分支流水线项目中, Jenkins 自动的发现、管理和执行在源代码控制中包含Jenkinsfile的分支的流水线,...
  • jenkins定位master分支构建

    千次阅读 2016-07-25 09:41:54
    前面讲了如何在修改gitlab库后自动触发jenkins构建,但是由于公司源码库中有分支,只有master分支才是完整的应用源代码,而想dev等分支只有用作bug修改,特性配置等,所以则希望只有master分支的修改会触发构建...
  • 在项目开发过程中,我们使用git进行源码管理,Jenkins进行程序构建,并打包成docker镜像,但对同一个工程的不同分支改如何处理,要达到以下要求:不同的分支,docker镜像的tag不同。  在实际操作过程中遇到一个...
  • 微信公众号搜索DevOps和k8s全栈技术 ,即可关注我的公众号,也可通过扫描文章最后的二维码关注,每天都会分享技术文章供大家参考阅读~,拥抱开源,同大家共同进步!!前言这篇文章给大家展...
  • 需求: 由于我们的程序会有很多分支,测试或者发版会根据不同的分支来构建项目实践: 实现在构建项目的时候弹出弹窗提醒我们来构建那个分支的项目,来构建不同环境的相同目录的程序例如:我们选择构建2.2.5分支,...

空空如也

1 2 3 4 5 ... 20
收藏数 725
精华内容 290
关键字:

多分支构建