利用Directus的Webhooks和Astro做自动化部署
在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文件的变更即可完成部署,参考使用Watch实现node项目的自动化部署