我正在努力实现的目标:
我正在尝试执行一个管道脚本,其中SCM(AccuRev)在“任意”代理上签出,然后根据本地工作区在同一代理上执行阶段。构建阶段特别期望代码签出仅在映射到容器的工作区中可用。
问题是:
当我在Jenkins配置中添加了多个代理时,SCM步骤将在一个代理上签出代码,然后启动构建步骤,在另一个代理中启动容器,这是一个问题,因为代码是在另一代理上签出来的。
有效方法:
- Jenkins配置了单个代理/节点
pipeline { agent none stages { stage('Checkout') { agent any steps { checkout accurev(depot: 'MyDepot', serverName: 'AccuRev', stream: 'SomeStream', wspaceORreftree: 'none') } } stage('Compile') { agent { docker { image 'ubuntu' } } steps { sh '''#!/bin/bash make -j16 ''' } } } }
我已经尝试过,但没有成功:
- Jenkins配置了2个代理/节点
pipeline { agent { docker { image 'ubuntu' } } stages { stage('Checkout') { steps { checkout accurev(depot: 'MyDepot', serverName: 'AccuRev', stream: 'SomeStream', wspaceORreftree: 'none') } } stage('Compile') { steps { sh '''#!/bin/bash make -j16 ''' } } } }
上述方法不起作用,因为它希望AccuRev安装在容器中。我可以走这条路,但它不是真正可扩展的,并且会导致基于旧操作系统的容器出现问题。容器内也存在权限问题。
我对下面的“自动结账scm”有所了解或了解,但这很奇怪,因为没有地方定义要结账的目标流/分支。这就是为什么我要声明一个特定的阶段来处理scm签出。这可能会在不需要指定代理的情况下处理结账,但我不知道如何做到这一点。
pipeline { agent any stages { stage ('Build') { steps { sh 'cat Jenkinsfile' } } } }