通用基础项目

    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令牌 -> 创建令牌
    
    ![](https://ik.imagekit.io/ixou4q6nu/cloudflare-create-api-token.png)
    
    然后选这些权限(可以多选一点比如R2桶、Quest队列、AI以免后续再次添加),在创建成功后会获得一个secret key,记得保存,只有一次查看机会。将其填入`CLOUDFLARE_API_TOKEN`中。
    
    ![](https://ik.imagekit.io/ixou4q6nu/premission.png)
    
    4. `PROJECT_NAME`取一个项目你想要的名字
    5. `DATABASE_NAME`和`DATABASE_ID`,将你上一节中本地生成的d1的值填入。
    
    > 注意`PROJECT_NAME`,这个地方我在写这个文章的时候踩了个坑,我在跑CI的时候一直以为是我github的环境变量设置有问题,直到我去翻了cloudflare的源码,要求是这样的:
    > 项目名称可以是1-58个小写字符,可以包含连字符,但不能以连字符开头或结尾,例如:`cloudflare-next-template`。
    
    ## 执行部署脚本且验证结果
    
    `pnpm deploy:pages`执行,如图。
    
    ![](https://ik.imagekit.io/ixou4q6nu/success-excuete.png?updatedAt=1745851458326)
    
    在cloudflare上检查一下,所在的位置是`Workers`和`D1`从左侧边栏中进入:
    
    ![](https://ik.imagekit.io/ixou4q6nu/cloudflare-success-pages.png)
    
    ![](https://ik.imagekit.io/ixou4q6nu/d1-success.png)
    
    最后我把这个`Workers`挂在了我的某个二级域名下(这里可以直接输入你拥有的域,但域必须是在cloudflare上的,cloudflare会自动帮你处理)。
    
    ![](https://ik.imagekit.io/ixou4q6nu/domain.png)
    
    访问地址: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:
    会员专享

    订阅后解锁完整文章

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

    评论

    加入讨论

    0 条评论
    登录后评论

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