V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MajestySolor
V2EX  ›  GitHub

问个 github workflow 的问题,求大佬帮忙

  •  
  •   MajestySolor · 2023-11-01 19:19:15 +08:00 · 950 次点击
    这是一个创建于 398 天前的主题,其中的信息可能已经有所发展或是发生改变。

    workflow 可以用exit 1来终止,这样将直接跳过后续的所有 job
    但是这样一来,这次执行就会被标记为失败
    如果我希望达成和exit 1一样的效果,也就是终止 workflow 并跳过后续 job ,但是这次执行被标记为成功,请问该如何处理

    说的可能有点抽象,我直接用具体例子吧
    比如我的 workflow 想实现如下的功能

    job1:
    获取本地仓库最新 tag ,写入环境
    获取上游仓库最新 tag ,写入环境
    比较两个 tag ,如果相同则终止 workflow 并跳过后续 job2 ,如果不同则执行 job2
    
    job2:
    do someting
    

    在比较 tags 这一步,我是这样写的

          - name: Compare Tags
            run: |
              echo $LOCAL_LATEST_TAG && echo $UPSTREAM_LATEST_TAG
    
              if [[ $LOCAL_LATEST_TAG != $UPSTREAM_LATEST_TAG ]]; then
                echo "Tags are not equal. Moving to next job."
                exit 0
              else
                echo "Tags are equal. Skipping next job."
                exit 1
              fi
    

    功能性上没有问题,能达到我想要的效果,但是如果用exit 1结束了,这次 action 就会被标记为失败,那么如果我希望即使 tags 相同终止 workflow 跳过后续也标记为成功,该怎么写呢,求大佬指导

    不得不吐槽一下 chatgpt ,指导了我半小时,最终成果还是错误百出🤣

    第 1 条附言  ·  2023-11-01 21:10:06 +08:00

    已解决,思路问题,这个需求不应该用exit来终止workflow

    第一个job获取tag然后写入outputs,然后第二个job用比较tag来判断是否执行即可

    needs: job1
    if: ${{ needs.job1.outputs.output1 != needs.job1.outputs.output2 }}
    
    5 条回复    2023-11-01 21:04:32 +08:00
    lisongeee
        1
    lisongeee  
       2023-11-01 19:43:03 +08:00
    使用 continue-on-error: true 和 if: ${{ steps.custom_id.outcome == 'success' }}

    别人写的一个示例: https://github.com/pionxzh/chatgpt-exporter/blob/54ece73b867f9fd0a220fccc41c6a33d11275448/.github/workflows/build.yml#L43-L59
    XiLingHost
        2
    XiLingHost  
       2023-11-01 19:52:18 +08:00
    https://github.com/orgs/community/discussions/25280
    参考这个讨论,建议给后续的操作加条件
    goxy
        3
    goxy  
       2023-11-01 19:57:45 +08:00
    job 一般是 parallel 的吧。可以分成两个 workflow ,用 workflow on 和 if 判断下一个 workflow 是否要执行,https://stackoverflow.com/a/68078768
    acdfjelxe
        4
    acdfjelxe  
       2023-11-01 20:17:46 +08:00
    不用 exit code 判断, 可以用比方说 env context

    ```yaml
    - name: compare
    run: |
    if [ ... ] ; then
    echo "GO_NEXT=true" >> "$GITHUB_ENV"
    fi

    - name: next
    if: ${{ env.GO_NEXT == 'true' }}
    run: |
    ....
    ```
    MajestySolor
        5
    MajestySolor  
    OP
       2023-11-01 21:04:32 +08:00
    感谢各位,是我想多了,确实不应该用`exit`
    第一个 job 获取 tag ,然而第二个 job 直接用 if 来比较 tag 即可
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1190 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:38 · PVG 02:38 · LAX 10:38 · JFK 13:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.