Jenkins:仅在迁移文件夹已更改时运行迁移

时间:2018-12-26 21:23:19

标签: jenkins continuous-integration

我有一个管道脚本,并且要根据migrations文件夹的更改采取不同的操作。

基本上是这样的工作流程

  1. 拉动存储库中的更改
  2. 检查migrations/文件夹是否有新的迁移或更改
  3. 如果存在更改,请运行迁移,否则,请继续

我不确定如何实现此目标,我使用的是2.1版和git插件。此仓库位于私人服务器上

2 个答案:

答案 0 :(得分:0)

对于您而言,Git插件的“包含区域”功能应该会有所帮助。有关详细信息,请参见this答案。

因此,对于管道,您可以使用管道语法生成器(在样本步骤:结帐-> SCM:Git->其他行为->轮询忽略)中的http://<JENKINS_IP>:<JENKINS_PORT>/job/<PATH_TO_PIPELINE_JOB>/pipeline-syntax/作业下生成正确的语法。某些路径)。会是这样的:

checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'PathRestriction', excludedRegions: '', includedRegions: 'migrations/.*']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'test', url: 'http://test.com/test.git']]])

查看this文档以了解详细信息(extensions -> includedRegions)。

对于作业dsl语法,它类似于this

scm {
    git {
        remote {
            ...
        }
        extensions {
            cleanBeforeCheckout()
            disableRemotePoll() // this is important for path restrictions to work
            configure { git ->
                git / 'extensions' / 'hudson.plugins.git.extensions.impl.PathRestriction' {
                    includedRegions "somepath/.*"
                    excludedRegions "README.md\n\\.gitignore\npom.xml"
                }
            }
        }
    }
}

此外,当将更改推送到存储库时,您可以使用GitHub / GitLab / BitBucket Webhooks来构建项目。 有关Github和BitBucket配置的信息,请参见this示例;有关GitLab配置的信息,请参见this示例。

如果您只想为migrations文件夹中的更改而不是存储库中的任何更改生成项目,则可以配置注释正则表达式来触发生成并添加此特定注释(例如,“ [文件夹]“),每次您想要触发构建时提交。

答案 1 :(得分:0)

可能有直接通过插件执行此操作的方法,但是如果我添加另一个分支源作为“单个存储库和分支”,则只有包含区域的选项,所以现在我实现了此解决方案:

我将此添加到我的Jenkins文件中,以检查migrations/文件夹中的更改

script {
    env.CONTAINS_MIGRATIONS = sh (
        script: 'git diff --name-only --diff-filter=AMDR --cached HEAD^',
        returnStdout: true
    ).trim()

    if (env.CONTAINS_MIGRATIONS.contains('migrations')) {
        // Do migrations related stuff
    }
}

我这样做是考虑到不太可能出现文件名冲突,如果发生这种情况并不重要