如何在Jenkins上让Nebula Gradle插件使用GitHub App的Git凭证?
解决Nebula Gradle插件在Jenkins中用GitHub App凭证执行Git操作的问题
问题根源
Jenkins配置的GitHub App凭证不会自动被Nebula插件内置的JGit识别,导致prepare任务执行git fetch时缺少认证提供者,抛出TransportException。
可行解决方案
1. 流水线传递GitHub App令牌给Gradle
Jenkins的GitHub App插件会生成临时访问令牌,直接把这个令牌作为系统属性传给Gradle:
pipeline { agent any steps { withCredentials([githubApp(credentialsId: '你的GitHub App凭证ID', variable: 'GITHUB_APP_TOKEN')]) { sh "./gradlew final -Dgithub.token=${GITHUB_APP_TOKEN}" } } }
2. Gradle中注入JGit凭证提供者
在项目build.gradle里添加代码,在prepare任务执行前,把令牌注入JGit的凭证系统:
import org.eclipse.jgit.transport.CredentialsProvider import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider // 任务执行前设置凭证 gradle.taskGraph.beforeTask { task -> if (task.name == 'prepare') { def githubToken = System.getProperty('github.token') if (githubToken) { // GitHub App令牌用做用户名,密码留空 CredentialsProvider.setDefault(new UsernamePasswordCredentialsProvider(githubToken, '')) } } }
3. 检查Nebula插件Git配置
确保Nebula的Git仓库用HTTPS地址,且不硬编码认证信息:
nebulaRelease { git { repoUri = 'https://github.com/yyy/zzz.git' // 不要在这里配置用户名密码,交给上面的凭证提供者处理 } }
4. 备选:通过系统Git配置注入凭证
如果上面的方法没效果,试试让系统Git配置接管认证,JGit会自动读取:
pipeline { agent any steps { withCredentials([githubApp(credentialsId: '你的GitHub App凭证ID', variable: 'GITHUB_APP_TOKEN')]) { sh "git config --global credential.helper store --file=/tmp/git-creds" sh "echo 'https://x-access-token:${GITHUB_APP_TOKEN}@github.com' > /tmp/git-creds" sh "./gradlew final" } } }
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

