如何将git凭证添加到构建中,以便能够在shell代码中使用?

7

我编写了以下Jenkinsfile:

node("master") {
 def artifactory_creds = 'XXXXXXX'
 def git_creds = 'XXXXXXX'
  java = docker.image('openjdk:8-jdk')
  java.pull()
  java.inside("-u root --ulimit core=99999999") {
      withCredentials([ // Use Jenkins credentials ID of artifactory
        [$class: 'UsernamePasswordMultiBinding', credentialsId: artifactory_creds, usernameVariable: 'A_USER', passwordVariable: 'A_PASS'],
        [$class: 'UsernamePasswordMultiBinding', credentialsId: git_creds, usernameVariable: 'G_USER', passwordVariable: 'G_PASS'] // Use Jenkins credentials ID of git
        ]) {
        sh '''
        cd $PWD && git clone ${G_USER}:${G_PASS}@github.com/ganoti/Product-Android .
            NDK_VER="r12b"
            SDK_VER="r24.4.1"
            export GRADLE_USER_HOME=$PWD/Product-Android/.gradle
            export PATH=$PATH:$GRADLE_USER_HOME:$GRADLE_USER_HOME/android-ndk-$NDK_VER
        #    apt-get update && apt-get install gcc-multilib lib32z1 make file -y
            if [ ! -d "$GRADLE_USER_HOME/android-sdk-linux" ]; then
                if [ ! -f "$GRADLE_USER_HOME/android-sdk_$SDK_VER-linux.tgz" ]; then
                    curl -o "$GRADLE_USER_HOME/android-sdk_$SDK_VER-linux.tgz" https://dl.google.com/android/android-sdk_$SDK_VER-linux.tgz
                    cd $GRADLE_USER_HOME && tar -xvzf android-sdk_$SDK_VER-linux.tgz
                fi
            fi
            if [ ! -d "$GRADLE_USER_HOME/android-ndk-$NDK_VER" ]; then
                if [ ! -f "$GRADLE_USER_HOME/android-ndk_$SDK_VER-linux.tgz" ]; then # Checks if the sdk tarball exists on system
                    curl -o "$GRADLE_USER_HOME/android-ndk-$NDK_VER-linux-x86_64.zip" https://dl.google.com/android/repository/android-ndk-$NDK_VER-linux-x86_64.zip
                    cd $GRADLE_USER_HOME && unzip -o android-ndk-$NDK_VER-linux-x86_64.zip
                fi
            fi


        # Downloads the required SDK tools
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 2 # Android SDK Tools, revision 25.2.2 rc1
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 3 # Android SDK Platform-tools, revision 24.0.2
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 4 # Android SDK Build-tools, revision 24.0.2
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 6 # Android SDK Build-tools, revision 24
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 7 # Android SDK Build-tools, revision 23.0.3
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 8 # Android SDK Build-tools, revision 23.0.2
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 30 # SDK Platform Android 7.0, API 24, revision 2
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 53 # Android TV Intel x86 Atom System Image, Android API 24, revision 6
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 54 # Android Wear ARM EABI v7a System Image, Android API 24, revision 1
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 55 # Android Wear Intel x86 Atom System Image, Android API 24, revision 1
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 57 # ARM EABI v7a System Image, Android API 24, revision 6
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 58 # Intel x86 Atom_64 System Image, Android API 24, revision 6
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 59 # Intel x86 Atom System Image, Android API 24, revision 6
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 153 # Android Support Repository, revision 36
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 160 # Google Play services, revision 32
        #    echo "y" | $GRADLE_USER_HOME/android-sdk-linux/tools/android update sdk -u -a -t 161 # Google Repository, revision 32
        # Downloads the constraint-layouts files from Artifactory
        curl -u ${A_USER}:${A_PASS} -o "$GRADLE_USER_HOME"/m2repository.tar.gz https://artifactory.company.net/android-tmp/m2repository.tar.gz
        tar -xzf $GRADLE_USER_HOME/m2repository.tar.gz -C $GRADLE_USER_HOME/android-sdk-linux/extras/
        #cd $PWD && ./gradlew -DBUILD_FLAVOR=staging -DUSE_OLD_BUILD_PROCESS=false -DCORE_BRANCH=NONE -DVERSION_NAME=4.1.10 -DAutomation_Scenario_Tag_To_Run=short_sanity -DUSE_BUNDLE_NDK=true -DIS_X86_COMPATIBLE=false -D    Automation_Device=Nexus_7 -DBUILD_TYPE=Debug -DGIT_BRANCH=origin/develop -DAutomation_Run_Config=autocad_appium -DANDROID_VIEWS_BRANCH= clean assemblestagingDebug
        ls -l $PWD
        ls -l $PWD/.gradle
      '''
        }

    }
}

我可以在不加这行代码的情况下运行此构建:
[$class: 'UsernamePasswordMultiBinding', credentialsId: git_creds, usernameVariable: 'G_USER', passwordVariable: 'G_PASS'] 

但是在添加了这一行后,当我运行构建时,出现以下错误:
org.jenkinsci.plugins.credentialsbinding.impl.CredentialNotFoundException: Credentials 'a378e16a-3d20-4465-aef1-b2bd233f15b6' is of type 'SSH Username with private key' where 'com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials' was expected

我正试图绑定Git用户名和密码,并在'''sh'''代码中像我使用Artifactory凭证一样使用它们。
有人知道我为什么会得到这个错误吗?我指定的凭证存在于Jenkins服务器上。

你不想使用SSH凭据吗?使用它会更容易和更安全。如果你愿意,我可以给出一个答案。 - Pom12
我希望如此,请创建一个答案,谢谢。 - Itai Ganot
1个回答

16

使用SSH凭据可以轻松实现这一点。

为Jenkins配置SSH凭据

首先,您需要在Jenkins实例上配置凭据,即告诉Jenkins它在哪里可以找到用于认证到您的Git存储库的私钥。 此类配置可能如下所示:

enter image description here

我个人选择为 jenkins 用户生成SSH(私钥+公钥)密钥,并将其添加到经典用户目录~/.ssh中,然后将 jenkins 用户添加为我的Git存储库合作者成员,但这取决于您。 有关为Git帐户配置SSH的更多信息,请查看Github文档,了解如何生成新的SSH密钥将新的SSH密钥添加到您的Github帐户

在您的流水线中使用SSH凭据

下一步是实际在流水线中使用凭据。以下是一个简单的示例:

node("master") {
  stage 'Checkout'
  git url: "ssh://jenkins@your.git.server:port/git-project.git",
     credentialsId: 'jenkins_ssh_key',
     branch: master

  // The rest of your Groovy here...

  stage 'Use Git'
  // Do anything you like with your Git repo
  sh 'git add -A && git commit -m "Update code" && git push origin master'
}

当在结账时声明凭据时,这些凭据将保留以供您在管道中进一步执行的所有Git命令使用,因此这应该可以解决问题。


如果密钥直接存储且是普通作业而不是管道,有没有任何方法可以做到这一点?我无法相信没有维护的插件或默认方式可以在普通作业中使用2个git存储库。管道与具有自签名证书的git存储库不兼容。 - Vincent Gerris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接