如何在GitHub Actions中通过SSH在远程服务器B执行Checkout(非git clone)
问题描述
假设有两台机器A和B,机器A是GitHub Actions自托管Runner。使用actions/checkout Action时,代码会拉取到机器A;现在想通过SSH连接到机器B,无需使用git clone或appleboy/ssh-action,如何在机器B上完成代码拉取(类似checkout的效果)?
示例工作流:
jobs: test: runs-on: self-hosted [Machine A] steps: - name: checkout uses: actions/checkout@v2 # 代码会拉取到机器A - name: ssh # 假设已经SSH连接到远程机器B # 如何在B上完成checkout操作,而不用git clone?是否可行?
可行方案
方案1:打包代码后通过SCP传输到机器B
既然已经在A上完成了checkout,直接把代码目录打包传到B再解压,就能得到和A一致的代码文件:
- 在机器A上打包当前代码目录:
tar -czf code.tar.gz ./ - 用SCP把压缩包传到机器B的目标目录:
scp code.tar.gz 你的B机器用户名@机器B地址:/你要存放代码的路径/ - SSH到机器B并解压清理:
ssh 你的B机器用户名@机器B地址 "cd /你要存放代码的路径/ && tar -xzf code.tar.gz && rm code.tar.gz"
方案2:用rsync通过SSH同步代码目录
rsync可以高效同步本地(A)和远程(B)的目录,只传输差异文件,能保持B的代码和A完全一致:
rsync -avz --delete ./ 你的B机器用户名@机器B地址:/你要存放代码的路径/
--delete参数会删除B目录中A没有的文件,完全复刻A上的checkout结果。
方案3:通过SSH管道直接传输目录内容
不想生成本地压缩包的话,可以用tar结合SSH管道,直接把A的代码传到B并解压:
tar -czf - ./ | ssh 你的B机器用户名@机器B地址 "cd /你要存放代码的路径/ && tar -xzf -"
注意事项
- 要确保机器A已经配置了免密SSH登录机器B,不然需要在工作流里用
ssh-agentAction管理SSH密钥完成认证。 - 如果机器B的目标目录还没创建,可以在SSH命令里加上创建指令,比如:
ssh 你的B机器用户名@机器B地址 "mkdir -p /你要存放代码的路径/ && cd /你要存放代码的路径/ && tar -xzf -"
内容的提问来源于stack exchange,提问作者sai deekshith
相关产品推荐
相关产品推荐

