Github Actions条件满足时指定步骤未执行问题求助
Github Actions备份步骤未触发的问题解决
我在代码仓库中运行一个用于部署应用的Github Actions工作流,包含两个核心步骤:检查远程服务器上的Docker镜像是否存在,若存在则执行镜像备份。工作流的原配置如下:
- name: Check if latest image exists id: check_latest_image uses: appleboy/ssh-action@master with: host: ${{ env.SSH_HOST }} username: ${{ env.SSH_USER }} password: ${{ env.SSH_PASSWORD }} key: ${{ env.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | if docker image inspect crm/api-publisher-consumer:latest &> /dev/null; then echo "::set-output name=image_exists::true" else echo "::set-output name=image_exists::false" fi - name: Backup previous state if: steps.check_latest_image.outputs.image_exists == 'true' uses: appleboy/ssh-action@master with: host: ${{ env.SSH_HOST }} username: ${{ env.SSH_USER }} password: ${{ env.SSH_PASSWORD }} key: ${{ env.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | cd ~/TestServer/crm/crm-api docker tag crm/api-publisher-consumer:latest crm/api-publisher-consumer:backup
按预期,check_latest_image步骤会设置输出参数image_exists为true,后续Backup previous state步骤会根据该条件判断是否执行。但实际运行时,尽管检查步骤的日志显示已输出image_exists的值,备份步骤始终未运行:
======CMD====== if docker image inspect crm/api-publisher-consumer:latest &> /dev/null; then echo "::set-output name=image_exists::'true'" else echo "::set-output name=image_exists::'false'" fi ======END====== out: ::set-output name=image_exists::'true' ============================================== ✅ Successfully executed commands to all host. ==============================================
问题原因
从日志可以看到,实际输出的image_exists值是'true'(带有单引号),而工作流中判断条件是steps.check_latest_image.outputs.image_exists == 'true'——这里比较的是不带单引号的字符串true,两者不匹配,因此条件不成立,备份步骤不会执行。
解决方案
修改check_latest_image步骤中的echo语句,去掉true和false两侧的单引号,确保输出的是纯字符串值:
- name: Check if latest image exists id: check_latest_image uses: appleboy/ssh-action@master with: host: ${{ env.SSH_HOST }} username: ${{ env.SSH_USER }} password: ${{ env.SSH_PASSWORD }} key: ${{ env.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | if docker image inspect crm/api-publisher-consumer:latest &> /dev/null; then echo "::set-output name=image_exists::true" else echo "::set-output name=image_exists::false" fi
验证效果
修改后,检查步骤的输出会变为::set-output name=image_exists::true(不带单引号),此时判断条件steps.check_latest_image.outputs.image_exists == 'true'会正确匹配,备份步骤将按预期执行。
内容的提问来源于stack exchange,提问作者Gill Mertens
相关产品推荐
相关产品推荐

