{"id":228,"date":"2020-04-11T15:11:51","date_gmt":"2020-04-11T15:11:51","guid":{"rendered":"http:\/\/blog.thepragmatic.xyz\/?p=228"},"modified":"2023-03-04T05:11:50","modified_gmt":"2023-03-04T05:11:50","slug":"jenkins-como-servidor-de-integracion","status":"publish","type":"post","link":"https:\/\/blog.thepragmatic.xyz\/?p=228","title":{"rendered":"Jenkins como servidor de integraci\u00f3n"},"content":{"rendered":"\n<h4>\u00bfPorque automatizamos?<\/h4>\n\n\n\n<p>Es claro que para ninguna \u00abpersona\u00bb es agradable ejecutar procesos de forma manual constantemente, a largo plazo suele volverse mon\u00f3tono y aburridor.  Con esta in \u00abcomodidad\u00bb el operador se conf\u00eda y puede descuidar o desatender alguna etapa del procedimiento, ac\u00e1 es donde surge el error&#8230; Ese error que no queremos y podr\u00eda resultar costoso.<\/p>\n\n\n\n<p>As\u00ed mismo, la automatizaci\u00f3n trae ciertas ventajas al delegar el trabajo que se realiza de forma manual a una m\u00e1quina que lo hace mejor, e invirtiendo el tiempo en escribir c\u00f3digo u en otras actividades.<\/p>\n\n\n\n<h4>\u00bfQu\u00e9 podemos automatizar?<\/h4>\n\n\n\n<p>Pruebas, deployments, disponibilidad de servicios, backups, procesos de storage, en general cualquier tarea que pueda ser programable.<\/p>\n\n\n\n<h4>\u00bfQu\u00e9 es Jenkins?<\/h4>\n\n\n\n<p><strong>Jenkins<\/strong>&nbsp;es open source y probablemente el software de automatizaci\u00f3n m\u00e1s usado de todos, escrito en Java por ende  se ejecuta en JVM. De mucha conveniencia al ser una herramienta&nbsp;<strong>extensible<\/strong>&nbsp;al tener un ecosistema de&nbsp;<strong>plugins<\/strong>&nbsp;que te permiten extenderlo, se pueden escribir tus propios&nbsp;<strong>plugins<\/strong>&nbsp;con Java,  la comunidad ha desarrollado gran variedad de los mismos.<\/p>\n\n\n\n<h5>Ventajas de utilizar Jenkins<\/h5>\n\n\n\n<ul><li>Extensibilidad (Plugins: Maven, Ansible, SonarQube, Docker y m\u00e1s)<\/li><li>Comunidad<\/li><li>Escalabilidad (Horizontal y vertical)<\/li><li>Innovaci\u00f3n constante. (Releases de Seguridad)<\/li><li>Flexible<\/li><li>F\u00e1cil instalaci\u00f3n y configuraci\u00f3n<\/li><\/ul>\n\n\n\n<p>Jenkins va de la mano de DevOps, que no es mas que una cultura que intenta reducir la brecha que existe actualmente entre la parte DEV (desarrolladores) y la parte OPS (operadores y administradores de sistemas), con el fin de realizar el paso a producci\u00f3n.<\/p>\n\n\n\n<h4>\u00bf Qu\u00e9 es continuous Integration y continuous Delivery?<\/h4>\n\n\n\n<p>No es m\u00e1s que como entregamos una aplicaci\u00f3n a producci\u00f3n de la forma mas automatizada posible (Haciendo un click, push, etc). Jenkins va a encargarse de desplegar la aplicaci\u00f3n a producci\u00f3n. <\/p>\n\n\n\n<h4>Requerimientos<\/h4>\n\n\n\n<p>Minimos<\/p>\n\n\n\n<ul><li>256 MB of RAM<\/li><li>1 GB of drive space (although 10 GB is a recommended minimum if running Jenkins as a&nbsp;<a href=\"https:\/\/www.jenkins.io\/doc\/book\/installing\/#docker\">Docker<\/a>&nbsp;container)<\/li><\/ul>\n\n\n\n<p>Configuraci\u00f3n recomendada para un equipo peque\u00f1o<\/p>\n\n\n\n<ul><li>1 GB+ of RAM<\/li><li>50 GB+ of drive space<\/li><\/ul>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>&#8211; <em>No es mandatorio pero ser\u00eda lo ideal que para la total comprensi\u00f3n de estos conceptos se tengan nociones o conocimientos en contenedores (Docker).<\/em><\/p><p>&#8211; Si va a utilizar alguna distribuci\u00f3n Fedora, utilice hasta la versi\u00f3n 30, a partir de la 31 cambia un componente del kernel que inhabilita la operaci\u00f3n de contenedores, pueden funcionar con unos ajustes a ciertos par\u00e1metros del sistema pero no es del alcance del post.<\/p><cite>Docker y Fedora 32 <a href=\"https:\/\/fedoramagazine.org\/docker-and-fedora-32\/\">https:\/\/fedoramagazine.org\/docker-and-fedora-32\/<\/a><\/cite><\/blockquote>\n\n\n\n<p>Se puede instalar en una m\u00e1quina f\u00edsica, virtual, proveedor de nube y el sistema operativo de su preferencia. Para mayor informaci\u00f3n puede consultar las gu\u00edas que provee el fabricante.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.jenkins.io\/doc\/\">https:\/\/www.jenkins.io\/doc\/<\/a><\/p>\n\n\n\n<h4>Instalaci\u00f3n 1 (M\u00e1quina virtual)<\/h4>\n\n\n\n<p>Nota: Para la instalaci\u00f3n de Jenkins se debe disponer de la versi\u00f3n 8 de java.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt install openjdk-8-jdk wget gnupg<\/code><\/pre>\n\n\n\n<p>Ahora se a\u00f1ade el repositorio de Jenkins para la versi\u00f3n estable (LTS).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wget -q -O - https:\/\/pkg.jenkins.io\/debian-stable\/jenkins.io.key | sudo apt-key add -\nsudo sh -c 'echo deb https:\/\/pkg.jenkins.io\/debian-stable binary\/ &gt; \\\n    \/etc\/apt\/sources.list.d\/jenkins.list'\nsudo apt-get update\nsudo apt-get install jenkins<\/code><\/pre>\n\n\n\n<p>A continuaci\u00f3n se procede a validar el estado del servicio<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>service jenkins status<\/code><\/pre>\n\n\n\n<h4>Instalaci\u00f3n 2 (Contenedor Docker)<\/h4>\n\n\n\n<p>Para nuestro escenario, se utilizar\u00e1 una m\u00e1quina Fedora 30 donde se instalar\u00e1 Docker para crear un contenedor del servicio de Jenkins. (Existen diversas implementaciones para este servicio pero esta es una de las mas comunes).<\/p>\n\n\n\n<h5>Instalaci\u00f3n de Docker<\/h5>\n\n\n\n<p>Es muy sencillo, visitamos la web <a href=\"https:\/\/developer.fedoraproject.org\/tools\/docker\/docker-installation.html\">https:\/\/developer.fedoraproject.org\/tools\/docker\/docker-installation.html<\/a><\/p>\n\n\n\n<h5>Configuraci\u00f3n del repositorio<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>yum update\n\nsudo dnf -y install dnf-plugins-core  #Instala un paquete para Fedora para administrar repositorios\n\ndnf config-manager \\\n    --add-repo \\\n    https:&#47;&#47;download.docker.com\/linux\/fedora\/docker-ce.repo<\/code><\/pre>\n\n\n\n<h5>Instalaci\u00f3n<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf install docker-ce -y\n\nsudo systemctl start docker\n\nsudo systemctl status docker\n\nsudo docker run hello-world<\/code><\/pre>\n\n\n\n<h5>A\u00f1adir usuario a grupo de docker<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps\nsudo usermod -aG docker &lt;whoami&gt;\ndocker ps<\/code><\/pre>\n\n\n\n<h5>Instalaci\u00f3n de Docker Compose<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/download\/1.26.1\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose\n\nsudo  chmod +x \/usr\/local\/bin\/docker-compose\n\ndocker-compose\n\ndocker-compose --version<\/code><\/pre>\n\n\n\n<h5>Instalaci\u00f3n de Jenkins<\/h5>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Nota: La imagen de&nbsp;<code>jenkinsci\/jenkins<\/code>&nbsp;est\u00e1 deprecada, as\u00ed que en vez de esa, deber\u00edas usar esta:&nbsp;<code>jenkins\/jenkins<\/code>&nbsp;.<\/p><cite>jenkinsci\/jenkins <a href=\"https:\/\/hub.docker.com\/r\/jenkinsci\/jenkins\/\">https:\/\/hub.docker.com\/r\/jenkinsci\/jenkins\/<\/a><\/cite><\/blockquote>\n\n\n\n<p>Docker funciona por medio de im\u00e1genes, una imagen es una plantilla donde viene la configuraci\u00f3n del servicio que queremos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker pull jenkinsci\/jenkins\n\ndocker images\n\nmkdir jenkins\n\nchown 1000 jenkins<\/code><\/pre>\n\n\n\n<h5>Creaci\u00f3n de archivo *.yml<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>cd jenkins\n\ntouch docker-compose.yml\n\nversion: '3'\nservices:\n  jenkins:\n    container_name: jenkins\n    image: jenkinsci\/jenkins\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - $PWD\/jenkins_home:\/var\/jenkins_home\n    networks:\n      - net\nnetworks:\n  - net:\n\n\nmkdir jenkins_home\n\ndocker-compose up -d\n\ndocker ps\n\nOpcion 1\ndocker logs -f jenkins\n\nOpcion 2\ncat jenkins_home\/secrets\/initialAdminPassword\n\nOpcion 3\ndocker exec -ti jenkins bash\n\nexit<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"918\" height=\"128\" src=\"https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-2.png\" alt=\"\" class=\"wp-image-587\" srcset=\"https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-2.png 918w, https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-2-300x42.png 300w, https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-2-768x107.png 768w\" sizes=\"(max-width: 918px) 100vw, 918px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"915\" height=\"485\" src=\"https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-4.png\" alt=\"\" class=\"wp-image-589\" srcset=\"https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-4.png 915w, https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-4-300x159.png 300w, https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-4-768x407.png 768w\" sizes=\"(max-width: 915px) 100vw, 915px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"875\" height=\"602\" src=\"https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-5.png\" alt=\"\" class=\"wp-image-590\" srcset=\"https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-5.png 875w, https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-5-300x206.png 300w, https:\/\/blog.thepragmatic.xyz\/wp-content\/uploads\/2020\/07\/image-5-768x528.png 768w\" sizes=\"(max-width: 875px) 100vw, 875px\" \/><\/figure>\n\n\n\n<p>Para detener el contenedor debes entrar a la carpeta de jenkins creada previamente, y ejecutar el siguiente comando.<\/p>\n\n\n\n<p>docker-compose stop<\/p>\n\n\n\n<p>  Para eliminar el servicio se utiliza el comando<\/p>\n\n\n\n<p>docker-compose down<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Jobs, tareas o proyectos, son los pasos que utilizamos para automatizar nuestras tareas.<\/p>\n\n\n\n<h5>Referencias<\/h5>\n\n\n\n<p>Docker Compose Installation <a href=\"https:\/\/docs.docker.com\/compose\/install\/\">https:\/\/docs.docker.com\/compose\/install\/<\/a><\/p>\n\n\n\n<p>Fedora installation <a href=\"https:\/\/docs.docker.com\/engine\/install\/fedora\/\">https:\/\/docs.docker.com\/engine\/install\/fedora\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/poweruser.blog\/how-to-install-docker-on-fedora-32-f2606c6934f1\">https:\/\/poweruser.blog\/how-to-install-docker-on-fedora-32-f2606c6934f1<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jenkins<\/p>\n","protected":false},"author":3,"featured_media":230,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10],"tags":[11],"_links":{"self":[{"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=\/wp\/v2\/posts\/228"}],"collection":[{"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=228"}],"version-history":[{"count":61,"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":1739,"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions\/1739"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=\/wp\/v2\/media\/230"}],"wp:attachment":[{"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.thepragmatic.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}