如何为开启2FA的GitHub账号配置Jenkins部署流程
问题根因
你当前的配置存在两个核心问题:
- 你通过SSH在EC2实例内执行
git pull命令,该命令运行在EC2的本地环境,无法直接继承Jenkins侧注入的凭证变量 - 原代码中使用单引号包裹shell脚本,Jenkins不会解析
withCredentials生成的USERNAME、PASSWORD变量,远程执行环境根本拿不到可用的认证信息
快速修复方案
将你的部署阶段代码替换为如下版本,注意替换其中的GitHub用户名、仓库名、分支名占位符:
stage('deploy') { steps { withCredentials([usernamePassword(credentialsId: 'someid', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){ echo 'Deploying to aws ec2' // 改用双引号包裹脚本,让Jenkins可解析变量 sh """#!/bin/bash ssh ubuntu@ip-555.55.55.5 <<EOF cd /var/www/app sudo git reset --hard HEAD # 直接在git pull命令中嵌入带凭证的仓库地址,跳过交互式认证 sudo git pull https://${USERNAME}:${PASSWORD}@github.com/你的GitHub用户名/你的仓库名.git 你的目标分支名 npm install pm2 restart all exit EOF """ } } }
更安全的长期方案
命令中嵌入凭证有泄露风险,推荐改用SSH密钥认证:
- 登录EC2的ubuntu用户,执行
ssh-keygen -t ed25519生成SSH密钥对,全程按回车不需要设置密码 - 执行
cat ~/.ssh/id_ed25519.pub获取公钥,将公钥添加到你GitHub账号的SSH密钥配置中 - 在EC2的项目目录下执行
sudo git remote set-url origin git@github.com:你的GitHub用户名/你的仓库名.git,把仓库远程地址改为SSH格式 - 修改后你原来的部署脚本不需要嵌入凭证,直接执行
git pull即可正常拉取代码
注意事项
- 你存在Jenkins凭证里的密码字段必须是GitHub的个人访问令牌(PAT),开启2FA后不能用GitHub登录密码做HTTPS认证
- 建议将EC2中
/var/www/app目录的所有者改为ubuntu用户,执行sudo chown -R ubuntu:ubuntu /var/www/app,后续执行git、npm、pm2命令不需要加sudo,避免权限问题
内容的提问来源于stack exchange,提问作者Zayn
相关产品推荐
相关产品推荐

