GitHub Action部署问题:无法拉取指定Tag版本代码
问题排查与解决方案
核心问题分析
你的部署流程存在两个关键问题:
- Runner上的操作无效:Workflow里的
git fetch origin ${{ github.ref }}是在GitHub Runner(ubuntu-latest)上执行的,但实际部署动作在EC2服务器完成,这一步对EC2上的代码仓库没有任何影响。 - EC2服务器未拉取对应Tag代码:你的
Script.sh完全没有更新EC2服务器代码仓库的步骤,直接执行依赖安装和构建,自然无法获取到指定Tag的代码。
具体修正步骤
1. 修正Deploy.yml
移除无用的Fetch only changes up to tag步骤,同时将当前Tag名称通过参数传递给EC2的部署脚本,实现精准拉取:
#Deploy.yml name: Deploy to EC2 on: push: tags: - '*' jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 with: ref: ${{ github.ref }} # 仅用于确保Workflow能正确读取部署脚本,代码拉取逻辑在EC2完成 - name: Install SSH key run: | mkdir -p ~/.ssh echo "${{ secrets.AWS_SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa - name: Add SSH key to known_hosts run: | ssh-keyscan -t rsa -H ${{ secrets.SERVER_PUBLIC_IP }} >> ~/.ssh/known_hosts - name: Deploy to EC2 run: | # 将当前Tag名称作为参数传递给EC2脚本 ssh -v -i ~/.ssh/id_rsa ubuntu@${{ secrets.SERVER_PUBLIC_IP }} "bash -s ${{ github.ref_name }}" < ./Scripts/Script.sh
2. 修正Script.sh
添加拉取指定Tag代码的步骤,替换原有的直接进入目录逻辑:
echo "********** Running Script .sh file **********" # 接收Workflow传递过来的Tag名称 TARGET_TAG=$1 cd /home/ubuntu/React-1/FJ6-Prod-React/ # 拉取远程仓库最新标签与分支信息 git fetch origin # 切换到指定Tag版本 git checkout tags/$TARGET_TAG # 强制重置本地代码,确保与Tag版本完全一致(丢弃本地未提交修改) git reset --hard tags/$TARGET_TAG # 安装依赖(用npm ci替代npm i,保证依赖版本与package-lock.json完全匹配) npm ci npm run build sudo cp -r build/* /var/www/html/ ls -l pwd sudo systemctl reload apache2 echo "********** End of Script .sh file **********"
额外说明
- 回滚旧Tag版本时,只需重新推送目标旧Tag(若之前已推送过,需用
git push origin --force <tag-name>),Workflow会自动触发并部署对应版本。 git reset --hard用于避免EC2服务器上的本地修改干扰部署,若需保留本地配置文件,可提前将文件加入.gitignore或单独备份。
内容的提问来源于stack exchange,提问作者Gaurav kedia
相关产品推荐
相关产品推荐

