Docker Jenkins Pipeline配置ssh key从gitlab拉取代码

1. 环境

Jenkins是k8s使用yaml运行的

[root@node02 ~]# kubectl get pods -n kube-ops
NAME                        READY     STATUS    RESTARTS   AGE
jenkins2-754c69b9c6-pr6lm   1/1       Running   0          47m

[root@node02 ~]# docker ps 
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                      NAMES
35a1313e68e2        jenkins/jenkins         "/sbin/tini -- /usr/…"   About an hour ago   Up About an hour                                               k8s_jenkins_jenkins2-754c69b9c6-pr6lm_kube-ops_28b4a548-0682-11e9-9390-000c29770a60_0

2. 进入容器生成ssh key

[root@node02 ~]# docker exec -it 35a1313e68e2 /bin/bash
#没有.ssh文件夹
jenkins@jenkins2-754c69b9c6-pr6lm:/$ cd ~/.ssh
bash: cd: /var/jenkins_home/.ssh: No such file or directory
jenkins@jenkins2-754c69b9c6-pr6lm:/$ mkdir ~/.ssh
jenkins@jenkins2-754c69b9c6-pr6lm:/$ cd ~/.ssh
jenkins@jenkins2-754c69b9c6-pr6lm:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4dgUTYXOJnAZqn373B7upua9c2L9cngoi264fa/zUKk jenkins@jenkins2-754c69b9c6-pr6lm
The key's randomart image is:
+---[RSA 2048]----+
|        o=.o.    |
|      ..o.o      |
|      .ooo       |
|     o =..+    . |
|    . o So    o  |
|       . .   o   |
|        ..  E. o |
|        .+o=Oo* o|
|        .*OBX%o=.|
+----[SHA256]-----+
jenkins@jenkins2-754c69b9c6-pr6lm:~/.ssh$ ls
id_rsa	id_rsa.pub

#查看公钥(配置在gitlab的ssh key上才能拉取代码)
[root@node02 ~]# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1ycxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxnOyR jenkins@jenkins2-754c69b9c6-pr6lm

3. 配置到gitlab

4. Jenkins创建任务测试

测试前要安装Maven插件

配置maven名称

创建测试流水线

流水线脚本

#!groovy
pipeline {
	agent any
	
	environment {
		REPOSITORY="ssh://git@gitlab.wanfei.xyz:2222/www19930327/imooc-videos-dev.git"
	}

	tools {
       		 //工具名称必须在Jenkins 管理Jenkins → 全局工具配置中预配置。
        		maven 'M3'
    	}
	
	stages {
		stage('获取代码') {
			steps {
				echo "start fetch code from git:${REPOSITORY}"
				deleteDir()
				git "${REPOSITORY}"
			}
		}
	}
}


立即构建,失败

解决办法

[root@node02 ~]# docker exec -it 35a1313e68e2 /bin/bash
jenkins@jenkins2-754c69b9c6-pr6lm:/$ cd ~/.ssh
jenkins@jenkins2-754c69b9c6-pr6lm:~/.ssh$ ls
id_rsa	id_rsa.pub  known_hosts
jenkins@jenkins2-754c69b9c6-pr6lm:~/.ssh$ git ls-remote -h ssh://git@gitlab.wanfei.xyz:2222/www19930327/imooc-videos-dev.git HEAD

构建成功

5. Jenkins slave使用jenkinsfile部署

安装Blue Ocean插件

点击打开Blue Ocean

点击创建流水线

配置gitlab ssh key,创建流水线(项目里面必须要有jenkinsfile文件)

运行

[root@wanfei ~]# kubectl get pods -n kube-ops
NAME                        READY     STATUS    RESTARTS   AGE
jenkins2-754c69b9c6-f8bnd   1/1       Running   0          1d
#在node节点新建了一个jenkins slave pod部署
[root@wanfei ~]# kubectl get pods -n kube-ops
NAME                        READY     STATUS    RESTARTS   AGE
jenkins2-754c69b9c6-f8bnd   1/1       Running   0          1d
jnlp-hczgb                  1/1       Running   0          4s

部署成功

master自动删除了slave的pod

[root@wanfei ~]# kubectl get pods -n kube-ops
NAME                        READY     STATUS    RESTARTS   AGE
jenkins2-754c69b9c6-f8bnd   1/1       Running   0          1d
<think>嗯,用户之前问过如何在GitLab配置JenkinsSSH连接权限,现在他们想知道如何在Jenkins容器中创建密钥对来连接GitLab。我需要先理解他们的需求。看起来他们可能是在使用Docker容器化的Jenkins,需要生成SSH密钥对,并将公钥添加到GitLab,以便容器内的Jenkins能够访问Git仓库。 首先,用户可能已经了解如何在宿主机上生成密钥,但容器环境可能不同。需要指导他们在容器内部生成密钥,或者将宿主机密钥挂载到容器中。同时,要考虑容器重启后密钥的持久化问题,否则每次重启容器密钥都会丢失,导致连接失败。 接下来,步骤可能包括进入Jenkins容器生成密钥对,或者使用docker exec命令执行生成密钥的操作。然后需要将公钥添加到GitLab项目的Deploy Keys或者服务账户中。此外,还要确保Jenkins容器内的SSH配置正确,比如known_hosts文件,避免主机验证问题。 用户可能的疑问点在于如何在容器中生成密钥,如何持久化存储,以及如何正确配置GitLab。可能需要详细说明每个步骤,包括具体的命令和路径。另外,用户可能对权限问题不太清楚,比如是否需要写权限,或者如何管理多个项目的访问。 还要考虑用户是否使用Docker Compose或者Kubernetes,不同的部署方式可能会影响存储卷的配置。不过用户的问题比较基础,可能只是简单的Docker运行命令,所以重点放在基本的Docker容器操作上。 最后,需要验证连接是否成功,给出测试命令,如git clone或者ssh -T,确保用户能够确认配置正确。常见问题排查部分也很重要,比如权限不足、密钥路径错误、known_hosts缺失等,帮助用户自行解决问题。</think>--- ### **在 Jenkins 容器中创建 SSH 密钥对连接 GitLab 的完整流程** 以下是分步操作指南,帮助你在 Jenkins 容器内生成 SSH 密钥对,并配置 GitLab 访问权限: --- ### **1. 进入 Jenkins 容器生成密钥对** #### **步骤说明**: 1. **进入容器终端** 使用 `docker exec` 命令进入正在运行的 Jenkins 容器: ```bash docker exec -it jenkins-container /bin/bash ``` > 📌 如果容器未使用 root 用户,可添加 `-u root` 参数(例如:`docker exec -it -u root jenkins-container /bin/bash`)。 2. **生成 SSH 密钥对** 在容器内执行以下命令(默认生成路径为 `/var/jenkins_home/.ssh/`): ```bash ssh-keygen -t rsa -b 4096 -C "jenkins-container@gitlab" ``` - 按提示操作(可直接回车跳过密码,避免交互式问题)。 3. **验证密钥文件** 检查生成的密钥文件: ```bash ls -al ~/.ssh/ # 应看到 id_rsa(私钥)和 id_rsa.pub(公钥) ``` --- ### **2. 配置 GitLab 公钥** #### **方案选择**: - **方案 A:使用 Deploy Keys(推荐单仓库访问)** 1. 复制公钥内容: ```bash cat ~/.ssh/id_rsa.pub ``` 2. 进入 GitLab 项目 -> **Settings -> Repository -> Deploy Keys** -> 添加公钥,勾选 **Write access allowed**(按需选择读写权限)。 - **方案 B:使用服务账户(多仓库访问)** 1. 在 GitLab 中创建专用用户(如 `jenkins-container`)。 2. 将公钥添加到该用户的 **SSH Keys**(路径:用户 Profile -> **SSH Keys**)。 3. 将该用户添加到目标仓库的 **Members** 中,并分配角色(如 `Developer`)。 --- ### **3. 持久化 Jenkins 容器中的 SSH 配置** #### **关键操作**: - **挂载持久化存储卷** 在启动 Jenkins 容器时,通过 Docker 卷(Volume)将 `.ssh` 目录挂载到宿主机,避免容器重启后密钥丢失: ```bash docker run -d \ --name jenkins \ -p 8080:8080 \ -v jenkins_home:/var/jenkins_home \ -v /host/path/.ssh:/var/jenkins_home/.ssh \ # 挂载 SSH 目录 jenkins/jenkins:lts ``` - **修复目录权限** 如果容器用户非 root,需确保挂载目录的权限与容器内用户一致(例如 UID 1000): ```bash chown -R 1000:1000 /host/path/.ssh ``` --- ### **4. 配置 Jenkins 凭据** 1. 进入 Jenkins 控制台 -> **Manage Jenkins -> Credentials -> System -> Global credentials**。 2. 点击 **Add Credentials**,选择类型为 **SSH Username with private key**: - **Username**:填写 GitLab 用户名(如果使用 Deploy Keys,可留空或填 `git`)。 - **Private Key**:粘贴容器内 `id_rsa` 文件内容(通过 `cat ~/.ssh/id_rsa` 获)。 3. 保存凭据,后续在 Pipeline 或 Job 中引用此凭据。 --- ### **5. 验证 SSH 连接** 在 Jenkins 容器内执行以下命令测试连通性: ```bash # 测试 GitLab 服务器响应 ssh -T git@gitlab.example.com # 预期输出:Welcome to GitLab, @username! # 测试仓库克隆权限 git clone git@gitlab.example.com:your-group/your-project.git # 应成功代码 ``` --- ### **6. 常见问题与修复** | **问题现象** | **解决方案** | |---------------------------|-----------------------------------------------------------------------------| | `Permission denied (publickey)` | 检查公钥是否正确添加到 GitLab,并确保私钥路径在 Jenkins 凭据中配置正确。 | | `Host key verification failed` | 手动将 GitLab 服务器指纹添加到容器内的 `known_hosts`:<br>`ssh-keyscan gitlab.example.com >> ~/.ssh/known_hosts` | | 容器重启后密钥丢失 | 确保通过 Docker 卷持久化挂载 `.ssh` 目录(参考步骤 3)。 | --- ### **附加:通过 Dockerfile 预配置密钥(高级)** 若需在构建镜像时预置密钥,可编写 Dockerfile: ```dockerfile FROM jenkins/jenkins:lts USER root # 生成 SSH 密钥(仅限测试环境,生产环境建议动态挂载) RUN mkdir -p /var/jenkins_home/.ssh && \ ssh-keygen -t rsa -b 4096 -N "" -f /var/jenkins_home/.ssh/id_rsa USER jenkins ``` > ⚠️ 注意:**此方法会将私钥固化到镜像中,存在安全风险,仅建议用于测试**。 --- 通过以上步骤,Jenkins 容器可通过 SSH 密钥安全访问 GitLab 仓库,适用于持续集成流水线中的代码、推送等操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值