问题描述
在CircleCI中的工作流中的不同作业中使用了变量$CIRCLE_BUILD_NUM
,但似乎这个变量在同一工作流的不同作业之间会递增?用户做了一些研究,发现可以切换到CIRCLE_WORKFLOW_ID
,这个变量在工作流中是唯一的,但它是一个非常长的字符串,不像构建编号($CIRCLE_BUILD_NUM
)是一个小整数,用户可以用它来追加到构建编号、Docker标签等中。用户想知道是否有什么方法解决这个问题。
解决方案
请注意以下操作可能会因版本差异而有所不同,确认操作前请备份配置文件。
方案1
为了在CircleCI的不同作业中使用$CIRCLE_BUILD_NUM
,可以使用一些额外的脚本来创建一个唯一的构建标识符。以下是一个可能的解决方案,尽管不是非常优雅,但可以解决问题。
首先,你可以在作业中添加一个步骤,该步骤将计算构建标识符并将其保存为环境变量,以供其他步骤使用。以下是示例脚本:
jobs:
build:
steps:
- run:
name: Create unique build identifier
command: |
GIT_SHA=$(git rev-parse --short HEAD)
echo "export GIT_SHA=${GIT_SHA}" >> "${BASH_ENV}"
# 根据 CIRCLE_BUILD_NUM 计算递增的计数器
BUILD_COUNTER="${CIRCLE_BUILD_NUM}"
echo "export BUILD_COUNTER=${BUILD_COUNTER}" >> "${BASH_ENV}"
# 构建标识符,包括短的 git sha 和计数器
BUILD_NUMBER="CIRC${BUILD_COUNTER}-${GIT_SHA}"
echo "export BUILD_NUMBER=${BUILD_NUMBER}" >> "${BASH_ENV}"
# 输出构建计数器和标识符
echo -e "\nbuild counter: ${BUILD_COUNTER}; build id: ${BUILD_NUMBER}\n"
在上面的示例中,我们在作业的步骤中计算了构建标识符。首先,我们获取了短的 Git SHA,然后将其与递增的计数器(基于$CIRCLE_BUILD_NUM
)组合起来,创建了一个唯一的构建标识符。最后,我们将构建标识符保存为环境变量,以便在其他步骤中使用。
方案2
请注意,
$BUILD_NUMBER
不会在其他作业中可用,这也是问题所在。
如果你需要在多个作业中共享构建编号,可能需要考虑使用其他机制,比如存储在共享位置的文件中,并在其他作业中读取。
以下是一个示例的方案,用于在不同作业之间共享构建编号:
在第一个作业中创建构建编号文件
在第一个作业的步骤中,你可以创建一个包含构建编号的文件。以下是示例脚本:
jobs:
build:
steps:
- run:
name: Create build number file
command: |
echo "${CIRCLE_BUILD_NUM}" > build_number.txt
echo -e "\nBuild number: ${CIRCLE_BUILD_NUM}\n"
在上面的示例中,我们将构建编号写入名为build_number.txt
的文件中。
在其他作业中读取构建编号
在其他作业的步骤中,你可以读取之前创建的构建编号文件,以获取相同的构建编号。以下是示例脚本:
jobs:
another_job:
steps:
- run:
name: Read build number
command: |
BUILD_NUMBER=$(cat build_number.txt)
echo -e "\nBuild number from file: ${BUILD_NUMBER}\n"
在上面的示例中,我们使用cat
命令读取build_number.txt
文件中的构建编号,并将其保存为BUILD_NUMBER
环境变量,以供其他步骤使用。
请注意,这只是一个示例方案,你可以根据实际情况进行调整和修改,以满足你的需求。使用文件共享构建编号可以确保在不同作业之间共享相同的构建编号。