基于 Next.js 构建的自助服务应用,让参与者快速获取 GitHub Copilot Business 试用权限并加入工作坊团队。
- 一键加入 — 输入 GitHub 用户名即可收到组织团队邀请
- 成员列表 — 实时展示已加入的成员,支持搜索筛选
- 操作指南 — 内置图文引导,手把手完成注册流程
- 自动化管理 — 通过 GitHub API 自动发送邀请,无需管理员手动操作
npm install在项目根目录创建 .env.local 文件:
# GitHub API 配置
GITHUB_TOKEN=your_github_personal_access_token
GITHUB_ORG_NAME=your_organization_name
GITHUB_TEAM_NAME=your_team_name
# 访问保护
ACCESS_CODE=your_6_digit_access_code
SESSION_SECRET=your_long_random_session_secret各变量的获取方式见下方 环境变量详解。
npm run dev打开 http://localhost:3000 即可访问。
| 变量名 | 必填 | 说明 |
|---|---|---|
GITHUB_TOKEN |
是 | GitHub 个人访问令牌(PAT) |
GITHUB_ORG_NAME |
是 | GitHub 组织名称 |
GITHUB_TEAM_NAME |
是 | 组织中的团队 slug |
ACCESS_CODE |
是 | 工作坊访问码,仅在服务端读取,切勿使用 NEXT_PUBLIC_ 前缀 |
SESSION_SECRET |
建议 | 会话签名密钥,建议使用长度 32 位以上随机字符串 |
用于调用 GitHub API 管理组织成员和团队。
获取步骤:
- 打开 GitHub → 右上角头像 → Settings
- 左侧菜单最底部 → Developer settings → Personal access tokens → Fine-grained tokens
- 点击 Generate new token
- 设置 Token name、Expiration(过期时间)
- Resource owner 选择你的组织(如
dongjwComapany) - 在 Organization permissions 中授予:
- Members → Read and write
- Administration → Read and write
- 点击 Generate token,复制生成的令牌
你的 GitHub 组织的登录名(不是显示名称)。
获取步骤:
- 打开 https://github.com/settings/organizations
- 找到目标组织,其名称即为
GITHUB_ORG_NAME - 也可以从组织主页 URL 获取:
https://github.com/<组织名>中的<组织名>部分
组织中用于接收工作坊成员的团队标识(slug)。
获取步骤:
- 打开
https://github.com/orgs/<你的组织名>/teams - 如果已有团队,点击进入团队页面,URL 中最后一段即为 slug
- 例如:
https://github.com/orgs/dongjwComapany/teams/workshop→ slug 为workshop
- 例如:
- 如果还没有团队,点击 New team 创建一个,创建后使用该团队的 slug
注意:slug 是 URL 友好的名称(小写、连字符分隔),可能与团队显示名称不同。
- 输入 GitHub 用户名 — 在输入框中填写你的 GitHub 用户名(不是邮箱,不需要 @ 符号)
- 点击「加入工作坊」 — 系统将自动发送团队邀请
- 接受邀请:
- 前往 GitHub,进入组织页面
- 找到邀请通知,点击 Accept invitation
- 点击 Join 完成加入(不用勾选 "Ask for...")
- 开始使用 — 在 VS Code / Cursor 等编辑器中安装 GitHub Copilot 插件,登录 GitHub 即可
本项目现在只保留一条生产部署链路:
- 生产站点:
joinworkshop.haxu.dev - Azure 资源:Static Web App
joinworkshop - 发布方式:推送到
master后,由 GitHub Actions 自动发布到 SWA
gh auth status
gh auth setup-git如果 gh auth status 显示未登录,先执行 gh auth login。
代码里的服务端 API 运行在 SWA 的托管后端里,所以要把运行时变量配置到 SWA 本身,而不是 App Service。
az staticwebapp appsettings set \
--name joinworkshop \
--resource-group haxuapps \
--setting-names \
GITHUB_TOKEN=xxx \
GITHUB_ORG_NAME=xxx \
GITHUB_TEAM_NAME=xxx \
ACCESS_CODE=your_6_digit_access_code \
SESSION_SECRET=generate_a_long_random_string_here提交代码后,直接推送到 master:
npm run deploy:swa这个脚本本质上执行的是:
git push origin master如果只是修改了 SWA 应用设置,或者想重新触发一次发布,不需要制造空提交:
npm run redeploy:swa这会手动触发 azure-static-web-apps.yml。
- 不再使用本地
.azure-deploy/App Service 打包目录。 - 不再使用 Azure App Service 作为
joinworkshop.haxu.dev的生产发布目标。 joinworkshop.haxu.dev的运行时配置只在 SWA 上维护。
说明:
ACCESS_CODE只在服务端校验,前端不会拿到该值。SESSION_SECRET用于给httpOnly会话 Cookie 签名,避免固定 Token 被重放。- 不要把访问码写进代码库,也不要使用
NEXT_PUBLIC_ACCESS_CODE这类前缀。 - 本地
.env只用于开发和临时排障,不参与生产部署。
本地开发仍然直接运行 Next.js:
npm run dev| 技术 | 版本 |
|---|---|
| Next.js | 15.2.2 |
| React | 19.0.0 |
| TypeScript | - |
| TailwindCSS | 4.x |
| Octokit | GitHub API 客户端 |
- Next.js 文档 — 功能与 API 参考
- 学习 Next.js — 交互式教程