Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 只有在发生更改时才构建项目_Node.js_Git_Jenkins_Jenkins Pipeline - Fatal编程技术网

Node.js 只有在发生更改时才构建项目

Node.js 只有在发生更改时才构建项目,node.js,git,jenkins,jenkins-pipeline,Node.js,Git,Jenkins,Jenkins Pipeline,我们想把我们的项目分成几个小部分。我们当前的CI流程经过一个简短的测试阶段,然后运行一个部署脚本。然而,如果其中一个子项目没有任何变化,我们就不想为此进行构建 Jenkins With pipelines支持SCM配置中的排除(我们使用git),基于此,您可以配置要运行的特定作业。但是,当使用管道时,我如何知道是否应该构建此部件?如何访问受上次推送影响的路径 目前我们的脚本非常简单,我们希望它尽可能简单 我们在玩弄和语法,但找不到好的解决方案 声明性: #!groovy​ pipeline {

我们想把我们的项目分成几个小部分。我们当前的CI流程经过一个简短的测试阶段,然后运行一个部署脚本。然而,如果其中一个子项目没有任何变化,我们就不想为此进行构建

Jenkins With pipelines支持SCM配置中的排除(我们使用git),基于此,您可以配置要运行的特定作业。但是,当使用管道时,我如何知道是否应该构建此部件?如何访问受上次推送影响的路径

目前我们的脚本非常简单,我们希望它尽可能简单

我们在玩弄和语法,但找不到好的解决方案

声明性:

#!groovy​
pipeline {
    agent any
    tools {
        nodejs '8.1'
    }
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        # Only continue, if something has changed

        stage('Install') {
            steps {
                sh 'npm install'
            }
        }

        stage('Test') {
            steps {
                sh 'npm run test-jenkins'
            }
            post {
                always {
                    junit "artifacts/test/report.xml"
                }
            }
        }
    }
}
脚本:

#!groovy​
node {
    def nodejs = tool name: '8.1', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'
    env.PATH = "${nodejs}/bin:${env.PATH}"

    stage('Checkout') {
        checkout scm
    }

    # Only continue, if something has changed


    stage('Install') {
        sh 'npm install'
    }

    stage('Test') {
        try {
            sh 'npm run test-jenkins'
        } finally {
            junit "artifacts/test/report.xml"
        }
    }
}
多亏了我的提问,我们现在有了一个优雅的解决方案:

  • 在成功生成时为当前提交创建标记
  • 在下一个构建中,比较新提交和标记的更改
  • 我们在同一个源根目录下为多个项目使用一个和一个并行构建。我们迭代项目(
    serviceX
    ),并在相应的目录中检查更改:

    def projects = ['service1', 'service2']
    def builders = [:]
    for (p in projects) {
        def label = p
    
        builders[label] = {
            def tag = "${BRANCH_NAME}_last"
            node {
                echo "Checking for changes compared to ${tag} in directory ${label}"
                try {
                    sh "./check-for-changes ${tag} ${label}"
                } catch (ignored) {
                    echo "Nothing to do"
                    return
                }
                dir (label) {
                    stage(label + ": Install") {
                        sh "npm install"
                    }
    
                    stage(label + ": Test") {
                        try {
                            sh "npm run test-jenkins"
                        } finally {
                            junit 'artifacts/test/report.xml'
                        }
                    }
    
                    echo "Setting tag for the last build on this branch"
                    sh "git tag -f ${tag}"
                }
            }
        }
    }
    
    parallel builders
    
    。。。以及检查更改的脚本:

    #/bin/bash
    沙乌上一站=1美元
    如果[-z${SHA_PREV}];然后
    echo“用法:`basename$0`”
    出口1
    fi
    检查路径=$2
    如果[-z${CHECK_PATH}];然后
    echo“用法:`basename$0`”
    出口1
    fi
    如果'git rev parse${SHA_PREV}>/dev/null 2>&1';然后
    echo“找到上一个标记:${SHA_PREV}”
    其他的
    SHA_PREV=`git rev list--max parents=0头`
    echo“使用初始提交:${SHA_PREV}”
    fi
    changes=`git diff--name only${SHA_PREV}HEAD | grep${CHECK_PATH}/`
    如果[!-n“${changes}”];然后
    回显“未发现任何更改”
    退出2#未找到任何更改
    fi
    
    构建完成后,为当前提交创建一个标记。在下一个构建中,比较新提交和标记。如果它们不是相同的提交,则继续(如果只关心文件内容,则继续执行树)。在新构建完成后,将标记从上一次提交重置为当前提交。@ElpieKay这有效了!非常感谢你。我会把它写下来,然后作为答案贴上去。没关系。很高兴这有帮助