Jenkinsfile 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. pipeline {
  2. options {
  3. ansiColor('xterm')
  4. }
  5. agent {
  6. kubernetes {
  7. yamlFile 'builder.yaml'
  8. }
  9. }
  10. // Definición de variables de entorno
  11. environment {
  12. NOMBRE_APP = 'reymota'
  13. REGISTRO = 'harbor.reymota.es/reymota'
  14. }
  15. // Definición de parámetros
  16. parameters {
  17. booleanParam(name: 'install', description: 'Instalar todo', defaultValue: false)
  18. booleanParam(name: 'clean', description: 'Borrar todo', defaultValue: false)
  19. booleanParam(name: 'claims', description: 'Crea PVC', defaultValue: false)
  20. booleanParam(name: 'borraclaims', description: 'Borra PVC', defaultValue: false)
  21. booleanParam(name: 'namespace', description: 'Crea namespace', defaultValue: false)
  22. booleanParam(name: 'borranamespace', description: 'Borra namespace', defaultValue: false)
  23. booleanParam(name: 'creadb', description: 'Crea el objeto para crear la DB en el cúster', defaultValue: false)
  24. booleanParam(name: 'borradb', description: 'Borra el objeto que creó la DB, no la DB', defaultValue: false)
  25. booleanParam(name: 'servicelb', description: 'Crea el servicio LoadBalancer', defaultValue: false)
  26. booleanParam(name: 'servicenp', description: 'Crea el servicio NodePort', defaultValue: false)
  27. }
  28. stages {
  29. stage('Crea las PVC') {
  30. when {
  31. expression { params.claims}
  32. }
  33. steps {
  34. echo "Creando las PVC..."
  35. container('kubectl') {
  36. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  37. sh """#!/bin/bash
  38. cat K8S/pvc-${NOMBRE_APP}.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl create -f -
  39. cat K8S/pvc-static.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl create -f -
  40. """
  41. }
  42. }
  43. }
  44. }
  45. stage('Borra las PVC') {
  46. when {
  47. expression { params.borraclaims}
  48. }
  49. steps {
  50. echo "Borrando las PVC..."
  51. container('kubectl') {
  52. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  53. sh """#!/bin/bash
  54. cat K8S/pvc-${NOMBRE_APP}.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl delete -f -
  55. cat K8S/pvc-static.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl delete -f -
  56. """
  57. }
  58. }
  59. }
  60. }
  61. stage('Crea el objeto para crear la DB') {
  62. when {
  63. expression { params.creadb}
  64. }
  65. steps {
  66. echo "Creando el objeto que crea la DB..."
  67. container('kubectl') {
  68. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  69. sh """#!/bin/bash
  70. kubectl create -f K8S/${NOMBRE_APP}-db.yaml
  71. """
  72. }
  73. }
  74. }
  75. }
  76. stage('Borra el objeto que creó la DB, no la DB') {
  77. when {
  78. expression { params.borradb}
  79. }
  80. steps {
  81. echo "Borrando el objeto que creó la DB..."
  82. container('kubectl') {
  83. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  84. sh """#!/bin/bash
  85. kubectl delete -f K8S/${NOMBRE_APP}-db.yaml
  86. """
  87. }
  88. }
  89. }
  90. }
  91. stage('Crea el servicio NodePort') {
  92. when {
  93. expression { params.servicenp}
  94. }
  95. steps {
  96. echo "Creando el servicio NodePort..."
  97. container('kubectl') {
  98. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  99. sh """#!/bin/bash
  100. cat K8S/${NOMBRE_APP}-service-np-lb.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl delete -f - || true
  101. cat K8S/${NOMBRE_APP}-service.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl create -f -
  102. """
  103. }
  104. }
  105. }
  106. }
  107. stage('Crea el servicio LoadBalancer') {
  108. when {
  109. expression { params.servicelb}
  110. }
  111. steps {
  112. echo "Creando el servicio LoadBalancer..."
  113. container('kubectl') {
  114. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  115. sh """#!/bin/bash
  116. cat K8S/${NOMBRE_APP}-service-np.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl delete -f - || true
  117. cat K8S/${NOMBRE_APP}-service-lb.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl create -f -
  118. """
  119. }
  120. }
  121. }
  122. }
  123. stage('Borra todo') {
  124. when {
  125. expression { params.clean }
  126. }
  127. steps {
  128. echo "Borrando todo..."
  129. container('kubectl') {
  130. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  131. sh """#!/bin/bash
  132. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
  133. sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
  134. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-ingress.yaml
  135. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/reg-secret.yaml
  136. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/secreto-db.yaml
  137. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/env-prod-configmap.yaml
  138. kubectl delete -f K8S/${NOMBRE_APP}-deployment.yaml||true
  139. kubectl delete -f K8S/${NOMBRE_APP}-ingress.yaml||true
  140. kubectl delete -f K8S/secreto-db.yaml||true
  141. kubectl delete -f K8S/reg-secret.yaml||true
  142. kubectl delete -f K8S/env-prod-configmap.yaml||true
  143. """
  144. }
  145. }
  146. }
  147. }
  148. stage('Borra namespace') {
  149. when {
  150. expression { params.borranamespace }
  151. }
  152. steps {
  153. echo "Borrando namespace..."
  154. container('kubectl') {
  155. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  156. sh """#!/bin/bash
  157. cat K8S/namespace.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl delete -f -
  158. """
  159. }
  160. }
  161. }
  162. }
  163. stage('Crea namespace') {
  164. when {
  165. expression { params.namespace }
  166. }
  167. steps {
  168. echo "Creando namespace..."
  169. container('kubectl') {
  170. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  171. sh """#!/bin/bash
  172. cat K8S/namespace.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl create -f -
  173. """
  174. }
  175. }
  176. }
  177. }
  178. stage('Construir image y subirla al registry con Kaniko') {
  179. when {
  180. allOf {
  181. expression { !params.clean }
  182. expression { !params.namespace }
  183. expression { !params.borranamespace }
  184. expression { !params.claims }
  185. expression { !params.borraclaims }
  186. expression { !params.creadb }
  187. expression { !params.borradb }
  188. expression { !params.servicelb }
  189. expression { !params.servicenp }
  190. }
  191. }
  192. steps {
  193. container('kaniko') {
  194. script {
  195. sh '''
  196. /kaniko/executor --dockerfile `pwd`/Dockerfile \
  197. --context `pwd` \
  198. --destination=${REGISTRO}/${NOMBRE_APP}:${BUILD_NUMBER}
  199. '''
  200. }
  201. }
  202. }
  203. }
  204. stage('Instala todo') {
  205. when {
  206. expression { params.install }
  207. }
  208. steps {
  209. echo "Creando todo..."
  210. container('kubectl') {
  211. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  212. sh """#!/bin/bash
  213. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
  214. sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
  215. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-ingress.yaml
  216. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/reg-secret.yaml
  217. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/secreto-db.yaml
  218. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/env-prod-configmap.yaml
  219. kubectl create -f K8S/reg-secret.yaml||true
  220. kubectl create -f K8S/secreto-db.yaml||true
  221. kubectl apply -f K8S/env-prod-configmap.yaml
  222. sed -i "s/<TAG>/${BUILD_NUMBER}/" K8S/${NOMBRE_APP}-deployment.yaml
  223. kubectl apply -f K8S/${NOMBRE_APP}-deployment.yaml
  224. kubectl create -f K8S/${NOMBRE_APP}-ingress.yaml||true
  225. """
  226. }
  227. }
  228. }
  229. }
  230. stage('Despliega la aplicación en Kubernetes') {
  231. when {
  232. allOf {
  233. expression { !params.clean }
  234. expression { !params.namespace }
  235. expression { !params.borranamespace }
  236. expression { !params.claims }
  237. expression { !params.borraclaims }
  238. expression { !params.creadb }
  239. expression { !params.borradb }
  240. expression { !params.servicelb }
  241. expression { !params.servicenp }
  242. }
  243. }
  244. steps {
  245. echo "Desplegando la aplicación"
  246. container('kubectl') {
  247. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  248. sh """#!/bin/bash
  249. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
  250. sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
  251. sed -i "s/<TAG>/${BUILD_NUMBER}/" K8S/${NOMBRE_APP}-deployment.yaml
  252. kubectl delete -f K8S/${NOMBRE_APP}-deployment.yaml || true
  253. kubectl apply -f K8S/${NOMBRE_APP}-deployment.yaml
  254. """
  255. }
  256. }
  257. }
  258. }
  259. }
  260. post {
  261. always {
  262. mail to: 'creylopez@yahoo.es',
  263. subject: "Trabajo ${currentBuild.fullDisplayName}",
  264. body: "El resultado del trabajo '${currentBuild.fullDisplayName}' ha sido <b>${currentBuild.result}</b>: Comprueba la salida de consola en ${env.BUILD_URL} para ver los resultados.",
  265. mimeType: 'text/html'
  266. }
  267. failure {
  268. mail to: 'creylopez@yahoo.es',
  269. subject: "El trabajo ${currentBuild.fullDisplayName} ha fallado",
  270. body: "El trabajo ha <b>FALLADO</b>: Comprueba la salida de consola en ${env.BUILD_URL} para ver los resultados.",
  271. mimeType: 'text/html'
  272. }
  273. unstable {
  274. echo 'El trabajo ${currentBuild.fullDisplayName} ha sido marcado como inestable'
  275. }
  276. changed {
  277. mail bcc: '',
  278. body: "El estado del trabajo '${currentBuild.fullDisplayName}' ha cambiado",
  279. from: '',
  280. replyTo: '',
  281. subject: "El estado del trabajo ha cambiado",
  282. to: 'creylopez@yahoo.es',
  283. mimeType: 'text/html'
  284. }
  285. }
  286. }