Jenkins Docker流水线Maven Deploy至AWS CodeArtifact报401认证失败
可能的原因及解决方法
1. 环境变量未正确传递给Maven进程
你在Jenkins脚本中定义的CODEARTIFACT_AUTH_TOKEN是Groovy变量,并未暴露给sh执行的shell环境,导致Maven无法读取到该变量,最终使用空密码请求CodeArtifact引发401。
解决方法:
将变量导出为shell环境变量,或通过withEnv传递:
// 方法1:在sh块中导出变量 sh """ export CODEARTIFACT_AUTH_TOKEN=${CODEARTIFACT_AUTH_TOKEN} mvn --version mvn deploy -s settings.xml """ // 方法2:使用withEnv包裹sh执行 withEnv(["CODEARTIFACT_AUTH_TOKEN=${CODEARTIFACT_AUTH_TOKEN}"]) { sh ''' mvn --version mvn deploy -s settings.xml ''' }
2. Maven Settings.xml加载优先级或路径问题
你在Dockerfile中将settings.xml放到了/usr/share/maven/ref/,但Jenkinsfile中执行mvn deploy -s settings.xml时,若项目代码中没有该文件,Maven会尝试加载默认路径的配置,可能导致认证配置未生效。
解决方法:
- 确认项目代码中是否包含正确的
settings.xml,或直接指定容器内的配置文件路径:mvn deploy -s /usr/share/maven/ref/settings.xml - 或在Dockerfile中将配置复制到Maven默认加载路径:
COPY settings.xml /root/.m2/settings.xml
3. 挂载的.m2目录覆盖配置或存在权限问题
你在Docker启动参数中挂载了/jenkins/docker/repo:/root/.m2,该目录可能包含旧的settings.xml(未配置CodeArtifact认证),或目录权限导致Maven无法读取正确配置。
解决方法:
- 暂时移除挂载参数,重新运行流水线,若问题解决则说明挂载目录存在问题:
agent { dockerfile { label 'docker' // 注释掉挂载行 // args '-v /jenkins/docker/repo:/root/.m2' } } - 检查挂载目录下的
settings.xml内容,确保其包含正确的服务器认证配置。
4. AWS CodeArtifact令牌有效性问题
虽然你通过aws codeartifact get-authorization-token生成了令牌,但可能存在令牌截断、过期或权限不足的情况。
解决方法:
- 在Jenkins日志中确认
echo CODEARTIFACT_AUTH_TOKEN输出的令牌完整无换行/空格; - 在容器内用curl测试令牌有效性:
若返回200则令牌有效,否则重新生成令牌并检查AWS CLI命令参数(如curl -u aws:${CODEARTIFACT_AUTH_TOKEN} https://<your-domain>.d.codeartifact.eu-central-1.amazonaws.com/maven/my-snapshots/domain-owner是否正确)。
5. Maven Deploy插件版本兼容性问题
你使用的maven-deploy-plugin:3.1.1可能存在与AWS CodeArtifact的认证兼容性问题。
解决方法:
在项目pom.xml中升级插件版本:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>3.1.2</version> <!-- 或最新稳定版本 --> </plugin> </plugins> </build>
6. IAM用户权限不足
Jenkins使用的AWS-Jenkins-User可能缺少CodeArtifact部署所需的权限,虽然本地正常,但本地可能使用了不同的AWS凭证。
解决方法:
确保该IAM用户拥有以下权限:
codeartifact:GetAuthorizationTokencodeartifact:PutPackageVersioncodeartifact:PutPackageVersionAssetcodeartifact:UpdatePackageVersionStatus
可在IAM控制台为用户添加包含上述权限的策略。
内容的提问来源于stack exchange,提问作者Cornel Stefan

