[{"data":1,"prerenderedAt":63},["ShallowReactive",2],{"content:\u002Farticles:8346":3},{"item":4,"md":15,"html":16,"menu":17,"excerpt":43,"related":44},{"title":5,"len":6,"tags":7,"id":9,"time":10,"modifyTime":11,"encrypt":12,"showComments":13,"customSlug":14},"使用Drone+docker配置本地轻量化CI\u002FCD",7292,[8],"运维",8346,1694238608081,1694594878863,false,true,"",null,"\u003Cp data-marked-line=\"1\">&emsp;&emsp;前几天完成了\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyunyuyuan\u002Fnuxt3-blog\u002Fcommit\u002F7f3bbb0d481c7c303188c313873275563047f664\" target=\"_blank\">nuxt \u002Fserver\u003C\u002Fa>的迁移工作，以后本站的部署不再仅限于vercel，而是可以用任何工具\u003Cimg src=\"\u002Fsticker\u002Faru\u002F61.png\" alt=\"sticker\"\u002F>（见\u003Ca href=\"https:\u002F\u002Fnitro.unjs.io\u002Fdeploy\" target=\"_blank\">nitro deploy\u003C\u002Fa>）。\n&emsp;&emsp;发现一个比较轻量的CI\u002FCD工具：\u003Ca href=\"https:\u002F\u002Fdrone.io\" target=\"_blank\">Drone\u003C\u002Fa>，成功给本站安排上了，但是只安排了一点\u003Cimg src=\"\u002Fsticker\u002Faru\u002F104.png\" alt=\"sticker\"\u002F>（下面会说明），地址是\u003Ca href=\"https:\u002F\u002Fblog-drone-cf.yunyuyuan.net\u002F\" target=\"_blank\">https:\u002F\u002Fblog-drone-cf.yunyuyuan.net\u002F\u003C\u002Fa>，运行在我家里的linux服务器上，使用cloudflared tunnel做内网穿透，关于cloudflared tunnel详见\u003Ca href=\"https:\u002F\u002Fblog.yunyuyuan.net\u002Farticles\u002F5896\" target=\"_blank\">之前的文章\u003C\u002Fa>。\u003C\u002Fp>\n\u003Cblockquote data-marked-line=\"4\">\n\u003Cp data-marked-line=\"4\">之前我写过一篇\u003Ca href=\"https:\u002F\u002Fblog.yunyuyuan.net\u002Farticles\u002F3300\" target=\"_blank\">jenkins+github配置CI\u002FCD\u003C\u002Fa>的文章，主要是入门Jenkins，当时觉得Jeninks太吃资源，而且各种配置混杂，管理页也很丑，所以后面没有学下去了。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch1 data-marked-line=\"7\">\u003Csup class=\"fake-head\" id=\"%E5%AE%89%E8%A3%85drone\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#%E5%AE%89%E8%A3%85drone\">安装drone\u003C\u002Fa>\u003C\u002Fh1>\u003Cdiv data-marked-line=\"8\" class=\"container-block tip\">\n                    \u003Cp class=\"container-title\">准备\u003C\u002Fp>\n                    \u003Cul>\n\u003Cli>一台linux服务器\u003C\u002Fli>\n\u003Cli>已安装docker\u003C\u002Fli>\n\u003Cli>已安装docker-compose\u003C\u002Fli>\n\u003C\u002Ful>\n\n                  \u003C\u002Fdiv>\u003Ch3 data-marked-line=\"13\">\u003Csup class=\"fake-head\" id=\"%E5%AE%89%E8%A3%85drone%20server\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#%E5%AE%89%E8%A3%85drone%20server\">安装drone server\u003C\u002Fa>\u003C\u002Fh3>\u003Cp data-marked-line=\"14\">&emsp;&emsp;\u003Ca href=\"https:\u002F\u002Fdocs.drone.io\u002Fserver\u002Foverview\" target=\"_blank\">drone server\u003C\u002Fa>用于接受webhook通知，然后调度drone-runner。由于drone server没有依赖，我选择安装进docker。drone提供多种集成方式，我这里使用的是github。首先按照\u003Ca href=\"https:\u002F\u002Fdocs.drone.io\u002Fserver\u002Fprovider\u002Fgithub\u002F#create-an-oauth-application\" target=\"_blank\">官方教程\u003C\u002Fa>创建一个Github OAuth应用，然后再安装drone server。\n&emsp;&emsp;下面是我的drone\u002Fdocker-compose.yml：\u003C\u002Fp>\n\u003Cpre data-marked-line=\"16\" data-lang=\"yml\" data-shiki>\u003Ccode class=\"language-yml\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">version\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">'3.5'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">services\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  app\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    image\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">drone\u002Fdrone:2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    restart\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">always\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    user\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">1000:1001\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    volumes\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fvar\u002Flib\u002Fdrone:\u002Fdata\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    environment\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # Github OAuth app 信息\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_GITHUB_CLIENT_ID=your_github_oauth_client_id\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_GITHUB_CLIENT_SECRET=your_github_oauth_client_secret\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 用来和drone runner通信\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_RPC_SECRET=your_custom_secret\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_SERVER_HOST=drone.yourdomain.com\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_SERVER_PROTO=https\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 只允许特定github账号使用drone server\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_USER_FILTER=your_primary_github_account,your_another_github_account\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 指定一个账号为管理员\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_USER_CREATE=username:your_primary_github_account,admin:true,machine:false\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # mysql数据库\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_DATABASE_DRIVER=mysql\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_DATABASE_DATASOURCE=drone:your_mysql_passwd@tcp(mariadb-app:3306)\u002Fdrone?parseTime=true\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    ports\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">9323:80\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    networks\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">mariadb-net\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">networks\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  mariadb-net\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    external\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#005CC5;--shiki-dark:#D19A66\">true\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp data-marked-line=\"49\">&emsp;&emsp;我有一个已经在运行的mariadb(即mysql)容器，并且已经接入到了我创建的docker network bridge，名为\u003Ccode>mariadb-net\u003C\u002Fcode>，所以上面直接使用就行。\n&emsp;&emsp;启动前，先在mysql里新建一个名为\u003Ccode>drone\u003C\u002Fcode>的用户，并新建一个名为\u003Ccode>drone\u003C\u002Fcode>的database，授权给用户\u003Ccode>drone\u003C\u002Fcode>。\n&emsp;&emsp;drone server提供了一个控制面板，\u003Ccode>docker-compose up -d\u003C\u002Fcode>启动后，打开\u003Ccode>ip:9323\u003C\u002Fcode>就可以看到控制面板的欢迎页了。然后授权Github登录，授权后可以看到所有仓库都显示出来了，点击\u003Ccode>nuxt3-blog\u003C\u002Fcode>进行配置(请确保已经fork \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyunyuyuan\u002Fnuxt3-blog\" target=\"_blank\">nuxt3-blog\u003C\u002Fa>)，首次进入会提示仓库未激活，点击激活。激活后，进入设置，打开这两个选项：\n\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"设置\" title=\"设置\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002FzpEMBvhGn1cLbVo.png\"\u002F>\u003Csmall class=\"desc\">设置\u003C\u002Fsmall>\u003C\u002Fspan>\n&emsp;&emsp;然后，配置环境变量（MONGODB_URI是秘密内容，不能写在config.ts里，因为MOGODB_URI只会在服务端使用，浏览器无法看到。而另外三个是浏览器使用的，可以公开写在config.ts里）：\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"环境变量\" title=\"环境变量\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002F8pBZik124Ed9ybh.png\"\u002F>\u003Csmall class=\"desc\">环境变量\u003C\u002Fsmall>\u003C\u002Fspan>\n&emsp;&emsp;关于drone server的配置只有如上两步。\u003C\u002Fp>\n\u003Ch3 data-marked-line=\"56\">\u003Csup class=\"fake-head\" id=\"%E5%AE%89%E8%A3%85drone-runner\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#%E5%AE%89%E8%A3%85drone-runner\">安装drone-runner\u003C\u002Fa>\u003C\u002Fh3>\u003Cp data-marked-line=\"57\">&emsp;&emsp;drone-runner用于执行pipeline，drone提供了\u003Ca href=\"https:\u002F\u002Fdocs.drone.io\u002Frunner\u002Foverview\u002F\" target=\"_blank\">多种runner\u003C\u002Fa>。我目前配置的pipeline需要用到docker-runner，安装docker-runner比较简单，另写一个新的drone-runner\u002Fdocker-compose.yml：\u003C\u002Fp>\n\u003Cpre data-marked-line=\"58\" data-lang=\"yml\" data-shiki>\u003Ccode class=\"language-yml\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">version\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">'3.5'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">services\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">app\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    image\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">drone\u002Fdrone-runner-docker:1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    restart\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">always\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    volumes\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 使用宿主机的docker管理\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    environment\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 与drone server的DRONE_RPC_SECRET保持一致\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_RPC_SECRET=your_custom_secret\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_RPC_HOST=drone.yourdomain.com\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_RPC_PROTO=https\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_RUNNER_CAPACITY=2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">DRONE_RUNNER_NAME=my-runner\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    ports\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">9324:3000\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp data-marked-line=\"77\">直接\u003Ccode>docker-compose up -d\u003C\u002Fcode>启动就好了，不需要做其他配置。\u003C\u002Fp>\n\u003Ch1 data-marked-line=\"79\">\u003Csup class=\"fake-head\" id=\"%E6%B5%81%E7%A8%8B%E4%BB%8B%E7%BB%8D\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#%E6%B5%81%E7%A8%8B%E4%BB%8B%E7%BB%8D\">流程介绍\u003C\u002Fa>\u003C\u002Fh1>\u003Cp data-marked-line=\"80\">以下是比较通用的drone工作流程：\n\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"通用流程\" title=\"通用流程\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002FeaRH5NuSXrhEwoU.webp\"\u002F>\u003Csmall class=\"desc\">通用流程\u003C\u002Fsmall>\u003C\u002Fspan>\n以下是我的简陋版工作流程：\n\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"简陋流程\" title=\"简陋流程\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002F5HlQPSCLOAvzepf.png\"\u002F>\u003Csmall class=\"desc\">简陋流程\u003C\u002Fsmall>\u003C\u002Fspan>\n&emsp;&emsp;与通用流程相比，我没有上传到image registry，也没有另外的production server（一般是k8s）拉取image并部署，而是直接部署在安装drone的机器上，All in one!\u003C\u002Fp>\n\u003Chr data-marked-line=\"86\" \u002F>\n\u003Cp data-marked-line=\"88\">&emsp;&emsp;drone server配置完毕，推送代码到github，应该就能触发drone的runner，编译完成后，docker打包image，然后重新运行新的image，网站更新。\n\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"自动化编译部署\" title=\"自动化编译部署\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002F8KciU3jCA7TvE9k.png\"\u002F>\u003Csmall class=\"desc\">自动化编译部署\u003C\u002Fsmall>\u003C\u002Fspan>\n&emsp;&emsp;此时可以看到有三个运行的容器:\n\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"容器\" title=\"容器\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002FedRkwum2AyWHfJU.png\"\u002F>\u003Csmall class=\"desc\">容器\u003C\u002Fsmall>\u003C\u002Fspan>\u003C\u002Fp>\n\u003Ch1 data-marked-line=\"93\">\u003Csup class=\"fake-head\" id=\"Pipeline\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#Pipeline\">Pipeline\u003C\u002Fa>\u003C\u002Fh1>\u003Cp data-marked-line=\"94\">&emsp;&emsp;这是nuxt3-blog的\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyunyuyuan\u002Fnuxt3-blog\u002Fblob\u002Fmaster\u002F.drone.yml\" target=\"_blank\">pipeline\u003C\u002Fa>：\u003C\u002Fp>\n\u003Cpre data-marked-line=\"95\" data-lang=\"yml\" data-shiki>\u003Ccode class=\"language-yml\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">kind\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">pipeline\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">type\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">build\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">trigger\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  event\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">    - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">push\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  branch\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">    - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">master\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">platform\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  os\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">linux\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  arch\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">amd64\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">steps\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">  # 使用node编译nuxt3-blog\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">  - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">build_project\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    image\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">node:18\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    volumes\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">cache\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fdrone\u002Fsrc\u002Fnode_modules\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    environment\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      MONGODB_URI\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">MONGODB_URI\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 也可以不写下面三个，转而写在config.ts\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      CommentRepoId\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">CommentRepoId\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      CommentDiscussionCategoryId\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">CommentDiscussionCategoryId\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      CloudflareAnalyze\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">CloudflareAnalyze\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    commands\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">npm i -g pnpm\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">pnpm i\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">pnpm build\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">  # 使用docker打包.output, docker in docker!\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">  - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">build_docker\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    image\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker:latest\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    volumes\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fvar\u002Frun\u002Fdocker.sock\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    environment\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      APP_NAME\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">nuxt3-blog-app\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      IMAGE_NAME\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">nuxt3-blog:latest\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      MONGODB_URI\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">MONGODB_URI\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    commands\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 先停止并删除已有的容器\u002F镜像\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker ps -q --filter \"name=$APP_NAME\" | xargs -r docker stop\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker ps -aq --filter \"name=$APP_NAME\" | xargs -r docker rm\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker images --filter \"reference=$IMAGE_NAME\" -q | xargs -r docker rmi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 打包镜像\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker build -t $IMAGE_NAME .\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 部署\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#D73A49;--shiki-dark:#C678DD\">>\u003C\u002Fspan>\u003Cspan style=\"color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFFFFF;--shiki-dark-font-style:inherit\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">        docker run -d\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">        --name=$APP_NAME\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">        --restart=always\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">        -e MONGODB_URI=$MONGODB_URI\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">        -p 127.0.0.1:8451:3000\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">        $IMAGE_NAME\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">volumes\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">  - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">cache\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    host\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fvar\u002Fcache\u002Fdrone-nuxt3-blog\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">  # 把drone runner的docker.sock传进来，而drone runner使用宿主机的docker.sock，所以这里相当于直接操作宿主机\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">  - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    host\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fvar\u002Frun\u002Fdocker.sock\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch1 data-marked-line=\"169\">\u003Csup class=\"fake-head\" id=\"%E9%99%84%EF%BC%9A%E5%AE%9A%E6%9C%9F%E5%A4%87%E4%BB%BD%E5%9B%BE%E7%89%87\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#%E9%99%84%EF%BC%9A%E5%AE%9A%E6%9C%9F%E5%A4%87%E4%BB%BD%E5%9B%BE%E7%89%87\">附：定期备份图片\u003C\u002Fa>\u003C\u002Fh1>\u003Cp data-marked-line=\"170\">&emsp;&emsp;Drone的cronjob可以做定期任务，我目前使用第三方免费图床\u003Ca href=\"https:\u002F\u002Fsmms.app\" target=\"_blank\">smms.app\u003C\u002Fa>存储本站图片，但第三方图床没有办法保证稳定性，所以定期备份是很有必要的。\n&emsp;&emsp;vercel也支持cronjob，但我没做，原因是没地方缓存已下载的图片，而且需要找一个支持api的网盘，不太方便。\n&emsp;&emsp;本站已经有两个脚本，可以手动备份图片，分别是\u003Ccode>npm run genimg\u003C\u002Fcode>和\u003Ccode>npm run downimg\u003C\u002Fcode>。\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyunyuyuan\u002Fnuxt3-blog\u002Fblob\u002Fmaster\u002Fscripts\u002Fgenerate-img-map.ts\" target=\"_blank\">generate-img-map.ts\u003C\u002Fa>搜索全站所有图片url，并输出到\u003Cem>img.json\u003C\u002Fem>，\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyunyuyuan\u002Fnuxt3-blog\u002Fblob\u002Fmaster\u002Fscripts\u002Fdownload-img.ts\" target=\"_blank\">download-img.ts\u003C\u002Fa>读取\u003Cem>img.json\u003C\u002Fem>，下载图片到\u003Ccode>\u002Fimgs\u003C\u002Fcode>文件夹。\n&emsp;&emsp;\u003Ccode>npm run genimg\u003C\u002Fcode>需要输入密码和正则表达式，因为本站的内容是可以加密的，必须解密，才能获取全部图片的url，而正则表达式用来匹配图片，例如smms的图片格式是\u003Ccode>https?:\u002F\u002F[\\w-]+\\.loli\\.net\u002F\\d{4}\u002F\\d{2}\u002F\\d{2}\u002F[a-zA-Z0-9]+\\.(jpg|jpeg|webp|gif|png)\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch3 data-marked-line=\"175\">\u003Csup class=\"fake-head\" id=\"%E6%96%B0%E5%A2%9E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%B8%8Ecronjob\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#%E6%96%B0%E5%A2%9E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%B8%8Ecronjob\">新增环境变量与cronjob\u003C\u002Fa>\u003C\u002Fh3>\u003Cp data-marked-line=\"176\">&emsp;&emsp;新增两个环境变量，\u003Ccode>NB_PASSWD\u003C\u002Fcode>和\u003Ccode>NB_IMG_REGEX\u003C\u002Fcode>，分别代表密码和正则表达式（可选变量：\u003Ccode>FILE_USER\u003C\u002Fcode>和\u003Ccode>FILE_GROUP\u003C\u002Fcode>，分别代表下载的图片的owner id和group id）。新增一个名为\u003Ccode>backup_img\u003C\u002Fcode>的cronjob，每周执行：\n\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"Drone server配置\" title=\"Drone server配置\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002FBurfxhsTnDaWdVA.png\"\u002F>\u003Csmall class=\"desc\">Drone server配置\u003C\u002Fsmall>\u003C\u002Fspan>\u003C\u002Fp>\n\u003Ch3 data-marked-line=\"179\">\u003Csup class=\"fake-head\" id=\"%E4%BF%AE%E6%94%B9pipeline\">\u003C\u002Fsup>\u003Ca class=\"header-link\" href=\"#%E4%BF%AE%E6%94%B9pipeline\">修改pipeline\u003C\u002Fa>\u003C\u002Fh3>\u003Cpre data-marked-line=\"180\" data-lang=\"yml\" data-shiki>\u003Ccode class=\"language-yml\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\"># ......\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\"># .drone.yml 新增如下内容\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#ABB2BF\">---\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">kind\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">pipeline\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">type\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">docker\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">backup_img\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">trigger\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">  # 由cronjob触发\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  event\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">    - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">cron\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  cron\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">    - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">backup_img\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">platform\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  os\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">linux\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">  arch\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">amd64\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">steps\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">  - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">backup_img\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    image\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">node:18\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    volumes\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">cache\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fdrone\u002Fsrc\u002Fnode_modules\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">imgs\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fdrone\u002Fsrc\u002Fimgs\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    environment\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      FILE_USER\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">FILE_USER\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      FILE_GROUP\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">FILE_GROUP\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      NB_PASSWD\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">NB_PASSWD\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      NB_IMG_REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">        from_secret\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">NB_IMG_REGEX\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    commands\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">npm i -g pnpm\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">pnpm genimg\u003C\u002Fspan>\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\"> # 生成img.json\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">      - \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">pnpm downimg\u003C\u002Fspan>\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\"> # 读取img.json，下载\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">volumes\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">  - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">cache\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    host\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fvar\u002Fcache\u002Fdrone-nuxt3-blog\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">  - \u003C\u002Fspan>\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">imgs\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">    host\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">      # 图片将被保存在宿主机的如下路径，脚本不会下载已有的图片\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#22863A;--shiki-dark:#E06C75\">      path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#98C379\">\u002Fdata\u002Fnuxt3-blog-imgs\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp data-marked-line=\"232\">\u003Cspan class=\"image-container\">\u003Cimg data-viewer alt=\"运行效果\" title=\"运行效果\" src=\"https:\u002F\u002Fr2-blog.yunyuyuan.net\u002FgsETxwVD1XjvrnY.png\"\u002F>\u003Csmall class=\"desc\">运行效果\u003C\u002Fsmall>\u003C\u002Fspan>\u003C\u002Fp>\n",[18,22,26,29,32,34,37,40],{"size":19,"text":20,"url":21},"big","安装drone","%E5%AE%89%E8%A3%85drone",{"size":23,"text":24,"url":25},"small","安装drone server","%E5%AE%89%E8%A3%85drone%20server",{"size":23,"text":27,"url":28},"安装drone-runner","%E5%AE%89%E8%A3%85drone-runner",{"size":19,"text":30,"url":31},"流程介绍","%E6%B5%81%E7%A8%8B%E4%BB%8B%E7%BB%8D",{"size":19,"text":33,"url":33},"Pipeline",{"size":19,"text":35,"url":36},"附：定期备份图片","%E9%99%84%EF%BC%9A%E5%AE%9A%E6%9C%9F%E5%A4%87%E4%BB%BD%E5%9B%BE%E7%89%87",{"size":23,"text":38,"url":39},"新增环境变量与cronjob","%E6%96%B0%E5%A2%9E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%B8%8Ecronjob",{"size":23,"text":41,"url":42},"修改pipeline","%E4%BF%AE%E6%94%B9pipeline","前几天完成了nuxt \u002Fserver的迁移工作，以后本站的部署不再仅限于vercel，而是可以用任何工具 （见nitro deploy）。 发现一个比较轻量的CI\u002FCD工具：Drone，成功给本站安排上了，但是只安排了一点 （下面会说明），地址是https:\u002F\u002Fblog-drone-cf.yunyu…",[45,55],{"item":46,"count":54},{"title":47,"len":48,"tags":49,"id":51,"customSlug":52,"time":53,"modifyTime":53,"showComments":13,"encrypt":12},"上手gitea actions记录",6059,[8,50],"nas",7909,"gitea-actions-setup",1770992638940,1,{"item":56,"count":54},{"title":57,"len":58,"tags":59,"id":60,"time":61,"modifyTime":62,"encrypt":12,"showComments":13,"customSlug":14},"jenkins+github配置CI\u002FCD",2698,[8],3300,1649186115521,1679559849202,1793351207699]