@toptal/davinci-ci 3.0.1-alpha-chore-improve-packages-building-14e3a950.51 → 3.0.2-alpha-chore-improve-packages-building-4fb91e1f.10
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/package.json +6 -5
- package/src/commands/danger.js +67 -0
- package/src/configs/danger/conventional-commits/dangerfile.js +17 -0
- package/src/configs/danger/conventional-commits/plugins/conventional-commits/index.js +52 -0
- package/src/configs/danger/conventional-commits/plugins/conventional-pr-title/index.js +53 -0
- package/src/configs/danger/conventional-commits/plugins/index.js +7 -0
- package/src/configs/danger/plugins/empty-assignee.js +24 -0
- package/src/configs/danger/toptal/config.js +30 -0
- package/src/configs/danger/toptal/dangerfile.js +17 -0
- package/src/configs/danger/toptal/plugins/index.js +7 -0
- package/src/configs/danger/toptal/plugins/toptal-commits/index.js +73 -0
- package/src/configs/danger/toptal/plugins/toptal-commits/toptal-commits.test.js +128 -0
- package/src/configs/danger/toptal/plugins/toptal-pr-title/index.js +62 -0
- package/src/configs/danger/toptal/plugins/toptal-pr-title/toptal-pr-title.test.js +68 -0
- package/src/configs/docker/Dockerfile +30 -0
- package/src/configs/docker/Dockerfile.gha-deploy +33 -0
- package/src/configs/docker/Dockerfile.release +28 -0
- package/src/configs/docker/Dockerfile.storybook +20 -0
- package/src/configs/docker/env-runtime.entrypoint.sh +47 -0
- package/src/configs/docker/nginx-vhost-storybook.conf +20 -0
- package/src/configs/docker/nginx-vhost.conf +18 -0
- package/src/configs/jobs/build-image/Jenkinsfile +142 -0
- package/src/configs/jobs/build-image/config.xml +119 -0
- package/src/configs/jobs/build-release-image/Jenkinsfile +154 -0
- package/src/configs/jobs/build-release-image/config.xml +102 -0
- package/src/configs/jobs/consumer-contracts-verify/Jenkinsfile +117 -0
- package/src/configs/jobs/consumer-contracts-verify/config.xml +114 -0
- package/src/configs/jobs/deploy/config.xml +107 -0
- package/src/configs/jobs/deploy-helm-run/Jenkinsfile +159 -0
- package/src/configs/jobs/deploy-helm-run/config.xml +107 -0
- package/src/configs/jobs/deploy-helm-run-trigger/Jenkinsfile +200 -0
- package/src/configs/jobs/master-main/Jenkinsfile +460 -0
- package/src/configs/jobs/master-main/config.xml +119 -0
- package/src/configs/jobs/pr-tests/Jenkinsfile +407 -0
- package/src/configs/jobs/pr-tests/config.xml +134 -0
- package/src/configs/jobs/publish-alpha-package/Jenkinsfile +189 -0
- package/src/configs/jobs/publish-alpha-package/config.xml +136 -0
- package/src/configs/jobs/temploy-helm-run/Jenkinsfile +141 -0
- package/src/configs/jobs/temploy-helm-run/config.xml +97 -0
- package/src/index.js +17 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Create the image with Nginx environment.
|
|
2
|
+
FROM nginx:alpine
|
|
3
|
+
|
|
4
|
+
# Copy results from the dist folder to the image.
|
|
5
|
+
ARG DIST_FOLDER
|
|
6
|
+
RUN [ -z "$DIST_FOLDER" ] && echo "DIST_FOLDER is required" && exit 1 || true
|
|
7
|
+
COPY $DIST_FOLDER /usr/share/nginx/html
|
|
8
|
+
|
|
9
|
+
# Remove source maps from the production build
|
|
10
|
+
RUN find /usr/share/nginx/html -name "*.map" -type f -delete
|
|
11
|
+
|
|
12
|
+
# Copy the entrypoint.
|
|
13
|
+
ARG ENV_RUNTIME_ENTRYPOINT
|
|
14
|
+
RUN [ -z "$ENV_RUNTIME_ENTRYPOINT" ] && echo "ENV_RUNTIME_ENTRYPOINT is required" && exit 1 || true
|
|
15
|
+
COPY $ENV_RUNTIME_ENTRYPOINT /usr/local/bin/env-runtime.entrypoint.sh
|
|
16
|
+
RUN chmod +x /usr/local/bin/env-runtime.entrypoint.sh
|
|
17
|
+
|
|
18
|
+
# version is used in build process, so the value won't be available here otherwise
|
|
19
|
+
ARG VERSION
|
|
20
|
+
RUN [ -z "$VERSION" ] && echo "VERSION is required" && exit 1 || true
|
|
21
|
+
ENV DAVINCI_RELEASE_VERSION $VERSION
|
|
22
|
+
|
|
23
|
+
RUN echo $VERSION > /usr/share/nginx/html/REVISION.txt
|
|
24
|
+
|
|
25
|
+
# Copy configuration file for Nginx and replace the default one.
|
|
26
|
+
ARG NGINX_CONFIG
|
|
27
|
+
RUN [ -z "$NGINX_CONFIG" ] && echo "NGINX_CONFIG is required" && exit 1 || true
|
|
28
|
+
COPY $NGINX_CONFIG /etc/nginx/conf.d/default.conf
|
|
29
|
+
|
|
30
|
+
# Entry point to provide Run Time Environment Variables for the App.
|
|
31
|
+
ENTRYPOINT ["/usr/local/bin/env-runtime.entrypoint.sh"]
|
|
32
|
+
|
|
33
|
+
CMD ["nginx", "-g", "daemon off;"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
ARG VERSION
|
|
2
|
+
ARG REPO_NAME
|
|
3
|
+
|
|
4
|
+
FROM gcr.io/toptal-hub/${REPO_NAME}:${VERSION} as builder
|
|
5
|
+
|
|
6
|
+
FROM nginx:alpine
|
|
7
|
+
|
|
8
|
+
ARG ENV_RUNTIME_ENTRYPOINT
|
|
9
|
+
|
|
10
|
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
|
11
|
+
COPY --from=builder /app/node_modules/@toptal/davinci-ci/src/configs/docker/nginx-vhost.conf /etc/nginx/conf.d/default.conf
|
|
12
|
+
|
|
13
|
+
# Remove source maps from the production build
|
|
14
|
+
RUN find /usr/share/nginx/html -name "*.map" -type f -delete
|
|
15
|
+
|
|
16
|
+
# Copy the entrypoint to prepare env variables
|
|
17
|
+
# example davinci/packages/ci/scr/configs/docker/env-runtime.entrypoint.sh
|
|
18
|
+
COPY ${ENV_RUNTIME_ENTRYPOINT} /usr/local/bin/env-runtime.entrypoint.sh
|
|
19
|
+
|
|
20
|
+
# version is used in build process, so the value won't be available here otherwise
|
|
21
|
+
ARG VERSION
|
|
22
|
+
ENV DAVINCI_RELEASE_VERSION $VERSION
|
|
23
|
+
|
|
24
|
+
RUN echo $VERSION > /usr/share/nginx/html/REVISION.txt
|
|
25
|
+
|
|
26
|
+
ENTRYPOINT ["/usr/local/bin/env-runtime.entrypoint.sh"]
|
|
27
|
+
|
|
28
|
+
CMD ["nginx", "-g", "daemon off;"]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Create the image with Nginx environment.
|
|
2
|
+
FROM nginx:alpine
|
|
3
|
+
|
|
4
|
+
# Copy results from the dist folder to the image.
|
|
5
|
+
ARG DIST_FOLDER
|
|
6
|
+
RUN [ -z "$DIST_FOLDER" ] && echo "DIST_FOLDER is required" && exit 1 || true
|
|
7
|
+
COPY $DIST_FOLDER /usr/share/nginx/html/storybook
|
|
8
|
+
|
|
9
|
+
# version is used in build process, so the value won't be available here otherwise
|
|
10
|
+
ARG VERSION
|
|
11
|
+
RUN [ -z "$VERSION" ] && echo "VERSION is required" && exit 1 || true
|
|
12
|
+
|
|
13
|
+
RUN echo $VERSION > /usr/share/nginx/html/REVISION.txt
|
|
14
|
+
|
|
15
|
+
# Copy configuration file for Nginx and replace the default one.
|
|
16
|
+
ARG NGINX_CONFIG
|
|
17
|
+
RUN [ -z "$NGINX_CONFIG" ] && echo "NGINX_CONFIG is required" && exit 1 || true
|
|
18
|
+
COPY $NGINX_CONFIG /etc/nginx/conf.d/default.conf
|
|
19
|
+
|
|
20
|
+
CMD ["nginx", "-g", "daemon off;"]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/bin/sh -e
|
|
2
|
+
|
|
3
|
+
# This bash script takes required Environment Variables of current process
|
|
4
|
+
# and put them into `index.html` file which is an entry-point of the application.
|
|
5
|
+
# By this way we provide run time variables to a precompiled JS code.
|
|
6
|
+
|
|
7
|
+
# This is how a place which contains `run time` variables may look in `index.html`
|
|
8
|
+
#
|
|
9
|
+
# window.TP = {
|
|
10
|
+
# env: '%REACT_APP_ENV_NAME%',
|
|
11
|
+
# graphql_url: '%REACT_APP_GRAPHQL_URI%'
|
|
12
|
+
# }
|
|
13
|
+
|
|
14
|
+
# keep in sync with index.html
|
|
15
|
+
VARS_PREFIX="DAVINCI_"
|
|
16
|
+
INDEX_FILE="/usr/share/nginx/html/index.html"
|
|
17
|
+
|
|
18
|
+
VARS="$(env | grep $VARS_PREFIX | awk -F = '{print $1}')"
|
|
19
|
+
|
|
20
|
+
# trim whitespaces
|
|
21
|
+
REQUIRED_VARS="$(echo "$VARS" | xargs -n1 | sed 's/^//g')"
|
|
22
|
+
|
|
23
|
+
# trim whitespaces and prepend $ to every var above
|
|
24
|
+
ENVSUBST_KNOWN_VARS="$(echo "$VARS" | xargs -n1 | sed 's/^/\$/g')"
|
|
25
|
+
|
|
26
|
+
# replace all the placeholders %VARIABLE_NAME% with the actual value of the variable
|
|
27
|
+
for placeholder in $REQUIRED_VARS
|
|
28
|
+
do
|
|
29
|
+
value=`printenv "$placeholder"`
|
|
30
|
+
# any character after 's' in sed is used as a separator
|
|
31
|
+
# https://stackoverflow.com/a/16790877/1611414
|
|
32
|
+
sed -i "s|%${placeholder}%|$value|g" $INDEX_FILE
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
MISSING_VARS="$(cat $INDEX_FILE | grep "%$VARS_PREFIX.*%" | sed 's/.*%\(.*\)%.*/\1/g')"
|
|
36
|
+
|
|
37
|
+
if [ -n "$MISSING_VARS" ]; then
|
|
38
|
+
for placeholder in $MISSING_VARS
|
|
39
|
+
do
|
|
40
|
+
if ! printenv "$placeholder" > /dev/null; then
|
|
41
|
+
echo "Variable '$placeholder' is not set. Exiting..."
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
|
44
|
+
done
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
exec "$@"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
server {
|
|
2
|
+
listen 80;
|
|
3
|
+
server_name localhost;
|
|
4
|
+
root /usr/share/nginx/html/storybook;
|
|
5
|
+
|
|
6
|
+
location / {
|
|
7
|
+
try_files $uri $uri/ index.html;
|
|
8
|
+
index index.html;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
location ~ \.(js|png|svg|jpg|gif)$ {
|
|
12
|
+
try_files $uri $uri/ =404;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
# redirect server error pages to the static page /50x.html
|
|
16
|
+
error_page 500 502 503 504 /50x.html;
|
|
17
|
+
location = /50x.html {
|
|
18
|
+
root /usr/share/nginx/html;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# When you are redirecting to any url, which is handled by react-router
|
|
2
|
+
# on nginx we need special configuration to handle those
|
|
3
|
+
# and don't just return 404
|
|
4
|
+
server {
|
|
5
|
+
listen 80;
|
|
6
|
+
server_name localhost;
|
|
7
|
+
|
|
8
|
+
index index.html;
|
|
9
|
+
root /usr/share/nginx/html;
|
|
10
|
+
|
|
11
|
+
location ~ \.(js|css)$ {
|
|
12
|
+
# allow returning 404s for assets
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
location / {
|
|
16
|
+
try_files $uri /index.html;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
@Library('globalLibrary@master') _
|
|
2
|
+
|
|
3
|
+
image = null
|
|
4
|
+
|
|
5
|
+
repositoryName = REPOSITORY_NAME
|
|
6
|
+
repositorySSHUrl = "git@github.com:toptal/${repositoryName}.git"
|
|
7
|
+
env.REPO_NAME_FOR_COMMIT = "toptal/${repositoryName}"
|
|
8
|
+
|
|
9
|
+
pipeline {
|
|
10
|
+
agent { label 'slave_aws' }
|
|
11
|
+
|
|
12
|
+
options {
|
|
13
|
+
ansiColor('xterm')
|
|
14
|
+
timestamps()
|
|
15
|
+
timeout(time: params.TIMEOUT, unit: 'MINUTES')
|
|
16
|
+
buildDiscarder(logRotator(numToKeepStr: '20'))
|
|
17
|
+
skipDefaultCheckout()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
parameters {
|
|
21
|
+
string(name: 'BRANCH', defaultValue: 'master', description: 'Branch or tag to build')
|
|
22
|
+
string(name: 'IMAGE_NAME', description: 'Image name')
|
|
23
|
+
string(name: 'VERSION', description: 'Tag for the created docker image')
|
|
24
|
+
string(name: 'ALIAS_VERSIONS', defaultValue: "", description: 'Comma separated list of alias tags for the created docker image. Ex: "master,latest"')
|
|
25
|
+
string(name: 'REPOSITORY_NAME', description: 'Repository name')
|
|
26
|
+
string(name: 'DAVINCI_BRANCH', defaultValue: 'master', description: 'Davinci branch to checkout')
|
|
27
|
+
string(name: 'TIMEOUT', defaultValue: '25', description: 'Timeout value for the job (in minutes)')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
environment {
|
|
31
|
+
GCE_ACCOUNT_KEY = credentials('jenkins-storage-administrator')
|
|
32
|
+
NPM_TOKEN = credentials('npm-token-for-toptal-private-registry')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
stages {
|
|
36
|
+
|
|
37
|
+
stage('Git checkouts') {
|
|
38
|
+
parallel {
|
|
39
|
+
|
|
40
|
+
stage('Git checkout project') {
|
|
41
|
+
steps {
|
|
42
|
+
dir(repositoryName) {
|
|
43
|
+
info "== Checking out ${BRANCH} =="
|
|
44
|
+
gitCheckout(
|
|
45
|
+
branches: BRANCH,
|
|
46
|
+
credentials: [username: 'toptal-build', description: "toptal-build-ssh-key"],
|
|
47
|
+
url: repositorySSHUrl,
|
|
48
|
+
additionalBehaviours: [
|
|
49
|
+
cleanBeforeCheckout: true
|
|
50
|
+
])
|
|
51
|
+
script { env.COMMIT_FOR_ANVIL = gitCommit() }
|
|
52
|
+
success "== Checked out ${BRANCH} at ${gitCommit()}"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} //checkout project
|
|
56
|
+
|
|
57
|
+
stage('Git checkout davinci') {
|
|
58
|
+
steps {
|
|
59
|
+
dir('davinci') {
|
|
60
|
+
info "== Checking out davinci=="
|
|
61
|
+
gitCheckout(
|
|
62
|
+
branches: DAVINCI_BRANCH,
|
|
63
|
+
credentials: [username: 'toptal-build', description: "toptal-build-ssh-key"],
|
|
64
|
+
url: 'git@github.com:toptal/davinci.git',
|
|
65
|
+
additionalBehaviours: [
|
|
66
|
+
cleanBeforeCheckout: true,
|
|
67
|
+
])
|
|
68
|
+
success "== Checked out"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
} //checkout davinci
|
|
72
|
+
|
|
73
|
+
} // parallel
|
|
74
|
+
} //checkout
|
|
75
|
+
|
|
76
|
+
stage('Build image') {
|
|
77
|
+
steps {
|
|
78
|
+
script {
|
|
79
|
+
sh "gcloud auth activate-service-account --key-file=$GCE_ACCOUNT_KEY"
|
|
80
|
+
|
|
81
|
+
if (!isDockerImagePresentRemotely("gcr.io/toptal-hub/${IMAGE_NAME}", VERSION)) {
|
|
82
|
+
image = docker.build(
|
|
83
|
+
"toptal-hub/${IMAGE_NAME}:${VERSION}",
|
|
84
|
+
"""-f ./davinci/packages/ci/src/configs/docker/Dockerfile \
|
|
85
|
+
--build-arg NPM_TOKEN=${NPM_TOKEN} \
|
|
86
|
+
./${repositoryName}"""
|
|
87
|
+
)
|
|
88
|
+
success "== Built image for version ${VERSION} =="
|
|
89
|
+
} else {
|
|
90
|
+
success "== Found image for version ${VERSION} =="
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!isDockerImagePresentRemotely("us-central1-docker.pkg.dev/toptal-hub/containers/${IMAGE_NAME}", VERSION)) {
|
|
94
|
+
image = docker.build(
|
|
95
|
+
"us-central1-docker.pkg.dev/toptal-hub/containers/${IMAGE_NAME}:${VERSION}",
|
|
96
|
+
"""-f ./davinci/packages/ci/src/configs/docker/Dockerfile \
|
|
97
|
+
--build-arg NPM_TOKEN=${NPM_TOKEN} \
|
|
98
|
+
./${repositoryName}"""
|
|
99
|
+
)
|
|
100
|
+
success "== Built image for version ${VERSION} =="
|
|
101
|
+
} else {
|
|
102
|
+
success "== Found image for version ${VERSION} =="
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
} //build image
|
|
107
|
+
|
|
108
|
+
stage('Push image') {
|
|
109
|
+
steps {
|
|
110
|
+
script {
|
|
111
|
+
if (image) {
|
|
112
|
+
docker.withRegistry('https://gcr.io/toptal-hub/') {
|
|
113
|
+
image.push(VERSION)
|
|
114
|
+
if(ALIAS_VERSIONS) {
|
|
115
|
+
ALIAS_VERSIONS.split(',').each { aliasVersion ->
|
|
116
|
+
image.push(aliasVersion)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
docker.withRegistry('us-central1-docker.pkg.dev/toptal-hub/containers/') {
|
|
121
|
+
image.push(VERSION)
|
|
122
|
+
if(ALIAS_VERSIONS) {
|
|
123
|
+
ALIAS_VERSIONS.split(',').each { aliasVersion ->
|
|
124
|
+
image.push(aliasVersion)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
success "== Pushed image with tag ${VERSION} =="
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
} //push image
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
post {
|
|
136
|
+
always {
|
|
137
|
+
script {
|
|
138
|
+
sendBuildData(currentBuild)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<flow-definition plugin="workflow-job@2.35">
|
|
2
|
+
<actions>
|
|
3
|
+
<org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction plugin="pipeline-model-definition@1.3.9"/>
|
|
4
|
+
<org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction plugin="pipeline-model-definition@1.3.9">
|
|
5
|
+
<jobProperties>
|
|
6
|
+
<string>jenkins.model.BuildDiscarderProperty</string>
|
|
7
|
+
</jobProperties>
|
|
8
|
+
<triggers/>
|
|
9
|
+
<parameters>
|
|
10
|
+
<string>BRANCH</string>
|
|
11
|
+
<string>IMAGE_NAME</string>
|
|
12
|
+
<string>VERSION</string>
|
|
13
|
+
<string>ALIAS_VERSIONS</string>
|
|
14
|
+
<string>REPOSITORY_NAME</string>
|
|
15
|
+
<string>DAVINCI_BRANCH</string>
|
|
16
|
+
<string>TIMEOUT</string>
|
|
17
|
+
</parameters>
|
|
18
|
+
<options>
|
|
19
|
+
<string>skipDefaultCheckout</string>
|
|
20
|
+
</options>
|
|
21
|
+
</org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction>
|
|
22
|
+
</actions>
|
|
23
|
+
<description></description>
|
|
24
|
+
<keepDependencies>false</keepDependencies>
|
|
25
|
+
<properties>
|
|
26
|
+
<hudson.model.ParametersDefinitionProperty>
|
|
27
|
+
<parameterDefinitions>
|
|
28
|
+
<hudson.model.StringParameterDefinition>
|
|
29
|
+
<name>BRANCH</name>
|
|
30
|
+
<description>Branch or tag to build</description>
|
|
31
|
+
<defaultValue>master</defaultValue>
|
|
32
|
+
<trim>false</trim>
|
|
33
|
+
</hudson.model.StringParameterDefinition>
|
|
34
|
+
<hudson.model.StringParameterDefinition>
|
|
35
|
+
<name>IMAGE_NAME</name>
|
|
36
|
+
<description>Image name</description>
|
|
37
|
+
<trim>false</trim>
|
|
38
|
+
</hudson.model.StringParameterDefinition>
|
|
39
|
+
<hudson.model.StringParameterDefinition>
|
|
40
|
+
<name>VERSION</name>
|
|
41
|
+
<description>Tag for the created docker image</description>
|
|
42
|
+
<trim>false</trim>
|
|
43
|
+
</hudson.model.StringParameterDefinition>
|
|
44
|
+
<hudson.model.StringParameterDefinition>
|
|
45
|
+
<name>ALIAS_VERSIONS</name>
|
|
46
|
+
<description>Comma separated list of alias tags for the created docker image. Ex: "master,latest"</description>
|
|
47
|
+
<defaultValue></defaultValue>
|
|
48
|
+
<trim>false</trim>
|
|
49
|
+
</hudson.model.StringParameterDefinition>
|
|
50
|
+
<hudson.model.StringParameterDefinition>
|
|
51
|
+
<name>REPOSITORY_NAME</name>
|
|
52
|
+
<description>Repository name</description>
|
|
53
|
+
<trim>false</trim>
|
|
54
|
+
</hudson.model.StringParameterDefinition>
|
|
55
|
+
<hudson.model.StringParameterDefinition>
|
|
56
|
+
<name>DAVINCI_BRANCH</name>
|
|
57
|
+
<description>Davinci branch to checkout</description>
|
|
58
|
+
<defaultValue>master</defaultValue>
|
|
59
|
+
<trim>false</trim>
|
|
60
|
+
</hudson.model.StringParameterDefinition>
|
|
61
|
+
<hudson.model.StringParameterDefinition>
|
|
62
|
+
<name>TIMEOUT</name>
|
|
63
|
+
<description>Timeout value for the job (in minutes)</description>
|
|
64
|
+
<defaultValue>25</defaultValue>
|
|
65
|
+
<trim>false</trim>
|
|
66
|
+
</hudson.model.StringParameterDefinition>
|
|
67
|
+
</parameterDefinitions>
|
|
68
|
+
</hudson.model.ParametersDefinitionProperty>
|
|
69
|
+
<jenkins.model.BuildDiscarderProperty>
|
|
70
|
+
<strategy class="hudson.tasks.LogRotator">
|
|
71
|
+
<daysToKeep>-1</daysToKeep>
|
|
72
|
+
<numToKeep>20</numToKeep>
|
|
73
|
+
<artifactDaysToKeep>-1</artifactDaysToKeep>
|
|
74
|
+
<artifactNumToKeep>-1</artifactNumToKeep>
|
|
75
|
+
</strategy>
|
|
76
|
+
</jenkins.model.BuildDiscarderProperty>
|
|
77
|
+
<hudson.plugins.jira.JiraProjectProperty plugin="jira@3.0.7"/>
|
|
78
|
+
<com.sonyericsson.jenkins.plugins.bfa.model.ScannerJobProperty plugin="build-failure-analyzer@1.20.0">
|
|
79
|
+
<doNotScan>false</doNotScan>
|
|
80
|
+
</com.sonyericsson.jenkins.plugins.bfa.model.ScannerJobProperty>
|
|
81
|
+
<com.coravy.hudson.plugins.github.GithubProjectProperty plugin="github@1.29.4">
|
|
82
|
+
<projectUrl>$PROJECT_URL</projectUrl>
|
|
83
|
+
<displayName></displayName>
|
|
84
|
+
</com.coravy.hudson.plugins.github.GithubProjectProperty>
|
|
85
|
+
<hudson.plugins.throttleconcurrents.ThrottleJobProperty plugin="throttle-concurrents@2.0.1">
|
|
86
|
+
<maxConcurrentPerNode>0</maxConcurrentPerNode>
|
|
87
|
+
<maxConcurrentTotal>0</maxConcurrentTotal>
|
|
88
|
+
<categories class="java.util.concurrent.CopyOnWriteArrayList"/>
|
|
89
|
+
<throttleEnabled>false</throttleEnabled>
|
|
90
|
+
<throttleOption>project</throttleOption>
|
|
91
|
+
<limitOneJobWithMatchingParams>false</limitOneJobWithMatchingParams>
|
|
92
|
+
<paramsToUseForLimit></paramsToUseForLimit>
|
|
93
|
+
<configVersion>1</configVersion>
|
|
94
|
+
</hudson.plugins.throttleconcurrents.ThrottleJobProperty>
|
|
95
|
+
</properties>
|
|
96
|
+
<definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@2.74">
|
|
97
|
+
<scm class="hudson.plugins.git.GitSCM" plugin="git@3.10.1">
|
|
98
|
+
<configVersion>2</configVersion>
|
|
99
|
+
<userRemoteConfigs>
|
|
100
|
+
<hudson.plugins.git.UserRemoteConfig>
|
|
101
|
+
<url>git@github.com:toptal/davinci.git</url>
|
|
102
|
+
<credentialsId>$CREDENTIALS_ID</credentialsId>
|
|
103
|
+
</hudson.plugins.git.UserRemoteConfig>
|
|
104
|
+
</userRemoteConfigs>
|
|
105
|
+
<branches>
|
|
106
|
+
<hudson.plugins.git.BranchSpec>
|
|
107
|
+
<name>master</name>
|
|
108
|
+
</hudson.plugins.git.BranchSpec>
|
|
109
|
+
</branches>
|
|
110
|
+
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
|
|
111
|
+
<submoduleCfg class="list"/>
|
|
112
|
+
<extensions/>
|
|
113
|
+
</scm>
|
|
114
|
+
<scriptPath>packages/ci/src/configs/jobs/build-image/Jenkinsfile</scriptPath>
|
|
115
|
+
<lightweight>true</lightweight>
|
|
116
|
+
</definition>
|
|
117
|
+
<triggers/>
|
|
118
|
+
<disabled>false</disabled>
|
|
119
|
+
</flow-definition>
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
@Library('globalLibrary@master') _
|
|
2
|
+
|
|
3
|
+
ghHelper = new helpers.GithubNotifyHelper()
|
|
4
|
+
helper = new helpers.Helpers()
|
|
5
|
+
|
|
6
|
+
release_docker_image = null
|
|
7
|
+
|
|
8
|
+
repositoryName = REPOSITORY_NAME
|
|
9
|
+
repositorySSHUrl = "git@github.com:toptal/${repositoryName}.git"
|
|
10
|
+
releaseImageName = "${repositoryName}-release"
|
|
11
|
+
env.REPO_NAME_FOR_COMMIT = "toptal/${repositoryName}"
|
|
12
|
+
|
|
13
|
+
pipeline {
|
|
14
|
+
agent { label 'slave_aws' }
|
|
15
|
+
|
|
16
|
+
options {
|
|
17
|
+
ansiColor('xterm')
|
|
18
|
+
timestamps()
|
|
19
|
+
timeout(time: 15, unit: 'MINUTES')
|
|
20
|
+
buildDiscarder(logRotator(daysToKeepStr: '5'))
|
|
21
|
+
skipDefaultCheckout()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
parameters {
|
|
25
|
+
string(name: 'BRANCH', defaultValue: 'master', description: 'Branch or tag to build')
|
|
26
|
+
string(name: 'DAVINCI_BRANCH', defaultValue: 'master', description: 'Davinci branch')
|
|
27
|
+
string(name: 'IMAGE_TAG', description: 'Docker tag of the image with dist folder which we are going to deploy')
|
|
28
|
+
string(name: 'ALIAS_IMAGE_TAGS', defaultValue: "", description: 'Comma separated list of alias tags for the created docker image. Ex: "master,latest"')
|
|
29
|
+
string(name: 'REPOSITORY_NAME', description: 'Repository name')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
environment {
|
|
33
|
+
GCE_ACCOUNT_KEY = credentials('jenkins-storage-administrator')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
stages {
|
|
37
|
+
stage('Git checkouts') {
|
|
38
|
+
parallel {
|
|
39
|
+
|
|
40
|
+
stage('Git checkout project') {
|
|
41
|
+
steps {
|
|
42
|
+
dir(repositoryName) {
|
|
43
|
+
info "== Checking out ${BRANCH} =="
|
|
44
|
+
gitCheckout(
|
|
45
|
+
branches: BRANCH,
|
|
46
|
+
credentials: [username: 'toptal-build', description: "toptal-build-ssh-key"],
|
|
47
|
+
url: repositorySSHUrl,
|
|
48
|
+
additionalBehaviours: [
|
|
49
|
+
cleanBeforeCheckout: true
|
|
50
|
+
])
|
|
51
|
+
script { env.COMMIT_FOR_ANVIL = gitCommit() }
|
|
52
|
+
success "== Checked out ${BRANCH} at ${gitCommit()}"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} //checkout project
|
|
56
|
+
|
|
57
|
+
stage('Git checkout davinci') {
|
|
58
|
+
steps {
|
|
59
|
+
dir('davinci') {
|
|
60
|
+
info "== Checking out davinci=="
|
|
61
|
+
gitCheckout(
|
|
62
|
+
branches: DAVINCI_BRANCH,
|
|
63
|
+
credentials: [username: 'toptal-build', description: "toptal-build-ssh-key"],
|
|
64
|
+
url: 'git@github.com:toptal/davinci.git',
|
|
65
|
+
additionalBehaviours: [
|
|
66
|
+
cleanBeforeCheckout: true,
|
|
67
|
+
])
|
|
68
|
+
success "== Checked out"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
} //checkout davinci
|
|
72
|
+
|
|
73
|
+
} // parallel
|
|
74
|
+
} //checkout
|
|
75
|
+
|
|
76
|
+
stage('Build docker image') {
|
|
77
|
+
steps {
|
|
78
|
+
info "== Building new docker image"
|
|
79
|
+
script {
|
|
80
|
+
sh "gcloud auth activate-service-account --key-file=$GCE_ACCOUNT_KEY"
|
|
81
|
+
sh "cp ./davinci/packages/ci/src/configs/docker/env-runtime.entrypoint.sh ./${repositoryName}/env-runtime.entrypoint.sh"
|
|
82
|
+
|
|
83
|
+
if (!isDockerImagePresentRemotely("gcr.io/toptal-hub/${releaseImageName}", IMAGE_TAG)) {
|
|
84
|
+
release_docker_image = docker.build(
|
|
85
|
+
"gcr.io/toptal-hub/${releaseImageName}:${IMAGE_TAG}",
|
|
86
|
+
"""-f ./davinci/packages/ci/src/configs/docker/Dockerfile.release \
|
|
87
|
+
--build-arg REPO_NAME=${repositoryName} \
|
|
88
|
+
--build-arg VERSION=${IMAGE_TAG} \
|
|
89
|
+
--build-arg ENV_RUNTIME_ENTRYPOINT=./env-runtime.entrypoint.sh \
|
|
90
|
+
./${repositoryName}"""
|
|
91
|
+
)
|
|
92
|
+
success "== Built '${releaseImageName}' image for version ${IMAGE_TAG} =="
|
|
93
|
+
} else {
|
|
94
|
+
success "== Found '${releaseImageName}' image for version ${IMAGE_TAG} =="
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!isDockerImagePresentRemotely("us-central1-docker.pkg.dev/toptal-hub/containers/${releaseImageName}", IMAGE_TAG)) {
|
|
98
|
+
release_docker_image = docker.build(
|
|
99
|
+
"us-central1-docker.pkg.dev/toptal-hub/containers/${releaseImageName}:${IMAGE_TAG}",
|
|
100
|
+
"""-f ./davinci/packages/ci/src/configs/docker/Dockerfile.release \
|
|
101
|
+
--build-arg REPO_NAME=${repositoryName} \
|
|
102
|
+
--build-arg VERSION=${IMAGE_TAG} \
|
|
103
|
+
--build-arg ENV_RUNTIME_ENTRYPOINT=./env-runtime.entrypoint.sh \
|
|
104
|
+
./${repositoryName}"""
|
|
105
|
+
)
|
|
106
|
+
success "== Built '${releaseImageName}' image for version ${IMAGE_TAG} =="
|
|
107
|
+
} else {
|
|
108
|
+
success "== Found '${releaseImageName}' image for version ${IMAGE_TAG} =="
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
} //steps
|
|
112
|
+
|
|
113
|
+
post {
|
|
114
|
+
always {
|
|
115
|
+
sh "rm ./${repositoryName}/env-runtime.entrypoint.sh"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
} //stage
|
|
119
|
+
|
|
120
|
+
stage('Push docker image for release') {
|
|
121
|
+
steps {
|
|
122
|
+
script {
|
|
123
|
+
if (release_docker_image) {
|
|
124
|
+
docker.withRegistry('https://gcr.io/toptal-hub/') {
|
|
125
|
+
release_docker_image.push(IMAGE_TAG)
|
|
126
|
+
if(ALIAS_IMAGE_TAGS) {
|
|
127
|
+
ALIAS_IMAGE_TAGS.split(',').each { aliasImageTag ->
|
|
128
|
+
release_docker_image.push(aliasImageTag)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
docker.withRegistry('us-central1-docker.pkg.dev/toptal-hub/containers/') {
|
|
133
|
+
release_docker_image.push(IMAGE_TAG)
|
|
134
|
+
if(ALIAS_IMAGE_TAGS) {
|
|
135
|
+
ALIAS_IMAGE_TAGS.split(',').each { aliasImageTag ->
|
|
136
|
+
release_docker_image.push(aliasImageTag)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
success "== Pushed '${releaseImageName}' image for version ${IMAGE_TAG} =="
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
} //steps
|
|
144
|
+
} //stage
|
|
145
|
+
}//stages
|
|
146
|
+
|
|
147
|
+
post {
|
|
148
|
+
always {
|
|
149
|
+
script {
|
|
150
|
+
sendBuildData(currentBuild)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}//pipeline
|