如何在GitHub Action中按分支条件执行systemd服务重启
问题分析与修复
你的GitHub Action配置问题出在dev分支步骤的条件逻辑错误,导致条件判断不符合预期。另外可以简化分支判断表达式,让逻辑更清晰。
核心问题
原dev步骤的条件使用了||(逻辑或):
if: ${{ !contains(github.ref_name, 'release') || github.ref != 'refs/heads/release' }}
这个逻辑冗余且容易混乱——!contains(github.ref_name, 'release')已经包含了"不是release主分支"的情况(release主分支的github.ref_name就是"release",contains会返回true,取反后为false),额外的||判断完全多余,反而可能在边缘分支触发非预期行为。
修复后的配置
如果你的需求是:
- 所有release相关分支(包括release主分支、
release/v1.0这类前缀分支)执行release步骤 - 其他分支(比如dev)执行dev步骤
修正后的配置如下:
- name: Restart App Server release uses: appleboy/ssh-action@master # 匹配release主分支及所有以release/开头的分支 if: contains(github.ref_name, 'release') with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ secrets.SSH_PORT }} script: | cd $HOME/www/${{secrets.HOST_PATH_PROD}}/${{secrets.HOST_PROJECT}} deno upgrade sudo /etc/init.d/nginx reload sudo systemctl daemon-reload sudo systemctl restart ${{secrets.META_SERVICE_PROD}} - name: Restart App Server development uses: appleboy/ssh-action@master # 仅当分支不包含release标识时执行 if: !contains(github.ref_name, 'release') with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ secrets.SSH_PORT }} script: | cd $HOME/www/${{secrets.HOST_PATH_DEV}}/${{secrets.HOST_PROJECT}} deno upgrade sudo /etc/init.d/nginx reload sudo systemctl daemon-reload sudo systemctl restart ${{secrets.META_SERVICE_DEV}}
精准分支匹配(可选)
如果你希望仅release主分支和dev分支分别执行对应步骤(排除feature等其他分支),可以改为:
- name: Restart App Server release uses: appleboy/ssh-action@master if: github.ref_name == 'release' with: # 同上述配置内容 - name: Restart App Server development uses: appleboy/ssh-action@master if: github.ref_name == 'dev' with: # 同上述配置内容
补充说明
GitHub Action的if条件对uses步骤完全生效,不需要放到run块中。修正逻辑后,分支判断就能按照预期触发对应步骤。
内容的提问来源于stack exchange,提问作者chovy
相关产品推荐
相关产品推荐

