我已经使用GitHub Branch Source插件创建了Jenkins Multibranch Pipeline。 Jenkinsfile
本质上只是调用一个包含所有构建/部署逻辑的Cake Build脚本(build.ps1
,build.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
?
答案 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'