如何通过GitLab Runner跨Windows主机无密码执行Git拉取操作?
跨Windows主机实现GitLab CI自动Git Pull部署(无明文密码)
场景说明
作为CI/CD新手,现有环境:
- Windows 11系统
- 本地开发文件夹
blog - 目标服务器文件夹
blog1(仅允许通过git pull更新内容) - GitLab Runner已正常运行
- 现有gitlab-ci.yml在Runner与目标文件夹同主机时可正常工作,现在需要将目标文件夹迁移到另一台Windows主机,同时要把手动SSH拉取流程集成到CI脚本中,且不能在配置文件里明文写密码。
解决步骤
1. 配置SSH免密登录(核心)
先在GitLab Runner所在主机生成SSH密钥对,实现免密码登录目标Windows主机:
- 打开Runner主机的PowerShell,执行:
全程按回车(不要设置密钥密码,若必须设置密码,后续需额外配置SSH代理)。ssh-keygen -t ed25519 - 找到生成的公钥文件(默认路径:
C:\Users\[Runner主机用户名]\.ssh\id_ed25519.pub),复制其全部内容。 - 登录目标Windows主机,在
C:\Users\[目标主机用户名]\.ssh\路径下新建authorized_keys文件(若没有.ssh文件夹就手动创建),将刚才复制的公钥内容粘贴进去。 - 调整
authorized_keys文件权限:右键文件→属性→安全→高级→禁用继承→删除所有现有权限条目→仅添加目标主机用户的完全控制权限(避免权限过宽导致SSH登录失败)。 - 测试免密登录:在Runner主机执行
ssh [目标用户名]@[目标主机IP],确认无需输入密码即可成功连接。
2. 修改gitlab-ci.yml的build阶段
将原来的本地拉取命令替换为远程SSH执行命令,直接在目标主机上运行git pull相关操作:
build-job: stage: build script: - echo "远程拉取代码到目标主机" - ssh [目标用户名]@[目标主机IP] "cd C:\xampp\htdocs\blog1 && git config --global --add safe.directory C:\xampp\htdocs\blog1 && git pull origin main" test-job1: stage: test script: - echo "This job tests something" test-job2: stage: test script: - echo "This job tests something, but takes more time than test-job1." - echo "After the echo commands complete, it runs the sleep command for 20 seconds" - echo "which simulates a test that runs 20 seconds longer than test-job1" deploy-prod: stage: deploy script: - echo "This job deploys something from the $CI_COMMIT_BRANCH branch." environment: production
注意:将[目标用户名]和[目标主机IP]替换为实际信息。
3. 若使用带密码的SSH密钥(可选)
如果生成密钥时设置了密码,需要借助GitLab CI变量存储密钥,并在脚本中启动SSH代理加载:
- 在GitLab项目的设置→CI/CD→变量中添加变量
SSH_PRIVATE_KEY,值为Runner主机的私钥文件(id_ed25519)内容,开启保护和掩码选项防止泄露。 - 修改build-job脚本:
build-job: stage: build before_script: - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | ssh-add - - ssh-keyscan [目标主机IP] >> ~/.ssh/known_hosts script: - echo "远程拉取代码到目标主机" - ssh [目标用户名]@[目标主机IP] "cd C:\xampp\htdocs\blog1 && git config --global --add safe.directory C:\xampp\htdocs\blog1 && git pull origin main"
4. 额外注意点
- 目标Windows主机需开启OpenSSH服务器:设置→应用→可选功能→添加功能→搜索并安装“OpenSSH服务器”,然后在服务列表中启动
sshd服务并设置为自动启动。 - 确保目标主机的Git已配置好拉取
origin main的权限(比如已存储Git仓库的凭证,或通过SSH密钥连接Git仓库)。 - 首次连接目标主机时,会弹出主机指纹确认,可在SSH命令后添加
-o StrictHostKeyChecking=no跳过(仅限内部可信环境)。
内容的提问来源于stack exchange,提问作者wilhelmus
相关产品推荐
相关产品推荐

