利用Directus的Webhooks和Astro做自动化部署

后端开发 133

在Directus中建立Webhooks

注意,为了安全考虑我在Headers中添加了一个token,用于在Astro中请求验证

建立触发规则,作用模型范围

二 Astro的配置

开启astro的SSR模式

export default defineConfig({
	output: 'server'
});

建立路由 /src/pages/[...slug].astro

---
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const pages = [
  {
    slug: undefined,
    title: 'Astro Store',
    text: 'Welcome to the Astro!',
  },
  {
    slug: 'build',
    title: 'Astro Build',
    text: 'Astro build command be executed.',
  }
];

const { slug } = Astro.params;
const page = pages.find((page) => page.slug === slug);
if (!page) return Astro.redirect("/404");
const { title, text } = page;

if (Astro.request.method === "POST") {
  
  const headers = JSON.stringify(Object.fromEntries(Astro.request.headers));
  const token =  Object.fromEntries(Astro.request.headers).token; //A27OF2ih7S5byFe; //JSON.stringify(Object.fromEntries(Astro.request.headers))
  const start = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '');     // replace T with a space And delete the dot and everything after;

  if (token == 'A27OF2ih7S5byFe') {

    const fs = require('fs');
    const logFile = './src/directus/build.log';

    //Check log file Size
    var stats = fs.statSync(logFile);
    var fileSizeInBytes = stats.size;

    // Convert the file size to megabytes (optional)
    //var fileSize = fileSizeInBytes / (1024*1024);

    var fileSize = fileSizeInBytes / 1024;
    //console.log(fileSize);
    if(fileSize > 2000){
      try {
        fs.unlinkSync(logFile);
        //console.log("File removed:", path);
      } catch (err) {
        //console.error(err);
      }
    }

    //Write log file
    const content = headers + '\n - Requested at: ' + start + '\n';
    fs.appendFile(logFile, content, err => {
      if (err) {
        console.error(err);
      }
      // done!
    });
  }
}
---
<html>
<head>
  <title>{title}</title>
</head>
<body>
  <h1>{title}</h1>
  <p>{text}</p>
</body>
</html>

建立存放log的目录 /src/directus/

以上实现了每次Directus修改发布内容会触发Astro的build路由请求,在Astro会产生一个log记录位于/src/directus/build.log,当文件超出2000KB的时候清空。

三 用WATCH来实现自动化部署

如果项目只用于SSR模式大可不必,由于我喜欢把页面内容静态化部署到CDN上,所以每次内容更新都需要astro的build来重新构建内容,以及CDN内容的发布。

用watch监控log文件的变更即可完成部署,参考

Post Comment