如何配置CI/CD流水线,通过SSH Key或Access Token实现无用户名密码的代码拉取?
如何配置CI/CD流水线,通过SSH Key或Access Token实现无用户名密码的代码拉取?
嘿,我来帮你一步步搞定这个问题!不管你选SSH Key还是GitHub Access Token,都能实现无密码自动化拉取代码,下面分两种方案详细说明:
方案一:使用SSH Key认证
这是比较常用的长期认证方式,适合不需要频繁更换凭证的场景:
- 生成SSH密钥对:在本地机器或者CI运行环境里执行以下命令,一路回车不要设置密码(否则CI脚本无法自动完成认证):
执行完后会在ssh-keygen -t ed25519 -C "your-email@example.com"~/.ssh目录下生成id_ed25519(私钥)和id_ed25519.pub(公钥)两个文件。 - 把公钥添加到GitHub仓库:复制
id_ed25519.pub里的全部内容,打开你的GitHub仓库 → 点击顶部的「Settings」→ 左侧菜单选「Deploy keys」→ 点击「Add deploy key」,粘贴公钥内容,勾选「Allow write access」(如果你的流水线只需要拉取,不推送的话可以不勾选),最后点击「Add key」保存。 - 在CI脚本里配置私钥:
- 把生成的
id_ed25519私钥内容添加到CI平台的加密秘密变量里(比如GitHub Actions的「Secrets and variables」→「Actions」里新建Secret,命名为SSH_PRIVATE_KEY;GitLab CI则在「Settings」→「CI/CD」→「Variables」里添加)。 - 在你的CI脚本里加入以下步骤,完成SSH配置并拉取代码:
# 创建SSH目录并设置权限 mkdir -p ~/.ssh echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 # 添加GitHub主机指纹到已知主机列表,避免首次连接的确认弹窗 ssh-keyscan github.com >> ~/.ssh/known_hosts chmod 644 ~/.ssh/known_hosts # 拉取目标分支代码(如果是首次克隆) git clone git@github.com:your-username/your-repo.git -b your-target-branch # 如果是已经克隆过的仓库,直接拉取最新代码 # git pull origin your-target-branch
- 把生成的
方案二:使用GitHub Access Token认证
这种方式更灵活,可以设置权限范围和过期时间,安全性更高,适合短期场景或者需要精细权限控制的情况:
- 生成Access Token:打开GitHub个人设置 → 左侧菜单选「Developer settings」→ 「Personal access tokens」→ 「Tokens (classic)」→ 点击「Generate new token」,填写备注,勾选
repo权限(如果只需要拉取公开仓库,勾选public_repo即可;私有仓库则需要全选repo权限),设置合适的过期时间,最后点击「Generate token」,一定要把生成的token复制保存好——它只会显示一次! - 在CI脚本里配置Token:
- 把刚才生成的token添加到CI平台的加密秘密变量里,命名为
GITHUB_TOKEN。 - 在CI脚本里用HTTPS链接结合token拉取代码:
# 首次克隆目标分支 git clone https://${GITHUB_TOKEN}@github.com:your-username/your-repo.git -b your-target-branch # 如果是已克隆的仓库,先更新远程仓库URL再拉取 # git remote set-url origin https://${GITHUB_TOKEN}@github.com:your-username/your-repo.git # git pull origin your-target-branch
- 把刚才生成的token添加到CI平台的加密秘密变量里,命名为
额外小提示
如果你用的是GitHub Actions,其实官方提供了actions/checkout动作,已经内置了认证逻辑,直接用它更省心:
- name: Checkout target branch code uses: actions/checkout@v4 with: ref: your-target-branch # 指定要拉取的分支 token: ${{ secrets.GITHUB_TOKEN }} # 引用你设置的秘密变量
注意:不管用哪种方式,CI里的秘密变量一定要加密存储,绝对不能明文写在脚本里,避免凭证泄露!
备注:内容来源于stack exchange,提问作者ATUL VERMA




