1 | const child_process = require('child_process');
|
2 | const fs = require('fs');
|
3 | const path = require('path');
|
4 | const yaml = require('js-yaml');
|
5 |
|
6 | let project_root = process.env.PROJECT_ROOT;
|
7 | if (/versions\/\d{4}-\d{2}-\d{2},\d{2}-\d{2},[a-z0-9]{7}$/.test(project_root)) {
|
8 | project_root = path.resolve(project_root, '..', '..', 'current');
|
9 | }
|
10 |
|
11 | const config = yaml.safeLoad(fs.readFileSync(project_root + '/deploy.yaml', 'utf-8'));
|
12 |
|
13 |
|
14 | let crontab = [];
|
15 | if (Array.isArray(config.cron_jobs)) {
|
16 | crontab = config.cron_jobs.map((job) => {
|
17 | return `${job.pattern} ${project_root}/run_job.sh ${job.job}`;
|
18 | });
|
19 | }
|
20 |
|
21 |
|
22 | if (config.cron_jobs_dir) {
|
23 | const cron_jobs_dir = path.resolve(project_root, config.cron_jobs_dir);
|
24 | const files = fs.readdirSync(cron_jobs_dir);
|
25 | for (const file of files) {
|
26 | if (!/(?:\.coffee|\.js|\.ts)/.test(file)) {
|
27 | continue;
|
28 | }
|
29 | const lines = fs.readFileSync(path.resolve(cron_jobs_dir, file), 'utf-8').split('\n');
|
30 | for (const line of lines) {
|
31 | if (/^#\s*cron: (.*)$/.test(line)) {
|
32 | crontab.push(`${RegExp.$1} ${project_root}/run_job.sh ${file.substr(0, file.length - 7)}`);
|
33 | }
|
34 | }
|
35 | }
|
36 | }
|
37 |
|
38 | if (config.workers) {
|
39 |
|
40 | crontab.push(`@reboot ${project_root}/on_boot.sh`);
|
41 |
|
42 |
|
43 | crontab.push(`0 * * * * cd ${project_root} && /usr/sbin/logrotate -s ${process.env.HOME}/.croquis/logrotate_${config.project}.status logrotate.conf`);
|
44 | }
|
45 |
|
46 |
|
47 | crontab = 'CONTENT_TYPE="text/plain; charset=utf-8"\n' + crontab.join('\n') + '\n';
|
48 |
|
49 | fs.writeFileSync(`${project_root}/.crontab`, crontab);
|
50 | try {
|
51 | child_process.execSync(`crontab -l | grep -v ${project_root} | grep -v CONTENT_TYPE >> ${project_root}/.crontab`);
|
52 | } catch (error) {}
|
53 | try {
|
54 | child_process.execSync(`crontab ${project_root}/.crontab`);
|
55 | } catch (error) {}
|