解决docker jenkins ssh拉取不到gitlab代码问题

在实际的软件开发过程中,常常会使用到Docker容器来构建和部署应用程序。而Jenkins作为一个流行的持续集成工具,也被广泛应用于自动化构建和部署过程中。然而,有时候在使用Docker容器中的Jenkins时,会遇到无法通过SSH拉取GitLab代码的问题。本文将介绍如何解决这个问题,并提供相应的代码示例。

问题描述

当我们在Docker容器中运行Jenkins,并尝试通过SSH协议拉取GitLab代码时,可能会遇到如下错误信息:

Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

这通常是由于Jenkins容器无法访问到GitLab的SSH私钥文件而导致的。接下来我们将介绍如何解决这个问题。

解决方案

生成SSH密钥对

首先,我们需要在Jenkins容器中生成SSH密钥对,并将公钥添加到GitLab中。在Jenkins容器中执行以下命令:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

根据提示生成SSH密钥对后,将公钥id_rsa.pub的内容复制下来。

将公钥添加到GitLab

登录GitLab,点击头像 -> Settings -> SSH Keys,将复制的公钥内容粘贴到“Key”文本框中,并点击“Add key”按钮保存。

在Jenkins Job中配置SSH密钥

在Jenkins Job的配置中,添加SSH Credentials,选择“SSH Username with private key”类型,并填入私钥的路径。例如:

node {
    sshagent(credentials: ['your_ssh_credential_id']) {
        // 执行相关操作
    }
}

重新构建Jenkins Job

重新构建Jenkins Job,尝试通过SSH拉取GitLab代码,此时应该能够成功了。

代码示例

下面是一个简单的Jenkins Pipeline示例,用于通过SSH拉取GitLab代码:

pipeline {
    agent any
    
    stages {
        stage('Checkout') {
            steps {
                script {
                    checkout([$class: 'GitSCM',
                        branches: [[name: 'master']],
                        extensions: [[$class: 'SSHUserPrivateKey', 
                            keyFileVariable: 'SSH_PRIVATE_KEY', 
                            passphrase: '', 
                            username: 'git', 
                            credentialsId: 'your_ssh_credential_id']]],
                        userRemoteConfigs: [[url: 'git@your_gitlab_repo_url.git']]
                    )
                }
            }
        }
    }
}

序列图

下面是一个描述上述流程的序列图:

sequenceDiagram
    participant Jenkins
    participant GitLab
    Jenkins->>GitLab: 生成SSH密钥对
    GitLab->>Jenkins: 添加公钥
    Jenkins->>Jenkins: 配置SSH Credentials
    Jenkins->>GitLab: 通过SSH拉取代码

旅行图

下面是一个描述Jenkins SSH拉取GitLab代码解决方案的旅行图:

journey
    title Jenkins SSH拉取GitLab代码解决方案
    section 生成SSH密钥对
        Jenkins: 在容器中生成SSH密钥对
    section 添加公钥到GitLab
        GitLab: 将公钥添加到SSH Keys
    section 配置SSH Credentials
        Jenkins: 在Jenkins Job中配置SSH密钥
    section 重新构建Jenkins Job
        Jenkins: 通过SSH拉取GitLab代码

通过以上步骤,我们成功解决了在Docker容器中的Jenkins无法通过SSH拉取GitLab代码的问题。希望这篇文章对您有帮助!