Github Workflows中GITHUB_ENV变量设置与读取异常排查
问题分析与修复方案
错误1:条件判断逻辑完全颠倒
你的需求是当start_date和end_date都未填写时,设置默认值,但当前代码的条件逻辑完全相反:
if ! [[ -z "${{ inputs.start_date }}" && -z "${{ inputs.end_date }}" ]]; then
这个条件的实际含义是:只要start_date或end_date有一个不为空,就执行默认值分支,完全违背了你的预期逻辑。正确的条件应该是判断两个输入都为空时,才使用默认值。
错误2:环境变量读取方式错误
在Validate dates步骤中,你使用了${{ env.start_date }}这种GitHub模板语法读取环境变量,但模板语法是在步骤执行前就完成渲染的,而Set up dates步骤设置的环境变量是运行时生效的,模板引擎无法捕获到这些动态设置的变量值,最终会解析为空字符串。正确的做法是使用Shell原生的变量引用方式$start_date。
修复后的完整代码
- name: Set up dates id: set_dates run: | # 当两个输入都为空时,设置默认值 if [[ -z "${{ inputs.start_date }}" && -z "${{ inputs.end_date }}" ]]; then echo "start_date=$(date -u -d 'yesterday' +%Y-%m-%d)" >> $GITHUB_ENV echo "end_date=$(date -u +%Y-%m-%d)" >> $GITHUB_ENV echo "replaced dates with defaults" else echo "start_date=${{ inputs.start_date }}" >> $GITHUB_ENV echo "end_date=${{ inputs.end_date }}" >> $GITHUB_ENV echo "set dates to inputs" fi - name: Validate dates id: validate_dates run: | # 使用Shell原生变量引用读取环境变量 if [[ "$start_date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then echo "start_date of $start_date is valid" else echo "start_date of $start_date is invalid" exit 1 fi if [[ "$end_date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then echo "end_date of $end_date is valid" else echo "end_date of $end_date is invalid" exit 1 fi
额外优化建议(可选)
如果你的需求是只要其中一个输入为空就设置对应默认值(而非两个都为空才设置),可以修改Set up dates步骤的逻辑,单独处理每个日期:
run: | # 单独处理start_date:为空则设为昨天 if [[ -z "${{ inputs.start_date }}" ]]; then START_DATE=$(date -u -d 'yesterday' +%Y-%m-%d) else START_DATE="${{ inputs.start_date }}" fi # 单独处理end_date:为空则设为今天 if [[ -z "${{ inputs.end_date }}" ]]; then END_DATE=$(date -u +%Y-%m-%d) else END_DATE="${{ inputs.end_date }}" fi # 写入环境变量 echo "start_date=$START_DATE" >> $GITHUB_ENV echo "end_date=$END_DATE" >> $GITHUB_ENV echo "set dates: start=$START_DATE, end=$END_DATE"
内容的提问来源于stack exchange,提问作者Shubadecka
相关产品推荐
相关产品推荐

