我有一个Jenkins Pipeline Library方法,名为branchExists.groovy
,它检查一个分支是否存在于远程(而不是本地!)存储库中。
这是代码:
# !/usr/bin/env groovy
def call(String repoUrl, String branchName) {
// Use git ls-remote to verify branch existence
def sout = sh(returnStdout: true, script: "#!/bin/bash\ngit ls-remote --heads ${repoUrl} refs/heads/${branchName}").trim()
return sout.size() != 0
}
因此,正如您所看到的,启动了一个Bash shell来运行命令git ls-remote
。要运行shell,该方法 * 必须 * 在管道中的node{}
块的上下文中运行,即使我没有在该节点上执行任何其他操作。
用Jenkins Pipeline的话说,有没有一种方法可以检查远程分支,而不需要运行shell命令,从而不必占用node{}
?
编辑:也许知道Git服务器是Atlassian Bitbucket服务器是件好事,所以也许我可以使用Bitbucket API?或者这仍然需要一个节点吗?
为什么要避免占用节点?
我之所以担心不占用节点,是因为flyweight/lightweight与heavyweight执行器的区别。参见https://support.cloudbees.com/hc/en-us/articles/360012808951-Pipeline-Difference-between-flyweight-and-heavyweight-Executors
- Flyweight执行器只是线程 *,在Jenkins master的JVM中运行。*Flyweight执行器不受限制 *,将在需要时自动创建,而重量级执行器则根据其节点的配置进行限制。
每个流水线脚本本身都使用flyweight执行器(即Java线程)在master上运行。* 当包含在节点块中时,sh和bat等流水线步骤将在重量级执行器上执行 *,因此,在设计良好的流水线中,复杂的逻辑仅发生在这些步骤中,flyweight执行器应该处于空闲状态,而步骤在远程代理上运行,这是构建的大部分时间。
Flyweight执行器不会阻塞构建队列,也不会被构建队列阻塞。如果所有重量级执行器都饱和了,那么我的流水线将无法继续,直到有执行器可以运行git ls-remote
。
2条答案
按热度按时间pcrecxhr1#
据我所知,答案是否定的。我在Jenkins本身找不到任何可能提供该功能的东西。
即使您尝试与BitBucket API通信,您仍然需要一个节点来处理该通信。
我认为,实现所需功能的唯一方法是编写一个自定义的Java或Groovy库,并将其合并到Jenkinsfile中,该库可以通过JGit这样的库与git原生通信,也可以通过bitbucket-rest这样的库与BitBucket原生通信。
jckbn6z72#
Jenkinsfile是一个基于Groovy的DSL,Jenkins管理员可以开发Groovy脚本并在Jenkins的脚本引擎https://jenkins.example.com/script中测试它们,这样运行的脚本不占用节点,但请注意,这意味着环境变量在构建作业中不可用。不过,您可以使用一些小技巧来获取它们。存储在$BITBUCKET_KEY中的令牌是通过getToken收集的()方法在下面的示例中...
Atlassian BitBucket服务器有一个REST API,它支持资源上的各种方法和过滤器。此资源是您需要处理的资源:
/rest/api/最新/项目/${a_团队}/存储库/${a_存储库}/分支
下面是Groovy代码。