前言
最近在弄 GitHub Actions 做些简单的任务, 但是中间发现了一个问题:本仓库使用Actions 时正常没有啥问题,但是一旦用一个私密仓库操作一个公共仓库(不一定是私密仓库)操作推送操作时, 就会死命报:remote: Permission to xxxx denied to github-actions[bot].
查阅了一堆资料 :
1.Personal Access Token也配置了 repo 权限
2.仓库的 "Settings" -> "Secrets" 也设置了 Secrets 变量, "Actions">"General" > "Workflow permissions" 也选择了 Read and write permissions
3.使用 HTTPS URL 进行推送
无一例外都失败 全都报:remote: Permission to xxxx denied to github-actions[bot].
查询谷歌无果后,突然想到 上个月我被github 强制开启了 两步验证 (2FA) 就是这个坑爹的两步验证,
如果你启用了两步验证 (2FA),通常是不支持在 Git 操作中直接使用用户名和密码(包括 Personal Access Token)进行推送的。2FA 要求使用访问令牌(Access Token)与密码结合使用。
在 GitHub Actions 中,如果启用了两步验证 (2FA),推送操作可能需要使用 SSH 密钥。这样可以通过配置 SSH 密钥进行认证,而不需要提供密码或访问令牌。
操作
1.生成ssh密钥(随便一个linux环境 这里我用的centos7) :
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
执行后你可以选择为 SSH 密钥设置一个密码(这里不建议设置密码了)
最后生成并 保存在/root/.ssh 目录里的 id_rsa.pub 与 id_rsa
id_rsa.pub内容添加到 被操作仓库的 "Settings" -> "Deploy keys"
id_rsa 内容添加到 操作仓库的 "Settings" -> "Secrets" 的 Secrets 变量里
最后yaml 里添加操作代码
这里给一个例子 :
- name: Push changes to HACG repository
run: |
cd HACG
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
git add .
git commit -m "Update image paths"
eval "$(ssh-agent -s)"
ssh-add - <<< "${{ secrets.SSH_PRIVATE_KEY }}"
git push git@github.com:songwqs/HACG.git main
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
一些课外补充:
定时与手动
name: Weekly Sunday Job
on:
schedule:
- cron: '0 3 * * 0' # 每周日的3点执行
jobs:
weekly_job:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
# 在这里添加你的工作流程步骤
- name: Run your tasks
run: |
echo "This job runs every Sunday at 3 AM"