使用GitHub Action更新README文件失败问题求助
解决GitHub Action更新README未生效的问题
问题场景
想要通过GitHub Action更新仓库README中被<!-- start-quote --><!-- end-quote -->标记的段落,编写了如下Workflow:
name: readme-quote on: push: schedule: - cron: '0 */12 * * *' jobs: add_quote: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Get an inspirational quote run: | QUOTE="This quote is fetched from a remote api using CURL" echo "$QUOTE" - name: Update quote in readme run: |- # Set a default quote if the echo "${QUOTE:=>Silence is Golden}" # Disable interpreting exclamation mark! as a command histchars= # Set delimiters to variables start_delimiter="<!-- start-quote -->" end_delimiter="<!-- end-quote -->" # Remove previous quote with its delimter sed -i "/$start_delimiter/,/$end_delimiter/d" README.md # Add the new quote to the README file printf "$start_delimiter\n$QUOTE\n$end_delimiter\n" >> README.md - name: Commit and push changes if README changed run: |- git diff git config --local user.email "github-actions@example.com" git config --local user.name "GitHub Actions" git add README.md git diff --quiet || (git add README.md && git commit -m "Added new quote to README") git push origin main
该Workflow本地运行正常,GitHub Actions显示执行成功,但README并未更新。日志显示文件已被修改,但最后输出Everything up-to-date:
Run git diff git diff git config --local user.email "github-actions@example.com" git config --local user.name "GitHub Actions" git add README.md git diff --quiet || (git add README.md && git commit -m "Added new quote to README") git push origin main shell: /usr/bin/bash -e {0} diff --git a/README.md b/README.md index 94b5482..ce225aa 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,5 @@ <!-- start-quote --> -<!-- end-quote --> \ No newline at end of file +> Silence is Golden +<!-- end-quote --> Everything up-to-date
问题原因
- 环境变量跨Step不共享:在
Get an inspirational quote步骤中定义的QUOTE变量仅在当前Step的Shell中有效,后续Update quote in readme步骤无法访问该变量,导致只能使用默认值。 - Commit逻辑错误:提前执行了
git add README.md,之后用git diff --quiet检查工作区与暂存区的差异,此时两者已无差异,因此不会触发commit操作,最终push时没有可提交的内容。
修复方案
1. 修正环境变量传递
在获取quote的步骤中,将变量写入GITHUB_ENV,让后续步骤能读取到:
- name: Get an inspirational quote run: | QUOTE="This quote is fetched from a remote api using CURL" echo "QUOTE=$QUOTE" >> $GITHUB_ENV
2. 修复Commit逻辑
移除提前执行的git add README.md,改为在检测到文件与仓库HEAD有差异时,再执行add和commit:
- name: Commit and push changes if README changed run: |- git config --local user.email "github-actions@example.com" git config --local user.name "GitHub Actions" # 检查README与HEAD版本是否有差异 if ! git diff --quiet HEAD -- README.md; then git add README.md git commit -m "Added new quote to README" git push origin main fi
3. 完善默认值赋值
在Update quote in readme步骤中,要将默认值实际赋值给QUOTE变量,而不是仅打印:
- name: Update quote in readme run: |- # 设置默认quote QUOTE="${QUOTE:=>Silence is Golden}" # 禁用感叹号的命令解析 histchars= # 定义分隔符变量 start_delimiter="<!-- start-quote -->" end_delimiter="<!-- end-quote -->" # 删除之前的quote及分隔符 sed -i "/$start_delimiter/,/$end_delimiter/d" README.md # 将新quote添加到README printf "$start_delimiter\n$QUOTE\n$end_delimiter\n" >> README.md
完整修复后的Workflow
name: readme-quote on: push: schedule: - cron: '0 */12 * * *' jobs: add_quote: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Get an inspirational quote run: | QUOTE="This quote is fetched from a remote api using CURL" echo "QUOTE=$QUOTE" >> $GITHUB_ENV - name: Update quote in readme run: |- # 设置默认quote QUOTE="${QUOTE:=>Silence is Golden}" # 禁用感叹号的命令解析 histchars= # 定义分隔符变量 start_delimiter="<!-- start-quote -->" end_delimiter="<!-- end-quote -->" # 删除之前的quote及分隔符 sed -i "/$start_delimiter/,/$end_delimiter/d" README.md # 将新quote添加到README printf "$start_delimiter\n$QUOTE\n$end_delimiter\n" >> README.md - name: Commit and push changes if README changed run: |- git config --local user.email "github-actions@example.com" git config --local user.name "GitHub Actions" # 检查README是否有修改 if ! git diff --quiet HEAD -- README.md; then git add README.md git commit -m "Added new quote to README" git push origin main fi
内容的提问来源于stack exchange,提问作者Drk
相关产品推荐
相关产品推荐

