@catladder/pipeline 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +84 -0
- package/dist/scripts/magic/createChildPipeline/index.d.ts +5 -0
- package/dist/scripts/magic/createChildPipeline/index.js +141 -0
- package/dist/scripts/magic/createPipeline.d.ts +14 -0
- package/dist/scripts/magic/createPipeline.js +80 -0
- package/dist/scripts/magic/index.d.ts +2 -0
- package/dist/scripts/magic/index.js +16 -0
- package/dist/scripts/magic/sample-config.d.ts +3 -0
- package/dist/scripts/magic/sample-config.js +77 -0
- package/dist/scripts/magic/types/build/docker.d.ts +2 -0
- package/dist/scripts/magic/types/build/docker.js +63 -0
- package/dist/scripts/magic/types/build/index.d.ts +6 -0
- package/dist/scripts/magic/types/build/index.js +8 -0
- package/dist/scripts/magic/types/build/node.d.ts +3 -0
- package/dist/scripts/magic/types/build/node.js +118 -0
- package/dist/scripts/magic/types/build/types.d.ts +7 -0
- package/dist/scripts/magic/types/build/types.js +2 -0
- package/dist/scripts/magic/types/config.d.ts +49 -0
- package/dist/scripts/magic/types/config.js +17 -0
- package/dist/scripts/magic/types/context.d.ts +12 -0
- package/dist/scripts/magic/types/context.js +2 -0
- package/dist/scripts/magic/types/deploy/index.d.ts +6 -0
- package/dist/scripts/magic/types/deploy/index.js +8 -0
- package/dist/scripts/magic/types/deploy/kubernetes.d.ts +3 -0
- package/dist/scripts/magic/types/deploy/kubernetes.js +46 -0
- package/dist/scripts/magic/types/deploy/types.d.ts +41 -0
- package/dist/scripts/magic/types/deploy/types.js +7 -0
- package/dist/scripts/magic/types/gitlab-types.d.ts +63 -0
- package/dist/scripts/magic/types/gitlab-types.js +2 -0
- package/dist/scripts/magic/types/index.d.ts +3 -0
- package/dist/scripts/magic/types/index.js +15 -0
- package/dist/scripts/magic.d.ts +2 -0
- package/dist/scripts/magic.js +43 -0
- package/dist/scripts/monorepoGenerate.d.ts +2 -0
- package/dist/scripts/monorepoGenerate.js +164 -0
- package/dist/scripts/printAllValues.d.ts +2 -0
- package/dist/scripts/printAllValues.js +58 -0
- package/dist/scripts/printBuildEnv.d.ts +2 -0
- package/dist/scripts/printBuildEnv.js +77 -0
- package/dist/scripts/utils/extractAllValues.d.ts +1 -0
- package/dist/scripts/utils/extractAllValues.js +78 -0
- package/dist/scripts/utils/extractBuildEnv.d.ts +5 -0
- package/dist/scripts/utils/extractBuildEnv.js +152 -0
- package/dist/scripts/utils/extractValuesFromEnvVars.d.ts +2 -0
- package/dist/scripts/utils/extractValuesFromEnvVars.js +63 -0
- package/dist/scripts/utils/extractValuesFromMr.d.ts +2 -0
- package/dist/scripts/utils/extractValuesFromMr.js +86 -0
- package/dist/tests/extractValuesFromMr.test.d.ts +1 -0
- package/dist/tests/extractValuesFromMr.test.js +68 -0
- package/package.json +21 -0
- package/scripts/getCommitInfo +11 -0
- package/scripts/kubernetesCreateSecret +8 -0
- package/scripts/kubernetesDelete +4 -0
- package/scripts/kubernetesDeploy +57 -0
- package/scripts/kubernetesEnsureNamespace +3 -0
- package/scripts/magic/createChildPipeline/index.ts +163 -0
- package/scripts/magic/createPipeline.ts +48 -0
- package/scripts/magic/index.ts +2 -0
- package/scripts/magic/sample-config.ts +78 -0
- package/scripts/magic/types/build/docker.ts +36 -0
- package/scripts/magic/types/build/index.ts +11 -0
- package/scripts/magic/types/build/node.ts +107 -0
- package/scripts/magic/types/build/types.ts +9 -0
- package/scripts/magic/types/config.ts +54 -0
- package/scripts/magic/types/context.ts +13 -0
- package/scripts/magic/types/deploy/index.ts +11 -0
- package/scripts/magic/types/deploy/kubernetes.ts +38 -0
- package/scripts/magic/types/deploy/types.ts +29 -0
- package/scripts/magic/types/gitlab-types.ts +77 -0
- package/scripts/magic/types/index.ts +3 -0
- package/scripts/magic.ts +51 -0
- package/scripts/monorepoGenerate.ts +104 -0
- package/scripts/printAllValues.ts +17 -0
- package/scripts/printBuildEnv.ts +22 -0
- package/scripts/utils/extractAllValues.ts +32 -0
- package/scripts/utils/extractBuildEnv.ts +92 -0
- package/scripts/utils/extractValuesFromEnvVars.ts +21 -0
- package/scripts/utils/extractValuesFromMr.ts +39 -0
- package/tests/extractValuesFromMr.test.ts +156 -0
- package/tsconfig.json +10 -0
package/Dockerfile
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
|
|
2
|
+
FROM node:14
|
|
3
|
+
|
|
4
|
+
RUN rm /bin/sh && \
|
|
5
|
+
ln -s /bin/bash /bin/sh && \
|
|
6
|
+
mkdir -p /root/.nvm
|
|
7
|
+
|
|
8
|
+
# add sources
|
|
9
|
+
# Google Chrome (for testing purposes)
|
|
10
|
+
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
|
|
11
|
+
sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
|
|
12
|
+
|
|
13
|
+
# install some sources
|
|
14
|
+
RUN apt-get update && apt-get install -y \
|
|
15
|
+
git ssh-client \
|
|
16
|
+
openssl \
|
|
17
|
+
curl \
|
|
18
|
+
bash \
|
|
19
|
+
apt-transport-https \
|
|
20
|
+
ca-certificates \
|
|
21
|
+
git \
|
|
22
|
+
gettext-base \
|
|
23
|
+
libxss1 \
|
|
24
|
+
google-chrome-stable
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# set high timeout for yarn, see https://github.com/dhis2/notes/issues/29
|
|
29
|
+
RUN yarn config set network-timeout 600000 -g
|
|
30
|
+
|
|
31
|
+
# add semantic release
|
|
32
|
+
RUN yarn global add \
|
|
33
|
+
semantic-release \
|
|
34
|
+
@semantic-release/commit-analyzer \
|
|
35
|
+
@semantic-release/release-notes-generator \
|
|
36
|
+
@semantic-release/git \
|
|
37
|
+
@semantic-release/changelog \
|
|
38
|
+
@semantic-release/gitlab;
|
|
39
|
+
|
|
40
|
+
# kubernetes & helm
|
|
41
|
+
ENV KUBERNETES_VERSION 1.18.20
|
|
42
|
+
RUN curl -L -o /usr/bin/kubectl "https://storage.googleapis.com/kubernetes-release/release/v${KUBERNETES_VERSION}/bin/linux/amd64/kubectl" ;\
|
|
43
|
+
chmod +x /usr/bin/kubectl ;\
|
|
44
|
+
kubectl version --client
|
|
45
|
+
|
|
46
|
+
# helm 2 for legacy reasons
|
|
47
|
+
ENV HELM_2_VERSION 2.14.3
|
|
48
|
+
RUN curl "https://get.helm.sh/helm-v${HELM_2_VERSION}-linux-amd64.tar.gz" | tar zx ;\
|
|
49
|
+
mv linux-amd64/helm /usr/bin/ ;\
|
|
50
|
+
helm version --client
|
|
51
|
+
RUN cp /usr/bin/helm /usr/bin/helm2
|
|
52
|
+
# helm3
|
|
53
|
+
ENV HELM_VERSION 3.6.3
|
|
54
|
+
RUN curl "https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz" | tar zx ;\
|
|
55
|
+
mv linux-amd64/helm /usr/bin/helm3 ;\
|
|
56
|
+
helm3 version --client
|
|
57
|
+
|
|
58
|
+
# install nvm && some common node versions
|
|
59
|
+
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash && \
|
|
60
|
+
source /root/.nvm/nvm.sh && \
|
|
61
|
+
chmod +x /root/.nvm/nvm.sh && \
|
|
62
|
+
/root/.nvm/nvm.sh install 10 && \
|
|
63
|
+
/root/.nvm/nvm.sh install 12 && \
|
|
64
|
+
/root/.nvm/nvm.sh install 14 && \
|
|
65
|
+
/root/.nvm/nvm.sh install 16
|
|
66
|
+
|
|
67
|
+
# add meteor (used by some apps)
|
|
68
|
+
# install also additional used released (should theoretically speed up ci-builds)
|
|
69
|
+
RUN curl https://install.meteor.com/ | sh && \
|
|
70
|
+
meteor update --release 2.2 --allow-superuser
|
|
71
|
+
|
|
72
|
+
# scripts
|
|
73
|
+
|
|
74
|
+
RUN yarn global add ts-node typescript
|
|
75
|
+
|
|
76
|
+
COPY ./scripts /scripts
|
|
77
|
+
RUN chmod +x /scripts/*
|
|
78
|
+
|
|
79
|
+
COPY package.json /scripts/
|
|
80
|
+
COPY yarn.lock /scripts/
|
|
81
|
+
|
|
82
|
+
WORKDIR /scripts
|
|
83
|
+
RUN yarn
|
|
84
|
+
ENV PATH="/scripts:${PATH}"
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { GitlabJobDef } from "../types/gitlab-types";
|
|
2
|
+
import { Config } from "../types/config";
|
|
3
|
+
import { Context } from "../types/context";
|
|
4
|
+
export declare const createContext: (componentName: string, config: Config) => Context;
|
|
5
|
+
export declare const createJobs: (envs: string[], config: Config, componentName: string) => Record<string, GitlabJobDef>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
30
|
+
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
31
|
+
to[j] = from[i];
|
|
32
|
+
return to;
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
exports.__esModule = true;
|
|
38
|
+
exports.createJobs = exports.createContext = void 0;
|
|
39
|
+
var lodash_1 = require("lodash");
|
|
40
|
+
var slugify_1 = __importDefault(require("slugify"));
|
|
41
|
+
var build_1 = require("../types/build");
|
|
42
|
+
var deploy_1 = require("../types/deploy");
|
|
43
|
+
var createRawJobs = function (context) {
|
|
44
|
+
var buildJobs = build_1.buildJobCreators[context.componentConfig.build.type](context);
|
|
45
|
+
var deployJobs = deploy_1.deployJobCreators[context.componentConfig.deploy.type](context);
|
|
46
|
+
return __spreadArray(__spreadArray([], __read(buildJobs)), __read(deployJobs));
|
|
47
|
+
};
|
|
48
|
+
var getEnvironment = function (config, componentName, env) {
|
|
49
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
50
|
+
var componentConfig = config.components[componentName];
|
|
51
|
+
if (!componentConfig) {
|
|
52
|
+
throw new Error("unknown component " + componentName);
|
|
53
|
+
}
|
|
54
|
+
var defaultConfig = componentConfig;
|
|
55
|
+
var envConfig = (_b = (_a = componentConfig.env) === null || _a === void 0 ? void 0 : _a[env]) !== null && _b !== void 0 ? _b : {};
|
|
56
|
+
var mergedConfig = lodash_1.merge({}, defaultConfig, envConfig);
|
|
57
|
+
var publicEnvVars = (_d = (_c = mergedConfig.vars) === null || _c === void 0 ? void 0 : _c.public) !== null && _d !== void 0 ? _d : {};
|
|
58
|
+
var secretEnvVarsRaw = (_f = (_e = mergedConfig.vars) === null || _e === void 0 ? void 0 : _e.secret) !== null && _f !== void 0 ? _f : {}; // TODO, map to gl secrets?
|
|
59
|
+
var secretEnvVars = {}; // TODO
|
|
60
|
+
var referencedRaw = (_h = (_g = mergedConfig.vars) === null || _g === void 0 ? void 0 : _g.fromComponents) !== null && _h !== void 0 ? _h : {};
|
|
61
|
+
var referenced = Object.entries(referencedRaw).reduce(function (acc, _a) {
|
|
62
|
+
var _b = __read(_a, 2), otherApp = _b[0], mapping = _b[1];
|
|
63
|
+
// TODO: prevent infinit looop
|
|
64
|
+
var variables = getEnvironment(config, otherApp, env).variables;
|
|
65
|
+
return Object.fromEntries(Object.entries(mapping).map(function (_a) {
|
|
66
|
+
var _b = __read(_a, 2), ourKey = _b[0], otherKey = _b[1];
|
|
67
|
+
return [
|
|
68
|
+
ourKey,
|
|
69
|
+
variables[otherKey],
|
|
70
|
+
];
|
|
71
|
+
}));
|
|
72
|
+
}, {});
|
|
73
|
+
var envType = (_l = (_k = (_j = componentConfig.env) === null || _j === void 0 ? void 0 : _j[env]) === null || _k === void 0 ? void 0 : _k.type) !== null && _l !== void 0 ? _l : env;
|
|
74
|
+
var environmentName = envType === "review"
|
|
75
|
+
? env + "-" + componentName + "/$CI_COMMIT_REF_NAME"
|
|
76
|
+
: env + "-" + componentName;
|
|
77
|
+
var KUBE_APP_NAME = envType === "review"
|
|
78
|
+
? componentName + "-$CI_COMMIT_REF_SLUG"
|
|
79
|
+
: componentName;
|
|
80
|
+
var KUBE_NAMESPACE = config.customerName + "-" + config.appName + "-" + env;
|
|
81
|
+
var APP_SLUG = slugify_1["default"](KUBE_APP_NAME);
|
|
82
|
+
var CANONICAL_HOST = config.appName + "-" + APP_SLUG + "." + config.customerName + ".panter.cloud";
|
|
83
|
+
var hostname = (_m = mergedConfig.hostname) !== null && _m !== void 0 ? _m : CANONICAL_HOST;
|
|
84
|
+
var url = "https://" + hostname;
|
|
85
|
+
var predefinedVariables = {
|
|
86
|
+
CANONICAL_URL: url,
|
|
87
|
+
ROOT_URL: url,
|
|
88
|
+
KUBE_NAMESPACE: KUBE_NAMESPACE
|
|
89
|
+
};
|
|
90
|
+
var variables = __assign(__assign(__assign(__assign({}, predefinedVariables), publicEnvVars), secretEnvVars), referenced);
|
|
91
|
+
return {
|
|
92
|
+
fullName: environmentName,
|
|
93
|
+
shortName: env,
|
|
94
|
+
url: url,
|
|
95
|
+
variables: variables
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
var createContext = function (componentName, config) {
|
|
99
|
+
var componentConfig = config.components[componentName];
|
|
100
|
+
if (!componentConfig) {
|
|
101
|
+
throw new Error("unknown component " + componentName);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
fullConfig: config,
|
|
105
|
+
componentConfig: componentConfig,
|
|
106
|
+
componentName: componentName
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
exports.createContext = createContext;
|
|
110
|
+
var getFullJobName = function (name, componentName, env) {
|
|
111
|
+
if (env) {
|
|
112
|
+
return env + " " + componentName + " " + name;
|
|
113
|
+
}
|
|
114
|
+
return componentName + " " + name;
|
|
115
|
+
};
|
|
116
|
+
var replaceReferences = function (def, componentName, env) {
|
|
117
|
+
var _a, _b;
|
|
118
|
+
return __assign(__assign({}, def), { needs: (_a = def.needs) === null || _a === void 0 ? void 0 : _a.map(function (n) { return getFullJobName(n, componentName, env); }), dependencies: (_b = def.dependencies) === null || _b === void 0 ? void 0 : _b.map(function (n) {
|
|
119
|
+
return getFullJobName(n, componentName, env);
|
|
120
|
+
}) });
|
|
121
|
+
};
|
|
122
|
+
var createJobs = function (envs, config, componentName) {
|
|
123
|
+
var context = exports.createContext(componentName, config);
|
|
124
|
+
var jobs = createRawJobs(context);
|
|
125
|
+
var environments = envs.map(function (e) {
|
|
126
|
+
return getEnvironment(config, componentName, e);
|
|
127
|
+
});
|
|
128
|
+
return jobs.reduce(function (acc, job) {
|
|
129
|
+
var _a;
|
|
130
|
+
if (!job.env) {
|
|
131
|
+
var def = job.job();
|
|
132
|
+
return __assign(__assign({}, acc), (_a = {}, _a[getFullJobName(job.name, componentName)] = replaceReferences(def, componentName), _a));
|
|
133
|
+
}
|
|
134
|
+
return __assign(__assign({}, acc), environments.reduce(function (envacc, environment) {
|
|
135
|
+
var _a;
|
|
136
|
+
var def = job.job(environment);
|
|
137
|
+
return __assign(__assign({}, acc), (_a = {}, _a[getFullJobName(job.name, componentName, environment.shortName)] = replaceReferences(def, componentName, environment.shortName), _a));
|
|
138
|
+
}, {}));
|
|
139
|
+
}, {});
|
|
140
|
+
};
|
|
141
|
+
exports.createJobs = createJobs;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Config, PipelineTrigger } from "./types/config";
|
|
2
|
+
export declare const createPipeline: (trigger: PipelineTrigger, config: Config) => Promise<{
|
|
3
|
+
image: string;
|
|
4
|
+
workflow: {
|
|
5
|
+
rules: ({
|
|
6
|
+
if: string;
|
|
7
|
+
when?: undefined;
|
|
8
|
+
} | {
|
|
9
|
+
if: string;
|
|
10
|
+
when: string;
|
|
11
|
+
})[];
|
|
12
|
+
};
|
|
13
|
+
stages: string[];
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (_) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.__esModule = true;
|
|
50
|
+
exports.createPipeline = void 0;
|
|
51
|
+
var createChildPipeline_1 = require("./createChildPipeline");
|
|
52
|
+
var config_1 = require("./types/config");
|
|
53
|
+
var createPipeline = function (trigger, config) { return __awaiter(void 0, void 0, void 0, function () {
|
|
54
|
+
var envs, components, jobs, rules, mainPipeline;
|
|
55
|
+
return __generator(this, function (_a) {
|
|
56
|
+
envs = Object.keys(config_1.ENV_TYPES).filter(function (e) { return config_1.ENV_TYPES[e].trigger === trigger; });
|
|
57
|
+
components = Object.keys(config.components);
|
|
58
|
+
jobs = components.reduce(function (acc, componentName) {
|
|
59
|
+
return __assign(__assign({}, acc), createChildPipeline_1.createJobs(envs, config, componentName));
|
|
60
|
+
}, {});
|
|
61
|
+
rules = [
|
|
62
|
+
// same as rules "always", but with `changes` to only trigger changed branches
|
|
63
|
+
{ "if": "$CI_COMMIT_TAG" },
|
|
64
|
+
{
|
|
65
|
+
"if": "$CI_COMMIT_MESSAGE =~ /^chore(release).*/",
|
|
66
|
+
when: "never"
|
|
67
|
+
},
|
|
68
|
+
{ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/" },
|
|
69
|
+
{
|
|
70
|
+
"if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
|
|
71
|
+
},
|
|
72
|
+
{ "if": "$CI_MERGE_REQUEST_ID" },
|
|
73
|
+
];
|
|
74
|
+
mainPipeline = __assign({ image: "git.panter.ch:5001/catladder/gitlab-ci/pipeline:$PIPELINE_IMAGE_TAG", workflow: {
|
|
75
|
+
rules: rules
|
|
76
|
+
}, stages: ["setup", "test", "build", "deploy", "verify", "actions"] }, jobs);
|
|
77
|
+
return [2 /*return*/, mainPipeline];
|
|
78
|
+
});
|
|
79
|
+
}); };
|
|
80
|
+
exports.createPipeline = createPipeline;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
exports.__esModule = true;
|
|
13
|
+
exports.createPipeline = void 0;
|
|
14
|
+
var createPipeline_1 = require("./createPipeline");
|
|
15
|
+
__createBinding(exports, createPipeline_1, "createPipeline");
|
|
16
|
+
__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
exports.__esModule = true;
|
|
3
|
+
var sampleConfig = {
|
|
4
|
+
customerName: "pan",
|
|
5
|
+
appName: "fonsi",
|
|
6
|
+
components: {
|
|
7
|
+
web: {
|
|
8
|
+
dir: "web",
|
|
9
|
+
build: {
|
|
10
|
+
type: "node-static"
|
|
11
|
+
},
|
|
12
|
+
deploy: {
|
|
13
|
+
type: "kubernetes",
|
|
14
|
+
values: {
|
|
15
|
+
application: {
|
|
16
|
+
resources: {
|
|
17
|
+
limits: {
|
|
18
|
+
cpu: "100m"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
vars: {
|
|
25
|
+
public: {
|
|
26
|
+
GOOGLE_TAG_MANAGER_ID: "1234"
|
|
27
|
+
},
|
|
28
|
+
fromComponents: {
|
|
29
|
+
api: {
|
|
30
|
+
API_URL: "ROOT_URL"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
env: {
|
|
35
|
+
prod: {
|
|
36
|
+
hostname: "fudilo.ch",
|
|
37
|
+
vars: {},
|
|
38
|
+
deploy: {
|
|
39
|
+
type: "kubernetes",
|
|
40
|
+
values: {
|
|
41
|
+
application: {
|
|
42
|
+
resources: {
|
|
43
|
+
limits: {
|
|
44
|
+
cpu: "1000m"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
myCustomProd: {
|
|
52
|
+
type: "prod",
|
|
53
|
+
hostname: "fudilo2.ch"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
api: {
|
|
58
|
+
env: {
|
|
59
|
+
prod: {
|
|
60
|
+
hostname: "api.fudilo.ch"
|
|
61
|
+
},
|
|
62
|
+
myCustomProd: {
|
|
63
|
+
type: "prod",
|
|
64
|
+
hostname: "api.fudilo2.ch"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
build: {
|
|
68
|
+
type: "node"
|
|
69
|
+
},
|
|
70
|
+
deploy: {
|
|
71
|
+
type: "kubernetes"
|
|
72
|
+
},
|
|
73
|
+
dir: "api"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports["default"] = sampleConfig;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
30
|
+
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
31
|
+
to[j] = from[i];
|
|
32
|
+
return to;
|
|
33
|
+
};
|
|
34
|
+
exports.__esModule = true;
|
|
35
|
+
exports.createDockerBuildJob = void 0;
|
|
36
|
+
var createDockerBuildJob = function (_a) {
|
|
37
|
+
var script = _a.script;
|
|
38
|
+
var base = {
|
|
39
|
+
stage: "build",
|
|
40
|
+
image: "git.panter.ch:5001/catladder/gitlab-ci/docker-build:$PIPELINE_IMAGE_TAG",
|
|
41
|
+
interruptible: true,
|
|
42
|
+
services: [
|
|
43
|
+
{
|
|
44
|
+
name: "docker:20-dind",
|
|
45
|
+
command: ["--tls=false"]
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
variables: {
|
|
49
|
+
DOCKER_DRIVER: "overlay2",
|
|
50
|
+
IMAGE_NAME: "$CI_REGISTRY_IMAGE/$COMPONENT_NAME",
|
|
51
|
+
CACHE_IMAGE: "$CI_REGISTRY_IMAGE/$COMPONENT_NAME/cache:cache"
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
return __assign(__assign({}, base), { script: __spreadArray(__spreadArray([], __read(script)), [
|
|
55
|
+
"docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
|
|
56
|
+
"docker pull $CACHE_IMAGE || true",
|
|
57
|
+
"docker build --network host --cache-from $CACHE_IMAGE --tag $IMAGE_NAME:$IMAGE_TAG $DOCKER_DIR",
|
|
58
|
+
"docker push $IMAGE_NAME:$IMAGE_TAG",
|
|
59
|
+
"docker tag $IMAGE_NAME:$IMAGE_TAG $CACHE_IMAGE",
|
|
60
|
+
"docker push $CACHE_IMAGE",
|
|
61
|
+
]) });
|
|
62
|
+
};
|
|
63
|
+
exports.createDockerBuildJob = createDockerBuildJob;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
30
|
+
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
31
|
+
to[j] = from[i];
|
|
32
|
+
return to;
|
|
33
|
+
};
|
|
34
|
+
exports.__esModule = true;
|
|
35
|
+
exports.createNodeJobs = void 0;
|
|
36
|
+
var docker_1 = require("./docker");
|
|
37
|
+
var yarnInstall = [
|
|
38
|
+
"cd $APP_PATH",
|
|
39
|
+
"if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
|
|
40
|
+
"yarn install --frozen-lockfile",
|
|
41
|
+
];
|
|
42
|
+
var baseRetry = {
|
|
43
|
+
max: 2,
|
|
44
|
+
when: ["runner_system_failure", "stuck_or_timeout_failure"]
|
|
45
|
+
};
|
|
46
|
+
var createNodeTestJobs = function (context) {
|
|
47
|
+
var cache = [
|
|
48
|
+
{
|
|
49
|
+
key: "node-modules",
|
|
50
|
+
policy: "pull-push",
|
|
51
|
+
paths: ["node_modules", "**/node_modules/"]
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
var base = {
|
|
55
|
+
variables: {
|
|
56
|
+
APP_PATH: context.componentConfig.dir
|
|
57
|
+
},
|
|
58
|
+
cache: cache,
|
|
59
|
+
stage: "test",
|
|
60
|
+
interruptible: true,
|
|
61
|
+
needs: [],
|
|
62
|
+
retry: baseRetry
|
|
63
|
+
};
|
|
64
|
+
return [
|
|
65
|
+
{
|
|
66
|
+
name: "test",
|
|
67
|
+
env: false,
|
|
68
|
+
job: function () { return (__assign(__assign({}, base), { script: __spreadArray(__spreadArray([], __read(yarnInstall)), ["yarn test"]) })); }
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "lint",
|
|
72
|
+
env: false,
|
|
73
|
+
job: function () { return (__assign(__assign({}, base), { script: __spreadArray(__spreadArray([], __read(yarnInstall)), ["yarn lint"]) })); }
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "audit",
|
|
77
|
+
env: false,
|
|
78
|
+
job: function () { return (__assign(__assign({}, base), { script: __spreadArray(__spreadArray([], __read(yarnInstall)), ["yarn audit"]) })); }
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
};
|
|
82
|
+
var createNodeBuildJobs = function (context) {
|
|
83
|
+
var buildInfo = [
|
|
84
|
+
". getCommitInfo",
|
|
85
|
+
"echo '{\"id\":\"'$BUILD_ID'\",\"commit\":\"'$BUILD_COMMIT'\",\"tag\":\"'$BUILD_TAG'\",\"time\":\"'$BUILD_TIME'\"}' > $APP_DIR/__build_info.json",
|
|
86
|
+
];
|
|
87
|
+
return [
|
|
88
|
+
{
|
|
89
|
+
name: "app-build",
|
|
90
|
+
env: true,
|
|
91
|
+
job: function (environment) { return ({
|
|
92
|
+
variables: environment.variables,
|
|
93
|
+
retry: baseRetry,
|
|
94
|
+
interruptible: true,
|
|
95
|
+
stage: "build",
|
|
96
|
+
script: __spreadArray(__spreadArray(__spreadArray([], __read(buildInfo)), __read(yarnInstall)), ["yarn build"]),
|
|
97
|
+
artifacts: {
|
|
98
|
+
paths: [
|
|
99
|
+
context.componentConfig.dir + "/__build_info.json",
|
|
100
|
+
context.componentConfig.dir + "/dist",
|
|
101
|
+
context.componentConfig.dir + "/.next",
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
}); }
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: "docker-build",
|
|
108
|
+
env: true,
|
|
109
|
+
job: function () { return (__assign(__assign({}, docker_1.createDockerBuildJob({
|
|
110
|
+
script: ["ensureNodeDockerfile"]
|
|
111
|
+
})), { needs: ["app-build"] })); }
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
};
|
|
115
|
+
var createNodeJobs = function (context) {
|
|
116
|
+
return __spreadArray(__spreadArray([], __read(createNodeBuildJobs(context))), __read(createNodeTestJobs(context)));
|
|
117
|
+
};
|
|
118
|
+
exports.createNodeJobs = createNodeJobs;
|