2
0
Fork 0
backend/drone_gen.js

202 lines
4.0 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const cwd = process.cwd();
const yaml = require('js-yaml');
const ini = require('ini');
const gitmodules = ini.parse(fs.readFileSync('.gitmodules', 'utf-8'));
const gitmodulepaths = Object.values(gitmodules).map(m => m.path);
/*
const folders = fs.readdirSync(cwd, { withFileTypes: true });
const dockers = folders.filter(f =>
f.isDirectory() && fs.readdirSync(path.join(cwd, f.name)).includes('Dockerfile')
).map(f => f.name);
*/
const submodules = gitmodulepaths.concat([
// Additional nested submodules
'backend-protobuf',
]);
const dockers = gitmodulepaths; // Assumption: All submodules have Docker. Should hold true
const submodule_override = submodules.reduce((acc, f) => {
acc[f] = 'https://git.makerforce.io/beep/' + f + '.git';
return acc;
}, {});
const yamls = dockers.map(f => ({
kind: 'pipeline',
name: f,
clone: {
depth: 32,
},
steps: [
{
name: 'submodule',
image: 'plugins/git',
settings: {
recursive: true,
submodule_override,
},
},
{
name: 'docker',
image: 'plugins/docker',
settings: {
registry: 'registry.makerforce.io',
repo: 'registry.makerforce.io/beep/' + f,
context: f,
dockerfile: f + '/Dockerfile',
auto_tag: true,
username: {
from_secret: 'docker_username',
},
password: {
from_secret: 'docker_password',
},
},
},
],
trigger: {
branch: ["master"],
event: ["push", "tag", "promote", "rollback"],
},
}))
const sshTest = {
kind: 'pipeline',
name: 'ssh-test',
steps: [
{
name: 'ssh',
image: 'appleboy/drone-ssh',
settings: {
host: 'staging.beepvoice.app',
username: 'core',
key: {
from_secret: 'ssh_key',
},
script: [
'cd /home/core/staging && ls'
],
},
},
],
trigger: {
branch: ["master"],
event: ["push", "tag", "promote", "rollback"],
},
};
const callSelf = {
kind: 'pipeline',
name: 'call-self',
steps: [
{
name: 'regenrate',
image: 'node:12-alpine',
commands: [
'yarn install',
'yarn generate',
],
},
{
name: 'push-or-fail',
image: 'appleboy/drone-git-push',
settings: {
remote_name: 'origin',
branch: '${DRONE_SOURCE_BRANCH}',
key: {
from_secret: 'push_ssh_key',
},
commit: true,
commit_message: '[SKIP CI] Automatically updating .drone.yml',
},
failure: 'ignore',
},
],
trigger: {
branch: ["master"],
event: ["pull_request"],
},
};
const deploy = {
kind: 'pipeline',
name: 'deploy',
steps: [
{
name: 'submodule',
image: 'plugins/git',
settings: {
recursive: true,
submodule_override,
},
},
{
name: 'copy-docker-compose',
image: 'appleboy/drone-scp',
settings: {
host: 'staging.beepvoice.app',
username: 'core',
key: {
from_secret: 'ssh_key',
},
source: [
'docker-compose.staging.yml',
'traefik.staging.toml',
],
target: '/home/core/staging',
},
},
{
name: 'copy-migrations',
image: 'appleboy/drone-scp',
settings: {
host: 'staging.beepvoice.app',
username: 'core',
key: {
from_secret: 'ssh_key',
},
source: [
'backend-core/postgres/*',
],
target: '/home/core/staging',
},
},
{
name: 'docker-compose-up',
image: 'appleboy/drone-ssh',
settings: {
host: 'staging.beepvoice.app',
username: 'core',
key: {
from_secret: 'ssh_key',
},
script: [
'cd /home/core/staging && /home/core/docker-compose -f docker-compose.staging.yml pull',
'cd /home/core/staging && /home/core/docker-compose -f docker-compose.staging.yml up -d',
],
},
},
{
name: 'slack',
image: 'plugins/slack',
settings: {
webhook: {
from_secret: 'slack_webhook_beep',
},
},
},
],
trigger: {
branch: ["master"],
event: ["push", "tag", "promote", "rollback"],
},
depends_on: dockers,
};
const droneyml = [].concat(sshTest).concat(callSelf).concat(yamls).concat(deploy).map(yaml.safeDump).join('---\n');
fs.writeFileSync(path.join(cwd, '.drone.yml'), droneyml);
console.log('Written to .drone.yml');