通用基础项目

    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控制台
    2. 从URL中获取ID, 当你登录以后,你的url会长成这样:https://dash.cloudflare.com/[accoutId]/home/domains,中间的部分就是你的`CLOUDFLARE_ACCOUNT_ID`,当然也有其他地方可以看,但这是最快的。
    3. 紧接着如图所示,点击右边的小人 -> 下拉框 -> 配置文件 -> api令牌 -> 创建令牌

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

    1. PROJECT_NAME取一个项目你想要的名字
    2. DATABASE_NAMEDATABASE_ID,将你上一节中本地生成的d1的值填入。

    注意PROJECT_NAME,这个地方我在写这个文章的时候踩了个坑,我在跑CI的时候一直以为是我github的环境变量设置有问题,直到我去翻了cloudflare的源码,要求是这样的: 项目名称可以是1-58个小写字符,可以包含连字符,但不能以连字符开头或结尾,例如:cloudflare-next-template

    执行部署脚本且验证结果

    pnpm deploy:pages执行,如图。

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

    最后我把这个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: {
            url: LOCAL_DB_PATH
          }
        } satisfies Config)
      : ({
          schema: './lib/db/schema.ts',
          out: './migrations',
          dialect: 'sqlite',
          driver: 'd1-http',
          dbCredentials: {
            databaseId: DATABASE_ID!,
            token: CLOUDFLARE_API_TOKEN!,
            accountId: CLOUDFLARE_ACCOUNT_ID!
          }
        } satisfies Config)
    
    会员专享

    订阅后解锁完整文章

    支持创作、解锁全文,未来更新也会第一时间送达。

    评论

    加入讨论

    0 条评论
    登录后评论

    还没有评论,来占个沙发吧。