Jenkins -在CMake FetchContent期间传递Git凭据

wnrlj8wa  于 2023-06-21  发布在  Jenkins
关注(0)|答案(2)|浏览(138)

Context

我目前正在做一个使用Jenkins进行持续集成的CMake项目。
这个CMake项目包括许多库,它使用FetchContent检索这些库。基本上,我们选择使用FetchContent,而不是使用Git子模块。
由于git插件,克隆项目的Jenkins和该项目的凭据很容易传递。

问题

问题是git插件没有像在克隆过程中那样传递凭证,在我的CMake项目的配置阶段,因此配置失败。我有这些日志

[1/9] Performing download step (git clone) for '<my_module>-populate'

Cloning into '<my_module>'...
fatal: could not read Username for 'https://<my_private_server>': No such device or address

解决方案的开始?

经过多次搜索,我开始使用withCredentials函数,这使得我的舞台看起来像这样:

stage('Project Configure') {
    steps {
        withCredentials([gitUsernamePassword(credentialsId: '<CredentialID>']) {
            sh "cmake --preset=MyPreset"
        }
    }
}

但这并不能完全解决问题,因为只传递了用户名,而没有传递密码。日志包括:

[1/9] Performing download step (git clone) for '<my_module>-populate'
Cloning into '<my_module>'...
****: 3: ?!: not found
error: unable to read askpass response from ****
fatal: could not read Password for 'https://<my_user>@<my_private_server>': terminal prompts disabled

限制

我也想过在Git仓库中使用SSH链接而不是HTTPS链接,但这不起作用,因为服务器上没有该功能。

mnemlml8

mnemlml81#

最后,经过多次搜索,我找到了解决方案(或者更确切地说是错误)。
你要做的就是:

stage('Project Configure') {
    steps {
         withCredentials([gitUsernamePassword(credentialsId: '<CredentialID>']) {
            sh "cmake --preset=MyPreset"
        }
    }
}

我遇到的错误是我的密码包含特殊字符(特别是&),并且它们被解释(链接到this issue?).
我只需要更改密码就可以正常工作了。

a0zr77ik

a0zr77ik2#

要解决在Jenkins中将凭据传递到CMake项目的配置阶段的问题,您可以考虑以下步骤:
1.使用withCredentials函数:修改Jenkins管道阶段,使用withCredentials函数传递用户名和密码。按如下方式更新阶段:

stage('Project Configure') {
    steps {
        withCredentials([
            usernamePassword(credentialsId: '<CredentialID>', passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')
        ]) {
            sh "export GIT_ASKPASS=/path/to/askpass.sh" // Set the path to your askpass script
            sh "echo $GIT_PASSWORD | git clone https://<my_user>@<my_private_server>/<my_module>.git"
            sh "cmake --preset=MyPreset"
        }
    }
}

1.使用askpass脚本:创建一个askpass脚本(例如askpass.sh),当Git提示输入密码时,它会提供密码。脚本应包含以下内容:

#!/bin/bash
echo "$GIT_PASSWORD"

确保在Jenkins管道步骤中更新askpass脚本的路径。
1.授予执行权限:确保askpass脚本具有执行权限。您可以通过在终端中运行以下命令来执行此操作:

chmod +x /path/to/askpass.sh

1.配置Git使用askpass脚本:通过将GIT_ASKPASS环境变量设置为askpass脚本的路径,配置Git使用askpass脚本。该步骤被包括在以上修改的流水线阶段中。
通过这些修改,用户名和密码将在CMake项目的配置阶段传递给Git clone命令。这应该允许配置继续进行,而不会遇到身份验证问题。
注意:如果SSH链接在服务器上不可用,使用带有HTTPS的askpass脚本方法应该可以提供一个解决方案。

相关问题