Github 条件评估时的操作

Github actions if conditional evaluation

我创建了一个 github 操作脚本来检查股票价格在白天的更新情况(为简洁起见,在此 post 中省略了所有详细信息)。

When the current price is higher than or equal to the price limit and the previous price is lower than the price limit 
OR
When the current price is lower than or equal to the price limit and the previous price is higher than the price limit

a limit event occurs.

代码可以在下面找到,也可以在 this link

上找到
name: if conditional limit

on:
  workflow_dispatch:

jobs:
  scheduled:
    runs-on: ubuntu-latest
    steps:
    - name: Check out this repo
      uses: actions/checkout@v2
    - name: Fetch latest data
      run: |-
        prev_price=9.88
        cur_price=10.2
        echo "this is the current price ${cur_price}"
        echo "this is the previous price ${prev_price}"
        price_limit=8.81
        echo "this is the price limit ${price_limit}"
        echo "GITHUB_PRICE_LIMIT=${price_limit}" >> $GITHUB_ENV
        echo "GITHUB_CUR_PRICE=${cur_price}" >> $GITHUB_ENV
        echo "GITHUB_PREV_PRICE=${prev_price}" >> $GITHUB_ENV
        echo "GITHUB_MAIL_UPDATE=0" >> $GITHUB_ENV
    - name: test for limit event
      if: (((env.GITHUB_CUR_PRICE >= env.GITHUB_PRICE_LIMIT) &&  (env.GITHUB_PREV_PRICE < env.GITHUB_PRICE_LIMIT)) || ((env.GITHUB_CUR_PRICE <= env.GITHUB_PRICE_LIMIT) &&  (env.GITHUB_PREV_PRICE > env.GITHUB_PRICE_LIMIT)))
      run: |-
        echo "limit event occurred"

我对 github 操作很陌生,所以如果我遗漏了什么,请多多包涵。另外,如果这不是达到我想要的效果的惯用方法,请告诉我。

观察到的行为:

预期行为: No limit event should occur (according to my understanding of the defined logic)

请尝试将您的 if 逻辑包装成 ${{ }}:

    - name: test for limit event
      if: ${{ (((env.GITHUB_CUR_PRICE >= env.GITHUB_PRICE_LIMIT) &&  (env.GITHUB_PREV_PRICE < env.GITHUB_PRICE_LIMIT)) || ((env.GITHUB_CUR_PRICE <= env.GITHUB_PRICE_LIMIT) &&  (env.GITHUB_PREV_PRICE > env.GITHUB_PRICE_LIMIT))) }}
      run: |-
        echo "limit event occurred"

你的逻辑是对的,问题似乎与运行ner 读取表达式的方式有关。

关于您使用的naming convention的观察:不推荐使用前缀GITHUB_,就好像您试图覆盖默认 github 环境变量之一的值,分配将被忽略。

However, that isn't the reason why it's not working in your case.


这是我的贡献,即使我还没有找到解决方案。它可以帮助其他人...

我测试了 3 种不同的方法来执行您的操作:

  • 使用输出
  • 直接使用数值
  • 使用环境变量(像你一样或作为工作流环境变量)

直接使用数字值才按预期工作

数字

    - name: With Numbers
      run: |
        echo "(1) CURRENT PRICE >= PRICE LIMIT:" ${{ 10.20 >= 8.81 }}
        echo "(2) PREVIOUS PRICE < PRICE LIMIT:" ${{ 9.88 < 8.81 }}
        echo "(3) CURRENT PRICE <= PRICE LIMIT:" ${{ 10.20 <= 8.81 }}
        echo "(4) PREVIOUS PRICE > PRICE LIMIT:" ${{ 9.88 > 8.81 }}
        echo "(1) AND (2):" ${{ (10.20 >= 8.81) && (9.88 < 8.81) }}
        echo "(3) AND (4):" ${{ (10.20 <= 8.81) && (9.88 > 8.81) }}
        echo "(1) AND (2) OR (3) AND (4):" ${{ (((10.20 >= 8.81) && (9.88 < 8.81)) || ((10.20 <= 8.81) && (9.88 > 8.81))) }}

表达式return 其他实现的值不正确

产出

    - name: With Outputs
      run: |
        echo "(1) CURRENT PRICE >= PRICE LIMIT:" ${{ steps.datas.outputs.current >= steps.datas.outputs.limit }}
        echo "(2) PREVIOUS PRICE < PRICE LIMIT:" ${{ steps.datas.outputs.previous < steps.datas.outputs.limit }}
        echo "(3) CURRENT PRICE <= PRICE LIMIT:" ${{ steps.datas.outputs.current <= steps.datas.outputs.limit }}
        echo "(4) PREVIOUS PRICE > PRICE LIMIT:" ${{ steps.datas.outputs.previous > steps.datas.outputs.limit }}
        echo "(1) AND (2):" ${{ (steps.datas.outputs.current >= steps.datas.outputs.limit) && (steps.datas.outputs.previous < steps.datas.outputs.limit) }}
        echo "(3) AND (4):" ${{ (steps.datas.outputs.current <= steps.datas.outputs.limit) && (steps.datas.outputs.previous > steps.datas.outputs.limit) }}
        echo "(1) AND (2) OR (3) AND (4):" ${{ (((steps.datas.outputs.current >= steps.datas.outputs.limit) && (steps.datas.outputs.previous < steps.datas.outputs.limit)) || ((steps.datas.outputs.current <= steps.datas.outputs.limit) && (steps.datas.outputs.previous > steps.datas.outputs.limit))) }}

环境变量

    - name: With Env Variables
      run: |
        echo "(1) CURRENT PRICE >= PRICE LIMIT:" ${{ env.CUR_PRICE >= env.PRICE_LIMIT }}
        echo "(2) PREVIOUS PRICE < PRICE LIMIT:" ${{ env.PREV_PRICE < env.PRICE_LIMIT }}
        echo "(3) CURRENT PRICE <= PRICE LIMIT:" ${{ env.CUR_PRICE <= env.PRICE_LIMIT }}
        echo "(4) PREVIOUS PRICE > PRICE LIMIT:" ${{ env.PREV_PRICE > env.PRICE_LIMIT }}
        echo "(1) AND (2):" ${{ (env.CUR_PRICE >= env.PRICE_LIMIT) && (env.PREV_PRICE < env.PRICE_LIMIT) }}
        echo "(3) AND (4):" ${{ (env.CUR_PRICE <= env.PRICE_LIMIT) && (env.PREV_PRICE > env.PRICE_LIMIT) }}
        echo "(1) AND (2) OR (3) AND (4):" ${{ (((env.CUR_PRICE >= env.PRICE_LIMIT) && (env.PREV_PRICE < env.PRICE_LIMIT)) || ((env.CUR_PRICE <= env.PRICE_LIMIT) && (env.PREV_PRICE > env.PRICE_LIMIT))) }}

GuiFalourds的回答中得到了很多启发,所以觉得打勾是对的

为了解决这个限制,我最终创建了一个 javascript action that implements the logic. I used this tutorial 并根据我自己的目的对其进行了修改。