如何在不克隆它所连接的存储库的情况下触发 Jenkins 构建?

Posted

技术标签:

【中文标题】如何在不克隆它所连接的存储库的情况下触发 Jenkins 构建?【英文标题】:How to trigger Jenkins build without cloning the repository it is hooked to? 【发布时间】:2021-03-04 10:40:20 【问题描述】:

我正在使用 config.xml 文件作为模板动态创建 jenkins 作业。基本上我想要实现的是,当有人推送到存储库时,这将触发 jenkins 中的工作。然后,该作业应该拉取一个 docker 映像,创建一个容器并克隆它挂接到其中的存储库。这个想法是为了避免将任何恶意代码下载到我们的服务器。相反,它将被下载到 docker 容器中,在容器中运行可执行文件,然后容器将被删除。

问题在于,每当有人推送到 git 存储库时,jenkins 作业都会自动克隆该存储库。有没有办法保持对 repo 的钩子但阻止它克隆?

我们没有使用 jenkins 文件,因为它必须在存储库中,并且任何人都可以修改它,这就是我们从 config.xml 模板创建 jenkins 作业的原因。

我读到 jenkinsfile 中存在选项 skipdefaultcheckout 以停止克隆 repo?是否可以在 config.xml 中进行设置?这是解决我正在尝试做的事情的正确选择吗?

【问题讨论】:

【参考方案1】:

假设:相关的 docker 插件已经安装在 Jenkins 上。

安装ssh-agent 插件以将ssh credentials 传递给docker 容器,以便在docker 中克隆repo。

可以使用的 docker 容器中用于 repo checkout 的 groovy sn-p 示例。

withDockerContainer(args: '-u root', image: "$image") 
  sshagent(['jenkins-credentials']) 
    sh "mkdir ~/.ssh/ && echo -e 'Host *\n  StrictHostKeyChecking no' > ~/.ssh/config && cat ~/.ssh/config && ssh-add -l"
    git changelog: false, credentialsId: '<ID>', poll: false, url: "<REPO URL>"
    sh 'echo "repo cloned inside container !!!"'
  


【讨论】:

在 Jenkinsfile 中使用了 groovy 吗?我们没有使用 jenkinsfile。没有它可以实现吗? 是的,这是没有 Jenkinsfile 的。您可以查看此示例管道作业jenkins.io/pipeline/getting-started-pipelines/… 我正在使用 config.xml 模板动态生成作业。可以在config.xml里面配置吗?

以上是关于如何在不克隆它所连接的存储库的情况下触发 Jenkins 构建?的主要内容,如果未能解决你的问题,请参考以下文章

Git:如何在不丢失当前分支的情况下克隆项目?

如何在不硬编码存储库的情况下在 Maven 中部署其他工件?

如何在不使用存储库的情况下将Docker镜像从一个主机复制到另一个主机

是否可以在不重写历史记录的情况下精简 .git 存储库?

如何在不下载其父文件夹的情况下签出或克隆文件夹

(如何)我可以在不安装完整的 boost 库的情况下使用 boost::spirit X3 吗?