CircleCI脚本问题:权限拒绝、Token解码错误及退出码1
问题解决思路与方案
针对你CircleCI脚本中出现的多个错误,逐个给出修复方案:
1. apt权限错误(Permission denied)
报错原因
CircleCI默认运行用户不是root,执行apt update时没有权限修改系统包管理目录。
修复方案
在apt命令前添加sudo,修改为:
sudo apt update && sudo apt install -y curl jq
2. Token解码错误(invalid number of segments)
报错原因
脚本中cx scan create命令的--apikey {api_key}是占位符,未替换为实际的Checkmarx API密钥。JWT格式的API密钥是三段式(用.分隔),占位符不符合格式要求,导致解码失败。
修复方案
- 在CircleCI项目的环境变量中添加Checkmarx API密钥(比如命名为
CX_API_KEY) - 将脚本中的
{api_key}替换为环境变量引用,同时用双引号包裹避免特殊字符问题:
--apikey "$CX_API_KEY"
3. 脚本语法与逻辑问题
3.1 Maven命令换行错误
原脚本中mvn命令的-Dexpression参数被拆分到两行,会导致Maven无法识别参数。修复为单行命令:
VERSION=$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout) ARTIFACT_ID=$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.artifactId -q -DforceStdout)
3.2 Jira Fix Version处理逻辑优化
当Jira工单没有fixVersions字段时,jq会返回null,后续sort处理会出错。修改curl命令,确保无数据时返回空值:
JIRA_FIX_VERSION=$(curl -u xy@xxx.co:$DEV_JIRA_TOKEN -X GET https://xxx.yyy.net/rest/api/latest/issue/$JIRA_ID | jq -r '.fields.fixVersions[]?.name // empty')
同时调整判断逻辑,处理空值情况:
if [[ -z "$FIX_VERSION" || "$FIX_VERSION" == "null" ]]; then echo "No fix version tagged in Jira ticket thus using the default value" export FIX_VERSION="abc" fi
3.3 脚本语法闭合问题
原脚本中if [ -f "$HOME/jira_id.txt" ]; then块缺少对应的fi,会导致脚本语法错误,需要在bash -c命令前添加fi闭合if语句。
3.4 变量引用的空格处理
bash -c中的变量(如$ARTIFACT_ID、$FIX_VERSION)如果包含空格,会被拆分为多个参数,需要用双引号包裹:
bash -c "./cx scan create -s ~/repo --project-name \"$ARTIFACT_ID\" --project-tags \"$FIX_VERSION\" --branch \"$CIRCLE_BRANCH\" --apikey \"$CX_API_KEY\"; E_CODE=\$?; if [[ \$E_CODE -eq 0 ]] || [[ \$E_CODE -eq 156 ]]; then echo Success with code \$E_CODE; exit 0; else echo Fail with code \$E_CODE; exit 1; fi"
修复后的完整脚本片段示例
- run: name: cxone - Capture FIX_VERSION command: | if [ -f "$HOME/jira_id.txt" ]; then JIRA_ID=$(cat $HOME/jira_id.txt) sudo apt update && sudo apt install -y curl jq VERSION=$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout) ARTIFACT_ID=$(mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.artifactId -q -DforceStdout) curl -sLJO https://github.com/Checkmarx/ast-cli/releases/download/2.0.52/ast-cli_linux_x64.tar.gz tar -xzvf ast-cli_linux_x64.tar.gz rm -rf ast-cli_linux_x64.tar.gz JIRA_FIX_VERSION=$(curl -u xy@xxx.co:$DEV_JIRA_TOKEN -X GET https://xxx.yyy.net/rest/api/latest/issue/$JIRA_ID | jq -r '.fields.fixVersions[]?.name // empty') FIX_VERSION=$(echo "$JIRA_FIX_VERSION" | sort -V | head -n 1) if [[ -z "$FIX_VERSION" || "$FIX_VERSION" == "null" ]]; then echo "No fix version tagged in Jira ticket thus using the default value" export FIX_VERSION="abc" fi bash -c "./cx scan create -s ~/repo --project-name \"$ARTIFACT_ID\" --project-tags \"$FIX_VERSION\" --branch \"$CIRCLE_BRANCH\" --apikey \"$CX_API_KEY\"; E_CODE=\$?; if [[ \$E_CODE -eq 0 ]] || [[ \$E_CODE -eq 156 ]]; then echo Success with code \$E_CODE; exit 0; else echo Fail with code \$E_CODE; exit 1; fi" fi
内容的提问来源于stack exchange,提问作者Ayesha Khan
相关产品推荐
相关产品推荐

