-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile-CI
127 lines (114 loc) · 5.15 KB
/
Jenkinsfile-CI
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
@Library(['build', 'general']) _
pipeline {
agent any
options {
buildDiscarder(logRotator(numToKeepStr: '5'))
disableConcurrentBuilds()
timestamps()
ansiColor('xterm')
}
environment {
SERVICES_FILE = 'simple-java-project/apps/services.json'
GIT_REPO_OWNER = 'MODifikaTOR18'
GIT_REPO_NAME = 'TMS-lesson38'
DOCKER_REGISTRY = "ghcr.io/${GIT_REPO_OWNER.toLowerCase()}"
}
stages {
stage('Prepare') {
steps {
script {
log.info("Starting preparation steps...")
PR_ID = prID.prID(env.BRANCH_NAME)
apps = readJSON file: SERVICES_FILE
log.info ("Branch: ${env.BRANCH_NAME}")
log.info ("Pull request ID: ${PR_ID}")
TAG_STACK = sh(returnStdout: true, script: "git tag --sort version:refname | tail -1").trim()
env.TAG = (TAG_STACK.isEmpty()) ? 'latest' : TAG_STACK
log.info ("Current tag for build is: ${env.TAG}")
PR_DIFF=[]
BUILD_APPS=[:]
PR_DIFF=sh(script: 'git show --pretty=format: --name-only', returnStdout: true).trim()
log.info ("Pull request diffs:\n${PR_DIFF}")
if (PR_ID.isEmpty()) {
log.warning ("Pull request id not found")
def response = httpRequest url: "https://api.github.com/repos/${GIT_REPO_OWNER}/${GIT_REPO_NAME}/pulls/${PR_ID}/files",
customHeaders: [[name: 'Accept', value: 'application/vnd.github+json'],[name: 'X-GitHub-Api-Version', value: '2022-11-28']],
authentication: 'GitHub_ID'
log.info("Request status Github API: "+response.status)
PR_DIFF_DATA = readJSON text: response.content
PR_DIFF_DATA.each { item ->
PR_DIFF.add(item.filename)
}
log.info ("PR diff: ${PR_DIFF}")
apps.each { app, path ->
if (isChanged.isChanged(PR_DIFF, path)) {
BUILD_APPS.put(app, path)
}
}
} else {
BUILD_APPS = apps
}
log.info("Build apps: ${BUILD_APPS}")
Integer PARALLEL_EXECUTE_COUNT = 3
builtApps = [:]
buildStages = stagePrepare('build', BUILD_APPS, PARALLEL_EXECUTE_COUNT, builtApps)
log.info("Prepared!")
}
}
}
stage ('Parallel build') {
steps {
script {
log.info("Starting parallel image build...")
buildStages.each { stage ->
parallel stage
}
log.info("Parallel image build succeeded!")
}
}
}
stage ('Parallel create image') {
when { expression { BRANCH_NAME == 'master'}} //|| BRANCH_NAME ==~ "pr-"+/\d+/ } }
steps {
script {
log.info("Starting parallel image create...")
log.info("Apps were built: ${builtApps}")
Integer PARALLEL_EXECUTE_COUNT = 3
createImageStages = stagePrepare.call('image', builtApps, PARALLEL_EXECUTE_COUNT)
createImageStages.each { stage ->
parallel stage
}
log.info("Images were created.")
}
}
}
stage ('Push image') {
when { expression { BRANCH_NAME == 'master'}} //|| BRANCH_NAME ==~ "PR-"+/\d+/ } }
steps {
script {
log.info("Beginning to push images to GitHub...")
log.info("Tag added to images: ${env.TAG}")
pushedApps = []
withCredentials([usernamePassword(credentialsId: 'GitHub_ID', passwordVariable: 'pass', usernameVariable: 'user')]) {
sh "echo ${pass} | docker login ${DOCKER_REGISTRY} -u ${user} --password-stdin"
log.info("Successfully logged in.")
}
builtApps.each { app, path ->
sh "docker push ${DOCKER_REGISTRY}/${app}:${TAG}"
pushedApps.add(app)
log.info("Successfully pushed docker image ${app} to Docker registry.")
}
log.info("Images were pushed to GitHub!")
}
}
}
}
post {
always {
cleanWs()
}
success {
build job: 'builds/cd', wait: false
}
}
}