GitHub Actions
一、基本概念
GitHub Actions 额度(主要是运行分钟数),最直接的方法是去 GitHub 的账单设置里看。不同计划的免费额度不一样:
- GitHub Free(个人/组织):私有仓库每月 2,000 分钟
- GitHub Pro:私有仓库每月 3,000 分钟
- GitHub Team / Enterprise:通常是 3,000 分钟起,随账号数增加
1.工作流(Workflows)
工作流是 GitHub Actions 的核心,它是一个可配置的自动化过程,用于运行一个或多个任务(Jobs)。工作流通过 YAML 文件定义,并在特定事件触发时运行。你可以在仓库的 .github/workflows 目录下创建多个工作流文件,每个文件对应不同的任务,如构建和测试拉取 请求、部署应用到云端等。
2. 事件(Events)
事件是触发工作流的特定活动。例如,代码推送、问题创建或拉取请求提交都会触发相应的事件。通过指定事件类型,你可以精确控制工作流的触发条件,避免不必要的资源消耗。
3. 任务(Jobs)
任务是工作流中的基本执行单元,可以并行或顺序运行。每个任务包含一系列步骤,用于执行命令或操作。通过设置任务依赖关系,你可以确保某些任务在其他任务完成后才开始执行。
4. 运行器(Runners)
运行器是执行工作流的服务器,每次只能处理一个任务。GitHub 提供了多种运行器环境,包括 Ubuntu Linux、Microsoft Windows 和 macOS,以满足不同开发需求。
二、GitHub Actions 语法详解
1.workflow
在项目库根路径下的.github/workflows目录中创建一个.yml 文件(或者 .yaml):
name: hello-github-actions
# 触发 workflow 的事件
on:
push:
# 分支随意
branches:
- master
# 一个workflow由执行的一项或多项job
jobs:
# 一个job任务,任务名为build
build:
#运行在最新版ubuntu系统中
runs-on: ubuntu-latest
#步骤合集
steps:
#新建一个名为checkout_actions的步骤
- name: checkout_actions
#使用checkout@v2这个action获取源码
uses: actions/checkout@v2
#使用建一个名为setup-node的步骤
- name: setup-node
#使用setup-node@v1这个action
uses: actions/setup-node@v1
#指定某个action 可能需要输入的参数
with:
node-version: '14'
- name: npm install and build
#执行执行某个shell命令或脚本
run: |
npm install
npm run build
- name: commit push
#执行执行某个shell命令或脚本
run: |
git config --global user.email xxx@163.com
git config --global user.name xxxx
git add .
git commit -m "update" -a
git push
# 环境变量
env:
email: xxx@163.com2.name
Workflow的名字,随便可以设置,就是工作流的名字。如果省略该字段,默认为当前 workflow 的文件名。
name: hello-github-actions3.on
触发的事件,可以是一个事件数组。 在代码仓库Push时触发:
#push时触发
on: push可以用数组指定多个条件触发:
#push和merge时触发
on: [push, merge]还可以对条件进行限制触发:
#当master分支push时触发,可以限定分支或标签。
on:
push:
branches:
- master4.jobs
jobs表示要执行的一项或多项任务。jobs可以包含一个或多个job,一个job就是一个任务,这个任务可以包含多个步骤(steps):
jobs:
job1:
...
job2:
...需要注意的是每一个Job都是并发执行的并不是按照申明的先后顺序执行的, 如果多个job 之间存在依赖关系,那么你可能需要使用 needs :
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]这里的needs声明了job2 必须等待 job1 成功完成,job3必须等待 job1 和 job2依次成功完成。因此,这个 workflow 的运行顺序依次为:job1、job2、job3。needs字段指定当前任务的依赖关系,即运行顺序。
4.1.job->runs-on
runs-on字段指定运行所需要的虚拟机环境。它是必填字段,目前可用的虚拟机如下:
- ubuntu-latest,ubuntu-18.04或ubuntu-16.04。
- windows-latest,windows-2019或windows-2016。
- macOS-latest或macOS-10.14。
jobs:
job1:
runs-on: ubuntu-18.04
job2:
runs-on: macos-10.15
job3:
runs-on: windows-20194.2.job->env
使用env可以给该任务或者是步骤配置环境变量:
env:
name: "zhangsan"
run: |
echo $name环境变量可以配置在以下地方:
- jobs->job->env
- jobs->job->steps.env
4.3.job->steps
steps字段指定每个 Job 的运行步骤,每个job由多个step构成,它会从上至下依次执行。steps可以包含一个或多个步骤,每个 step 步骤可以有:
- name:步骤名称,步骤的名称。
- env:该步骤所需的环境变量。
- id : 每个步骤的唯一标识符
- uses : 使用哪个action,这个表示使用别人预先设置好的Actions,比如因为我代码中要用到python,所以就用了actions/setup-python@v1来设置python环境,不用我自己设置了。
- with: 指定某个action 可能需要输入的参数。
- run: 执行哪些指令,具体运行什么命令行代码。
- continue-on-error : 设置为 true 允许此步骤失败job 仍然通过。
- timeout-minutes : step 的超时时间。
...
name: Sync To Gitee
on: [ push ]
jobs:
sync:
runs-on: ubuntu-latest
steps:
#创建一个打印环境变量的步骤
- name: PrintName
env:
name: "zhangsan"
run: |
echo $name
#创建一个安装Python环境的步骤
- name: SetUpPython
uses: actions/setup-python@v1
with:
python-version: 3.7
#创建一个安装Python包的步骤
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests
pip install bs4
pip install lxml使用uses指的是这一步骤需要先调用哪个 Action。 Action 是组成工作流最核心最基础的元素。 每个 Action 可以看作封装的独立脚本,有自己的操作逻辑,我们只需要 uses 并通过 with 传入参数即可。 比如 actions/checkout@v2 就是官方社区贡献的用来拉取仓库分支的 Action, 你不需要考虑安装 git 命令工具,只需要把分支参数传入即可。
5.Action
Github Actions 是GitHub的持续集成服务。持续集成由很多操作组成,比如登录远程服务器,发布内容到第三方服务等等,这些相同的操作完全可以提取出来制作成脚本供所有人使用。GitHub允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用该脚本,这个脚本就是一个Action。如果你需要某种功能的Action可以从GitHub社区共享的action官方市场查找,也可以自己编程Action开源出来供大家使用。既然 actions 是代码仓库,当然就有版本的概念,用户可以引用某个具体版本的 action。 下面都是合法的 action 引用:
actions/setup-node@74bc508 # 指向一个 commit
actions/setup-node@v1.0 # 指向一个标签
actions/setup-node@master # 指向一个分支三、GitHub Actions 中使用密文
在持续集成的过程中,我们可能会使用到自己的敏感数据,这些数据不应该被开源并泄露。那么如何才能安全的使用这些敏感数据呢?GithubActions提供了Secrets变量来实现这一效果。我们可以在 github repo 上依次点击 Settings -> Secrets-> Actions->New repository secret创建一个敏感数据例如:OSS_KEY_ID,OSS_KEY_SECRET, 然后我们就可以在GithubAction脚本中使用这一变量了:
- name: setup aliyun oss
uses: manyuanrong/setup-ossutil@master
with:
endpoint: oss-cn-beijing.aliyuncs.com
access-key-id: ${{ secrets.OSS_KEY_ID }}
access-key-secret: ${{ secrets.OSS_KEY_SECRET }}这里的secret就是一种context,描述 CI/CD 一个workflow 中的上下文信息,使用$语法表示。
四、GitHubAction执行结果
对于GitHubAction的执行流程我们可以通过repo 上依次点击Actions就可以看到Action的状态和执行结果等信息:

五、举个例子
1、环境介绍
这里有一个SpringBoot3 + Vue3的前后端分离项目作为示范,这里为了演示将两个项目分别放入了两个GitHub仓库中实现CICD,在真实生产中可以放入一个仓库即可
这里使用Docker部署
在服务器上创建一个工作目录,并创建一个logs放后端日志
mkdir /home/coco-chat-test
mkdir /home/coco-test/logs
chmod -R 777 logs/写入docker-compose.yml.构建完成方便部署,下面是我自己使用的,改成自己的就行:
services:
backend:
image: ${DOCKER_NAME}/coco-chat-backend:latest
container_name: chat-server
restart: always
# ❌ 移除端口映射,完全走 Docker 内网 + Cloudflare Tunnel
# 如需服务器本地调试,可临时取消注释(仅监听 127.0.0.1)
# ports:
# - "127.0.0.1:8089:8089"
volumes:
- ./logs:/app/logs
environment:
- MINIO_ENDPOINT=${MINIO_ENDPOINT}
- MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY}
- MINIO_SECRET_KEY=${MINIO_SECRET_KEY}
networks:
- shared-network # 同一个外部网络
frontend:
image: ${DOCKER_NAME}/coco-chat-frontend:latest
container_name: chat-client
restart: always
# ❌ 移除 80 端口映射,完全通过 cloudflared 访问
# ports:
# - "80:80"
depends_on:
- backend
networks:
- shared-network # 同一个外部网络
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: always
command: tunnel run --token ${TUNNEL_TOKEN}
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
networks:
- shared-network # 同一个外部网络
depends_on:
- frontend
- backend
networks:
shared-network:
external: true # 引用同一个外部网络2、GitHub Secrets 配置(核心步骤)
进入你的 GitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret,添加以下 5 个:
| Secret 名称 | 说明 | 示例 |
|---|---|---|
DOCKER_USERNAME | Docker Hub 用户名 | zhangsan |
DOCKER_PASSWORD | Docker Hub 访问令牌(不是登录密码!) | dckr_pat_xxxx... |
SSH_HOST | 云服务器 IP | 123.45.67.89 |
SSH_USERNAME | 服务器登录用户名 | root 或 ubuntu |
SSH_PRIVATE_KEY | 服务器私钥(~/.ssh/id_rsa 的内容) | -----BEGIN OPENSSH PRIVATE KEY-----... |
SSH_PORT | SSH 端口(可选,默认 22) | 22 |
关于 Docker Hub 访问令牌
Docker Hub 现在强制要求用 Access Token 代替密码:
- 登录 hub.docker.com
- Account Settings → Security → New Access Token
- 复制生成的 token 填入
DOCKER_PASSWORD
3、服务器端准备工作(只需配置一次)
SSH 连接到你的云服务器,执行:
# 1. 安装 Docker(如果还没装)
curl -fsSL https://get.docker.com | bash
sudo systemctl enable docker
sudo systemctl start docker
# 2. 确保当前用户能执行 docker 命令(免 sudo)
sudo usermod -aG docker $USER
# 然后重新登录或执行:newgrp docker
# 3. 配置 SSH 免密登录(让 GitHub Actions 能连上你的服务器)
# 在你的本地电脑(或任意有 ssh-keygen 的机器)执行:
# ssh-keygen -t ed25519 -C "github-actions" -f ~/.ssh/github_actions
# ssh-copy-id -i ~/.ssh/github_actions.pub root@你的服务器IP
# 然后把 ~/.ssh/github_actions 的私钥内容复制到 GitHub Secrets 的 SSH_PRIVATE_KEY4、前端构建
在你的前端项目根目录下,创建以下 3 个文件:
4.1.Dockerfile
# ==========================================
# 阶段一:构建 Vue 项目
# ==========================================
FROM node:22-alpine AS builder
WORKDIR /app
# 先复制依赖文件,利用 Docker 缓存层
COPY package*.json ./
# 使用 npm ci 确保干净安装(比 npm install 更适合 CI)
RUN npm ci
# 复制源代码并构建
COPY . .
# 如果 type-check 经常失败,这里先用 build-only 保证镜像能出来
# 你可以在本地修复完类型错误后,改回 npm run build
RUN npm run build-only
# ==========================================
# 阶段二:生产环境(Nginx 托管静态文件)
# ==========================================
FROM nginx:alpine
# 从构建阶段复制打包后的文件
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制自定义 Nginx 配置(处理 Vue Router 的 history 模式)
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]4.2.nginx.conf
使用你之前的nginx.conf就行,下面是我使用的,不展开说明
server {
listen 80;
server_name _;
# 前端静态页面
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
# API 接口代理
location /api/ {
proxy_pass http://backend:8089/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# Socket.IO WebSocket 代理(核心配置)
location /socket.io/ {
proxy_pass http://backend:9092/socket.io/; # Docker 内部通过服务名访问
proxy_http_version 1.1;
# WebSocket 升级头
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 长连接超时(必须!)
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
}4.3..github/workflows/deploy.yml
name: Build & Deploy to Server
on:
push:
branches: [main, master]
# 支持手动触发(方便调试)
workflow_dispatch:
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
# 1. 拉取代码
- name: Checkout code
uses: actions/checkout@v4
# 2. 设置 Node.js 环境(必须匹配你的 engines 要求)
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
# 3. 安装依赖
- name: Install dependencies
run: npm ci
# ==========================================
# 【关键】构建步骤:提供两种方案,按你的情况选择
# ==========================================
# 方案 A:完整构建(含类型检查)—— 推荐,但要保证本地能通过
# - name: Build project
# run: npm run build
# 方案 B:仅构建,跳过类型检查 —— 如果你 type-check 老是报错,先用这个
- name: Build project
run: npm run build-only
# 如果构建时内存不足,加上这行(取消注释即可):
# env:
# NODE_OPTIONS: --max-old-space-size=4096
# 4. 设置 QEMU(支持多架构构建,可选)
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
# 5. 设置 Docker Buildx
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# 6. 登录 Docker Hub
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 7. 构建并推送镜像(带缓存加速)
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64 # 如果你的服务器是 ARM(如树莓派),改成 linux/arm64
push: true
tags: |
${{ secrets.DOCKER_USERNAME }}/coco-chat-frontend:latest
${{ secrets.DOCKER_USERNAME }}/coco-chat-frontend:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
# 8. 通过 SSH 部署到云服务器
- name: Deploy to Server
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT || '22' }}
script: |
echo ">>> 拉取最新镜像"
docker pull ${{ secrets.DOCKER_USERNAME }}/coco-chat-frontend:latest
echo ">>> 停止并删除旧容器(如果存在)"
cd /home/coco-chat-test || exit 1
docker compose down || true
# docker rm coco-chat || true
echo ">>> 启动新容器"
docker compose up -d --build
# docker run -d \
# --name coco-chat \
# --restart always \
# -p 80:80 \
# ${{ secrets.DOCKER_USERNAME }}/coco-chat-frontend:latest
echo ">>> 清理旧镜像,节省空间"
docker image prune -f
echo ">>> 部署完成"5.后端构建
5.1.Dockerfile
# 多阶段构建,减少最终镜像体积
FROM eclipse-temurin:17-jdk-alpine AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
# 使用 Maven Wrapper 或系统 Maven
RUN apk add --no-cache maven
RUN mvn clean package -DskipTests
# 运行阶段
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
# 复制构建产物
COPY --from=builder /app/target/*.jar app.jar
# 创建日志目录(与 application.yml 中的配置对应)
# 创建日志目录并设置权限
RUN mkdir -p /app/logs && chmod 777 /app/logs
# 暴露端口(根据你的 application.yml 调整)
EXPOSE 8089
ENTRYPOINT ["java", "-jar", "app.jar"]5.2..github/workflows/deploy.yml
# ============================================
# 工作流名称:会在 GitHub Actions 页面左侧显示
# ============================================
name: Backend CI/CD
# ============================================
# 触发条件:什么时候自动跑这个流水线
# ============================================
on:
push:
# 只有推送到 main 或 master 分支时才触发
branches: [ main, master ]
# 忽略这些文件的变更,改它们不触发部署(节省资源)
paths-ignore:
- '**.md' # 所有 markdown 文档
- '.gitignore' # git 忽略文件
pull_request:
# 向 main/master 分支提交 PR 时触发(通常只做构建+测试,不部署)
branches: [ main, master ]
workflow_dispatch:
# 允许在 GitHub 网页上手动点击"Run workflow"按钮触发
# 用途:紧急回滚、调试、不想等代码推送时手动部署
# ============================================
# 全局环境变量:所有 job 都能用的变量
# ============================================
env:
# Docker 镜像仓库地址,docker.io 就是 Docker Hub
REGISTRY: docker.io
# 镜像完整名称:你的 Docker Hub 用户名 / 项目名
# secrets.DOCKER_USERNAME 存在 GitHub 的 Secrets 里,防止泄露账号
IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/coco-chat-backend
# ============================================
# Jobs:流水线里的"阶段",按顺序或并行执行
# ============================================
jobs:
# ==========================================
# Job 1: 构建与测试(编译代码 + 跑单元测试)
# ==========================================
build-and-test:
# 运行环境:GitHub 提供的 Ubuntu 虚拟机(免费)
runs-on: ubuntu-latest
steps:
# Step 1: 把代码拉取到虚拟机里
- name: Checkout code
uses: actions/checkout@v4
# uses: 引用 GitHub 官方或社区封装好的动作(Action)
# Step 2: 安装 JDK 17(Spring Boot 3 最低要求)
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17' # Java 版本
distribution: 'temurin' # JDK 发行版(Eclipse Temurin,开源免费)
cache: maven # 自动缓存 Maven 依赖,下次构建更快
# Step 3: 用 Maven 编译并运行测试
- name: Build with Maven
run: mvn clean package -DskipTests=false
# mvn clean: 清除上次构建产物
# package: 编译 + 打包成 JAR
# -DskipTests=false: 显式运行测试(虽然默认就是 false,但写出来明确意图)
# Step 4: 把构建好的 JAR 文件保存为"产物"(Artifact)
# 用途:即使后面步骤失败,你也能在 GitHub 页面下载这个 JAR 排查问题
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: jar-artifact # 产物名称
path: target/*.jar # 上传 target 目录下所有 JAR
retention-days: 1 # 只保留 1 天(节省 GitHub 存储空间)
# ==========================================
# Job 2: 构建 Docker 镜像并推送到 Docker Hub
# ==========================================
# needs: 表示这个 job 必须等 "build-and-test" 成功后才执行
# 如果测试失败,就不会浪费资源构建镜像
build-and-push-image:
needs: build-and-test
runs-on: ubuntu-latest
# 权限声明:这个 job 只需要读取代码,以及写入包(Docker 镜像)
permissions:
contents: read
packages: write
steps:
# 同样需要拉取代码(因为每个 job 运行在全新虚拟机,不共享文件)
- name: Checkout code
uses: actions/checkout@v4
# 再次安装 JDK(这个 job 也要编译 JAR,因为上一步的 artifact 只是备用)
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
# 编译 JAR(跳过测试,因为上一步已经测过了,节省时间)
- name: Build JAR
run: mvn clean package -DskipTests
# 安装 Docker Buildx(支持多平台构建、缓存等高级功能)
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# 登录 Docker Hub(才能推送镜像)
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 注意:这里用 password 也可以,但推荐用 Docker Hub 的 Access Token
# 更安全,且可以单独撤销
# 自动生成镜像标签(Tag)
# 例如:main-abc123, latest, sha-7d8f9e2...
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
tags: |
# 根据分支名生成标签,如 main, master
type=ref,event=branch
# 根据 commit SHA 生成,如 main-a1b2c3d(方便回滚到具体版本)
type=sha,prefix={{branch}}-
# 如果是默认分支(main/master),额外打 latest 标签
type=raw,value=latest,enable={{is_default_branch}}
# 构建镜像并推送
- name: Build and push
uses: docker/build-push-action@v5
with:
context: . # 构建上下文:当前目录(Dockerfile 所在位置)
push: true # 构建完成后推送到仓库(false 则只构建不推送)
tags: ${{ steps.meta.outputs.tags }} # 使用上一步生成的标签
labels: ${{ steps.meta.outputs.labels }} # 自动添加元数据标签
# 使用 GitHub Actions 缓存加速 Docker 层构建(不用每次从头构建)
cache-from: type=gha
cache-to: type=gha,mode=max
# ==========================================
# Job 3: 部署到云服务器(SSH 远程执行命令)
# ==========================================
# needs: 必须等镜像推送成功后才能部署
deploy:
needs: build-and-push-image
runs-on: ubuntu-latest
# if: 条件判断,只有 main/master 分支才执行部署
# 防止 feature 分支的推送也触发线上部署
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master'
steps:
- name: Checkout code
uses: actions/checkout@v4
# 通过 SSH 连接你的云服务器并执行命令
- name: Deploy to server via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }} # 服务器 IP 或域名
username: ${{ secrets.SERVER_USER }} # 登录用户名,如 root / ubuntu
key: ${{ secrets.SERVER_SSH_KEY }} # SSH 私钥(不是密码!)
port: ${{ secrets.SERVER_PORT || 22 }} # SSH 端口,默认 22
# script: 在服务器上逐行执行的 shell 命令
script: |
# ==========================================
# 注意:你原来代码里有两个 cd,这里修正为一个
# ==========================================
# 进入项目目录(如果不存在会报错退出,防止误操作)
cd /home/coco-chat-test || exit 1
# 拉取最新镜像(latest 标签对应你刚推送的镜像)
docker pull ${{ env.IMAGE_NAME }}:latest
# 优雅停止并移除旧容器(|| true 表示即使出错也继续,避免首次部署时没有旧容器导致失败)
docker compose down || true
# 后台启动新容器(-d: detached 模式)
docker compose up -d
# 清理服务器上未被使用的旧镜像(释放磁盘空间)
docker image prune -f
# 可选:健康检查,验证服务是否启动成功
# 需要你的 Spring Boot 开启 actuator/health 端点
# sleep 15
# curl -f http://localhost:8080/actuator/health || exit 16.注意事项
一些比较老旧的git仓库分支会叫
master,但github上目前都使用main方案 A:推送
master分支,让远端也接受masterbashgit push origin master方案 B:把本地
master重命名为main,保持和 GitHub 默认一致bashgit branch -m master main git push origin mainGitHub 出于安全考虑,从 2020 年起要求:如果推送的内容包含
.github/workflows/下的文件,所用的 token 必须明确授予workflow作用域。登录 GitHub,点击右上角头像 → Settings
左侧菜单最底部 → Developer settings → Personal access tokens → Tokens (classic)
点击 Generate new token (classic)
给 Token 起个名字,例如
coco-chat-deploy勾选以下权限:
repo(及其下全部子项,用于访问仓库)workflow(这就是你需要添加的关键权限)- (可选)如果你还要推送容器到 GitHub Container Registry,可额外勾选
write:packages - 滚动到底部,点击 Generate token
- 立即复制生成的 Token(只会显示一次)
更新本地仓库的认证信息
修改远程地址,把 Token 嵌入 URL(推荐,一劳永逸)
bashgit remote set-url github https://TOKEN@github.com/xxxxxxxx/coco-chat.git