Jenkinsfile 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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 = 'jugaralpadel'
  13. //REGISTRO = 'harbor.reymota.es/jugaralpadel'
  14. REGISTRO = 'registry.reymota.es'
  15. }
  16. // Definición de parámetros
  17. parameters {
  18. booleanParam(name: 'install', description: 'Instalar todo', defaultValue: false)
  19. booleanParam(name: 'clean', description: 'Borrar todo', defaultValue: false)
  20. booleanParam(name: 'claims', description: 'Crea PVC', defaultValue: false)
  21. booleanParam(name: 'borraclaims', description: 'Borra PVC', defaultValue: false)
  22. booleanParam(name: 'namespace', description: 'Crea namespace', defaultValue: false)
  23. booleanParam(name: 'borranamespace', description: 'Borra namespace', defaultValue: false)
  24. booleanParam(name: 'creadb', description: 'Crea el objeto para crear la DB en el cúster', defaultValue: false)
  25. booleanParam(name: 'borradb', description: 'Borra el objeto que creó la DB, no la DB', defaultValue: false)
  26. booleanParam(name: 'servicelb', description: 'Crea el servicio LoadBalancer', 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.servicelb}
  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-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.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. }
  189. }
  190. steps {
  191. container('kaniko') {
  192. script {
  193. sh '''
  194. /kaniko/executor --dockerfile `pwd`/Dockerfile \
  195. --context `pwd` \
  196. --destination=${REGISTRO}/${NOMBRE_APP}:${BUILD_NUMBER}
  197. '''
  198. }
  199. }
  200. }
  201. }
  202. stage('Instala todo') {
  203. when {
  204. expression { params.install }
  205. }
  206. steps {
  207. echo "Creando todo..."
  208. container('kubectl') {
  209. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  210. sh """#!/bin/bash
  211. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
  212. sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
  213. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-ingress.yaml
  214. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/reg-secret.yaml
  215. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/secreto-db.yaml
  216. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/env-prod-configmap.yaml
  217. kubectl create -f K8S/reg-secret.yaml||true
  218. kubectl create -f K8S/secreto-db.yaml||true
  219. kubectl apply -f K8S/env-prod-configmap.yaml
  220. sed -i "s/<TAG>/${BUILD_NUMBER}/" K8S/${NOMBRE_APP}-deployment.yaml
  221. kubectl apply -f K8S/${NOMBRE_APP}-deployment.yaml
  222. kubectl create -f K8S/${NOMBRE_APP}-ingress.yaml||true
  223. """
  224. }
  225. }
  226. }
  227. }
  228. stage('Despliega la aplicación en Kubernetes') {
  229. when {
  230. allOf {
  231. expression { !params.clean }
  232. expression { !params.namespace }
  233. expression { !params.borranamespace }
  234. expression { !params.claims }
  235. expression { !params.borraclaims }
  236. expression { !params.creadb }
  237. expression { !params.borradb }
  238. }
  239. }
  240. steps {
  241. echo "Desplegando la aplicación"
  242. container('kubectl') {
  243. withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
  244. sh """#!/bin/bash
  245. sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
  246. sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
  247. sed -i "s/<TAG>/${BUILD_NUMBER}/" K8S/${NOMBRE_APP}-deployment.yaml
  248. kubectl delete -f K8S/${NOMBRE_APP}-deployment.yaml || true
  249. kubectl apply -f K8S/${NOMBRE_APP}-deployment.yaml
  250. """
  251. }
  252. }
  253. }
  254. }
  255. }
  256. post {
  257. always {
  258. mail to: 'creylopez@yahoo.es',
  259. subject: "Trabajo ${currentBuild.fullDisplayName}",
  260. 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.",
  261. mimeType: 'text/html'
  262. }
  263. failure {
  264. mail to: 'creylopez@yahoo.es',
  265. subject: "El trabajo ${currentBuild.fullDisplayName} ha fallado",
  266. body: "El trabajo ha <b>FALLADO</b>: Comprueba la salida de consola en ${env.BUILD_URL} para ver los resultados.",
  267. mimeType: 'text/html'
  268. }
  269. unstable {
  270. echo 'El trabajo ${currentBuild.fullDisplayName} ha sido marcado como inestable'
  271. }
  272. changed {
  273. mail bcc: '',
  274. body: "El estado del trabajo '${currentBuild.fullDisplayName}' ha cambiado",
  275. from: '',
  276. replyTo: '',
  277. subject: "El estado del trabajo ha cambiado",
  278. to: 'creylopez@yahoo.es',
  279. mimeType: 'text/html'
  280. }
  281. }
  282. }