我正在尝试从GitHub action推送到origin
remote。我的操作逻辑是:
- 处理
pull_request_review
事件并按注解消息过滤 - checkout 到master,合并PR分支,运行一些检查并将其推送到
origin
脚本是:
if [[ "${GITHUB_EVENT_NAME}" != "pull_request_review" ]]; then
echo "unsupported event: ${GITHUB_EVENT_NAME}"
exit 1
fi
user=$(jq -r .review.user.login ${GITHUB_EVENT_PATH})
cmd=$(jq -r .review.body ${GITHUB_EVENT_PATH})
echo "reviewer is ${user}, command is ${cmd}"
if [[ "${cmd}" == "merge" ]]; then
head=$(jq -r .pull_request.head.ref ${GITHUB_EVENT_PATH})
git config user.email test@test.com
git config user.name test
git checkout -B _tmp origin/${head}
git checkout -B master origin/master
git merge --no-ff _tmp
git push origin master
fi
我在alpine:3.10
Docker容器中运行这个脚本:
FROM alpine:3.10
LABEL "com.github.actions.name"="Hello world action"
LABEL "com.github.actions.icon"="shield"
LABEL "com.github.actions.color"="green"
WORKDIR /app
COPY action.sh action.sh
RUN apk --update add bash git jq
CMD ["bash", "/app/action.sh"]
第一步工作正常( checkout 和合并),但由于错误,操作无法将合并推送到origin
:
- git push origin master
fatal:could not read用户名for 'https://github.com':无此类设备或地址
看起来GitHub-action Docker容器没有配置为推送到GitHub。我该如何配置它?是否可以使用GitHub提供的一些env变量或一些挂载的文件(如/github/*
路径)?
6条答案
按热度按时间cunj1qz11#
以下是如何使用官方github action actions/checkout@v3的示例:
ff29svar2#
所有的回复都很棒,但是我应该注意到有一个GitHub Action Add & Commit大大简化了这个过程。
bybem2ql3#
所有提供的答案都是正确的。但我想在这些答案中添加更多内容。可能会有文件没有更改的情况。因此,在这种情况下,当尝试执行
git commit
命令时,它会返回一个错误,导致GitHub工作流失败(失败的工作流阻止PR合并)。因此,我们必须在提交之前检查文件中是否有任何更改。上面的工作流是一个使用jsonnet和GitHub工作流创建配置文件的例子。它首先安装jsonnet并运行一个python脚本,该脚本使用jsonnet模板创建配置文件。如上所述,可能存在没有文件更改的情况。因此它使用
git status
命令来检查是否有任何文件更改。(也可以使用git diff
代替git status
。但它不会显示未跟踪的文件)。其余的git命令仅在文件更改时运行。还要注意,即使我使用了
checkout@v2
,我也必须使用ref: ${{ github.head_ref }}
来 checkout 到源分支(在我的情况下仍然存在分离头问题)kmb7vmvb4#
对于不定义用户或任何东西的自动提交,使用
EndBug/add-and-commit@v7
。8cdiaqws5#
actions/checkout@v2
checkout的版本2解决了分离HEAD状态的问题,并简化了推送到原点的过程。
如果需要push事件触发其他工作流,请使用
repo
作用域Personal Access Token。actions/checkout@v1(原始答案)
为了给@rmunn的精彩回答添加更多细节。问题是
actions/checkout@v1
操作使git仓库处于分离HEAD状态。请参阅此问题以了解更多详细信息:https://github.com/actions/checkout/issues/6下面是一个完整的示例,演示如何将 checkout 的存储库变为可用状态并推送到远程。
要包括未跟踪的(新)文件,请更改工作流以使用以下内容。
上述工作流应该适用于大多数事件。对于
on: pull_request
工作流,应该检出合并分支(GITHUB_HEAD_REF
)以替换默认的合并提交。**重要提示:**如果您在以下工作流之外还有其他拉取请求检查,则必须使用Personal Access Token而不是默认的
GITHUB_TOKEN
。这是由于GitHub Actions故意限制工作流引发的事件(例如push
)不能触发进一步的工作流运行。这是为了防止意外的“无限循环”情况,也是一种反滥用措施。使用repo
范围内的Personal Access Token是一种经批准的解决方案。有关解决方案的详细信息,请参阅this GitHub issue。有关在
on: pull_request
工作流期间推送到原点的更多示例,请参阅此博客文章GitHub Actions: How to Automate Code Formatting in Pull Requests。9bfwbjaz6#
您可以使用
secrets.GITHUB_TOKEN
作为仓库URL的密码。因此,您可以在git push
行之前添加以下内容:这里假设你已经将GITHUB_TOKEN secret作为环境变量传递给了你的脚本。如果没有,那么添加:
到您的工作流步骤。