如何通过GitHub Actions将同仓库不同分支部署到自定义目录?
解决方案
完全可行,你可以通过以下两种方式实现分支对应不同部署目录的需求:
方式一:直接指定checkout的目标路径
利用actions/checkout的path参数,将代码直接拉取到你想要的目标目录,跳过默认工作目录的限制。
示例工作流文件(.github/workflows/deploy.yml):
name: 分支部署 on: push: branches: - dev - stable jobs: deploy: runs-on: self-hosted steps: - name: 确定分支对应的目标目录 id: set-target run: | if [ "${{ github.ref_name }}" = "dev" ]; then echo "target_dir=~/actions_runner/_work/projectA/projectA-dev" >> $GITHUB_OUTPUT else echo "target_dir=~/actions_runner/_work/projectA/projectA-stable" >> $GITHUB_OUTPUT fi - name: 拉取代码到目标目录 uses: actions/checkout@v4 with: path: ${{ steps.set-target.outputs.target_dir }} - name: 关联对应ENV文件 run: | TARGET_DIR=${{ steps.set-target.outputs.target_dir }} if [ "${{ github.ref_name }}" = "dev" ]; then cp $TARGET_DIR/.env.dev $TARGET_DIR/.env else cp $TARGET_DIR/.env.stable $TARGET_DIR/.env fi # 此处添加其他部署命令,如安装依赖、重启服务等
方式二:拉取后移动/复制到目标目录
如果需要保留默认的checkout流程,可在拉取代码后将默认工作目录的内容迁移到目标路径:
示例工作流核心片段:
jobs: deploy: runs-on: self-hosted steps: - name: 拉取代码到默认目录 uses: actions/checkout@v4 - name: 迁移代码到目标目录 run: | # 定义目标目录 if [ "${{ github.ref_name }}" = "dev" ]; then TARGET_DIR="~/actions_runner/_work/projectA/projectA-dev" else TARGET_DIR="~/actions_runner/_work/projectA/projectA-stable" fi # 创建目录并清空旧内容(可选) mkdir -p $TARGET_DIR && rm -rf $TARGET_DIR/* # 复制代码到目标目录 cp -r ${{ github.workspace }}/* $TARGET_DIR/ - name: 后续部署操作 run: | cd $TARGET_DIR # 执行依赖安装、服务启动等命令
关键注意点
- 用
github.ref_name变量自动获取当前推送的分支名,无需为不同分支单独编写工作流 - 确保自托管Runner用户拥有
~/actions_runner/_work/projectA目录的读写权限 - 若需要清理旧部署文件,可在复制前添加
rm -rf $TARGET_DIR/*命令
内容的提问来源于stack exchange,提问作者dayglojago
相关产品推荐
相关产品推荐

