如何使用Jenkins Github Branch Source插件指定其他受信任文件?

时间:2019-05-24 14:05:49

标签: jenkins github jenkins-plugins

我已经使用GitHub Branch Source插件创建了Jenkins Multibranch Pipeline。 Jenkinsfile本质上只是调用一个包含所有构建/部署逻辑的Cake Build脚本(build.ps1build.cake)。这使我可以轻松转到其他CI服务。

不幸的是,我似乎无法弄清楚如何将我的Cake Build脚本添加为trusted file,以便PR派生而来的是从源仓库中提取文件。 Trust行为的Discover pull requests from forks设置似乎表明除trusted files之外还有其他Jenkinsfile

  

没人

     

来自fork的请求将被视为不可信。这意味着,在Jenkins需要可信文件(例如Jenkinsfile)的情况下,该文件的内容将从原始存储库中的target分支而不是fork存储库中的pull request分支中获取。

但是,我似乎找不到任何有关添加其他trusted files的文档。这样做的主要原因是为了防止PR派生PR使用Cake脚本访问credentials。他们将无法更改Jenkinsfile,但仍可以更改Cake脚本以公开凭据。

实际上是否可以添加其他trusted files

1 个答案:

答案 0 :(得分:0)

Jenkins似乎不支持此功能。我的解决方案是从基本版本手动检出不受信任的文件。首先使用以下命令获取基本版本的commit哈希:

def commit = sh(
    script: 'git rev-parse HEAD',
    returnStdout: true
).trim()

def base = sh(
    script: "git rev-list --parents -n 1 ${commit}",
    returnStdout: true
).trim().split('\\s+')[2]

git rev-list --parents -n 1 ${commit}将返回当前提交的哈希,这是由詹金斯创建的合并提交; PR的最新提交和目标分支的最新提交,以空格(例如05e9322574ea03003f87dcbb44f172e6fa62581f b3f6ef892af9c645f490106757d7d05df3a26060 069ffd55ae36414a51b4de166aef86966f9447a8)分隔。因此,我们通过trim().split('\\s+')[2]获取目标分支的最新提交的哈希。

现在,我们可以对不受PR信任的任何文件执行sh "git checkout ${base} FILE"

如果PR已与目标分支的最新版本合并,则此方法不起作用。所以我所做的就是这样:

// revert untrusted files to the base version and backup it before we execute any untrusted code so the attacker
// don't have a chance to put a malicious content
def latest = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()

sh "git checkout origin/${env.CHANGE_TARGET}"

def baseCompose = readFile('docker-compose.yml')

// switch back to latest commit
sh "git checkout ${latest}"
sh 'git clean -d -f -f -q -x'