通用基础项目
4. 项目的部署以及CI/CD
会员专享 · 非会员仅可阅读 30% 的正文。
- 发布时间
- May 17, 2025
- 阅读时间
- 3 min read
- 作者
- Felix
- 访问
- 会员专享
这是预览内容
非会员仅可阅读 30% 的正文。
在上一章那,我们把本地的数据库和最简单的登录在本地跑了一遍,这一章就开始把远程的部署和CI/CD跑起来。
部署的主要逻辑
对于部署的主要逻辑都集中在scripts/deploy/index.ts,整段逻辑比较简单清楚且带有注释,因此不在文章中浪费篇幅,转至Github自行查看逻辑。
/**
* 主函数
*/
const main = async () => {
try {
console.log('🚀 Starting deployment process...')
validateEnvironment()
setupEnvFile()
setupWranglerConfigs()
await checkAndCreateDatabase()
migrateDatabase()
// await checkAndCreateKVNamespace()
await checkAndCreatePages()
pushPagesSecret()
deployPages()
console.log('🎉 Deployment completed successfully')
} catch (error) {
console.error('❌ Deployment failed:', error)
process.exit(1)
}
}
main()
```
## 环境变量设置
在.env中,这些环境变量是必须要在cloudflare上去获取的。
```
CLOUDFLARE_ACCOUNT_ID=""
CLOUDFLARE_API_TOKEN=""
PROJECT_NAME=""
DATABASE_NAME=""
DATABASE_ID=""
```
流程如下:
1. 登录[Cloudflare控制台](https://dash.cloudflare.com/)
2. 从URL中获取ID, 当你登录以后,你的url会长成这样:https://dash.cloudflare.com/[accoutId]/home/domains,中间的部分就是你的`CLOUDFLARE_ACCOUNT_ID`,当然也有其他地方可以看,但这是最快的。
3. 紧接着如图所示,点击右边的小人 -> 下拉框 -> 配置文件 -> api令牌 -> 创建令牌

然后选这些权限(可以多选一点比如R2桶、Quest队列、AI以免后续再次添加),在创建成功后会获得一个secret key,记得保存,只有一次查看机会。将其填入`CLOUDFLARE_API_TOKEN`中。

4. `PROJECT_NAME`取一个项目你想要的名字
5. `DATABASE_NAME`和`DATABASE_ID`,将你上一节中本地生成的d1的值填入。
> 注意`PROJECT_NAME`,这个地方我在写这个文章的时候踩了个坑,我在跑CI的时候一直以为是我github的环境变量设置有问题,直到我去翻了cloudflare的源码,要求是这样的:
> 项目名称可以是1-58个小写字符,可以包含连字符,但不能以连字符开头或结尾,例如:`cloudflare-next-template`。
## 执行部署脚本且验证结果
`pnpm deploy:pages`执行,如图。

在cloudflare上检查一下,所在的位置是`Workers`和`D1`从左侧边栏中进入:


最后我把这个`Workers`挂在了我的某个二级域名下(这里可以直接输入你拥有的域,但域必须是在cloudflare上的,cloudflare会自动帮你处理)。

访问地址:https://demo.getwhynot.org/
## 迁移数据库到远程D1
显然我们还有一些事情没做,那就是迁移本地的数据库到远程的D1上,因为本地已经有`migrations`了,所以只需要执行`wrangler d1 migrations apply demo --remote`即可将数据库同步到远端D1上。
大家还记得前面这段脚本`"db:studio:local": "LOCAL_DB_PATH=$(find .wrangler/state/v3/d1/miniflare-D1DatabaseObject -type f -name '*.sqlite' -print -quit) drizzle-kit studio"`以及`drizzle.config.ts`文件吗?
对于远程来说我增加了一条脚本是`"db:studio:remote": "drizzle-kit studio"`,通过`drizzle.config.ts`的逻辑可知,会因为没有传递`LOCAL_DB_PATH`的环境变量而直接链接远程数据库,展示远程的数据库结果。
```
// drizzle.config.ts
import type { Config } from 'drizzle-kit'
const { LOCAL_DB_PATH, DATABASE_ID, CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID } = process.env
// Use better-sqlite driver for local development
export default LOCAL_DB_PATH
? ({
schema: './lib/db/schema.ts',
dialect: 'sqlite',
dbCredentials:会员专享
订阅后解锁完整文章
支持创作、解锁全文,未来更新也会第一时间送达。
评论
加入讨论
登录后评论
还没有评论,来占个沙发吧。