{"componentChunkName":"component---src-templates-blog-template-js","path":"/blog/2023-08-08-firebase-deploy-gitlab-ci/","result":{"data":{"site":{"id":"Site","siteMetadata":{"siteUrl":"https://fredybustos.com"}},"markdownRemark":{"id":"69125df9-e3a5-5f5b-8494-ed00db63523b","html":"<p>Una parte importante de nuestros desarrollos es realizar el despliegue a producción o ambientes de pruebas. Para esto, contamos con la ayuda de CI (Continuous Integration), que nos permite integrar cambios de código y preparar el proyecto para el despliegue en producción. También contamos con CD (Continuous Delivery), que nos permite automatizar el despliegue a producción. Con la llegada de GitHub Actions, este trabajo es menos complejo, lo que hace que esta integración sea cada día más común. Sin embargo, también utilizamos GitLab para alojar nuestros repositorios y tener el control del despliegue.</p>\n<p>Como ejercicio, me propuse hacer esta integración. Leyendo la documentación y buscando información al respecto, llegué al resultado esperado para mí en este ejercicio. Principalmente, me enfoqué en hacer el despliegue en Firebase del front-end de la aplicación, por lo que me centraré principalmente en Firebase.</p>\n<p>Proyecto en firebase <a href=\"https://ci-ejemplo.web.app/\">ci-ejemplo</a></p>\n<p>Documentación oficial de GitLab <a href=\"https://docs.gitlab.com/ee/ci/yaml/#keywords\">CI/CD</a></p>\n<p>Vamos a crear el archivo <code class=\"language-text\">.gitlab-ci.yml</code> tal como se debe llamar, y creamos las tareas que queremos ejecutar. Estas tareas se llaman <code class=\"language-text\">stages</code>. En primer lugar, necesitamos instalar las dependencias.</p>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token key atrule\">stages</span><span class=\"token punctuation\">:</span>\n <span class=\"token punctuation\">-</span> install\n\n<span class=\"token key atrule\">install-dependencies</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> install\n  <span class=\"token key atrule\">script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> npm ci\n    <span class=\"token punctuation\">-</span> echo \"Install successfully<span class=\"token tag\">!\"</span>\n  <span class=\"token key atrule\">only</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> main\n  <span class=\"token key atrule\">cache</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> node_modules\n    <span class=\"token key atrule\">key</span><span class=\"token punctuation\">:</span> \n      <span class=\"token key atrule\">files</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> package<span class=\"token punctuation\">-</span>lock.json\n      <span class=\"token key atrule\">prefix</span><span class=\"token punctuation\">:</span> npm</code></pre></div>\n<p>Para que el <code class=\"language-text\">stage: install</code> se ejecute, debemos nombrarlo igual que en la definición <code class=\"language-text\">stages: -install</code>. A continuación, describiré brevemente los pasos que estamos realizando.</p>\n<ul>\n<li><code class=\"language-text\">install-dependencies</code>: Nombre del stage que aparece en el runner de GitLab.</li>\n<li><code class=\"language-text\">stage</code>: Nombre del paso que se va a ejecutar.</li>\n<li><code class=\"language-text\">script</code>: Los scripts que necesitamos ejecutar, en este caso <code class=\"language-text\">npm ci</code></li>\n<li><code class=\"language-text\">only</code>: Aquí podemos definir cuándo se empezará a ejecutar el runner. En este caso, en la rama <code class=\"language-text\">main</code> pero hay muchas más opciones.</li>\n<li><code class=\"language-text\">cache</code>: Podemos guardar en caché para su uso posterior en otro stage. Aquí se está cacheando <code class=\"language-text\">node_modules</code>, que se necesita para otros stages como test, lint y deploy. También se está cacheando el archivo package-lock.json para que las versiones sean correctas.</li>\n</ul>\n<p>Ahora agregaremos los stages de lint, test, build y deploy. Cada uno se ejecutará en su orden.</p>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token key atrule\">stages</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> install\n  <span class=\"token punctuation\">-</span> lint\n  <span class=\"token punctuation\">-</span> test \n  <span class=\"token punctuation\">-</span> build\n  <span class=\"token punctuation\">-</span> deploy<span class=\"token punctuation\">-</span>firebase</code></pre></div>\n<p>En el despliegue en Firebase, necesitamos hacer lo siguiente previamente:</p>\n<ol>\n<li>Instalar Firebase CLI: <code class=\"language-text\">npm install -g firebase-tools</code></li>\n<li>Ejecutar <code class=\"language-text\">firebase init hosting</code>. Esto creará el archivo <code class=\"language-text\">firebase.json</code> necesario para el despliegue.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"hosting\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"public\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"public\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"ignore\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">\"firebase.json\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"**/.*\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"**/node_modules/**\"</span>\n    <span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ol start=\"3\">\n<li>Ejecutar <code class=\"language-text\">firebase login:ci</code> para iniciar sesión en Firebase, seleccionar el proyecto donde se va a desplegar la aplicación (previamente creado en la consola de Firebase). Esto generará un token y una línea que debe agregarse al archivo <code class=\"language-text\">.gitlab-ci.yml</code>.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">✔  Success<span class=\"token operator\">!</span> Use this token to login on a CI server:\n\n<span class=\"token number\">1</span>//01LQsa808iTKSNwF-L9IrQ1VXTX_XWHLrfjbk_zn3X8mtsX5SiNMcruJV_DKFXfhjshufsyzTnRISFkj9E3K7iRu7xo\n\nExample: firebase deploy --token <span class=\"token string\">\"<span class=\"token variable\">$FIREBASE_TOKEN</span>\"</span></code></pre></div>\n<ol start=\"4\">\n<li>Agregas esta línea y creas la variable <code class=\"language-text\">$FIREBASE_TOKEN</code> en GitLab > Configuración > CI/CD > Variables. Con esto, estamos listos para completar el <code class=\"language-text\">stage</code> que nos permitirá hacer el deploy desde CI.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token key atrule\">deploy</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> deploy<span class=\"token punctuation\">-</span>firebase\n  <span class=\"token key atrule\">only</span><span class=\"token punctuation\">:</span> \n    <span class=\"token punctuation\">-</span> main\n  <span class=\"token key atrule\">before_script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> npm install\n    <span class=\"token punctuation\">-</span> npm install <span class=\"token punctuation\">-</span>g firebase<span class=\"token punctuation\">-</span>tools\n  <span class=\"token key atrule\">script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> firebase deploy <span class=\"token punctuation\">-</span><span class=\"token punctuation\">-</span>token \"$FIREBASE_TOKEN\"\n<span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">FIREBASE_TOKEN</span><span class=\"token punctuation\">:</span> $CI_JOB_TOKEN\n  <span class=\"token key atrule\">VITE_API_URL</span><span class=\"token punctuation\">:</span> $API_URL</code></pre></div>\n<ol start=\"5\">\n<li>Si tienes variables de entorno, también debes agregarlas en GitLab y en el archivo de CI, al igual que la variable <code class=\"language-text\">$FIREBASE_TOKEN</code>. El archivo <code class=\"language-text\">.gitlab-ci.yml</code> listo para usar queda así:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token key atrule\">default</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">image</span><span class=\"token punctuation\">:</span> node<span class=\"token punctuation\">:</span><span class=\"token number\">16</span>\n\n<span class=\"token key atrule\">stages</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> install\n  <span class=\"token punctuation\">-</span> lint\n  <span class=\"token punctuation\">-</span> test \n  <span class=\"token punctuation\">-</span> build\n  <span class=\"token punctuation\">-</span> docker<span class=\"token punctuation\">-</span>build\n  <span class=\"token punctuation\">-</span> deploy<span class=\"token punctuation\">-</span>firebase\n\n<span class=\"token key atrule\">install-dependencies</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> install\n  <span class=\"token key atrule\">script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> npm ci\n    <span class=\"token punctuation\">-</span> echo \"Install successfully<span class=\"token tag\">!\"</span>\n  <span class=\"token key atrule\">only</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> main\n  <span class=\"token key atrule\">cache</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> node_modules\n    <span class=\"token key atrule\">key</span><span class=\"token punctuation\">:</span> \n      <span class=\"token key atrule\">files</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> package<span class=\"token punctuation\">-</span>lock.json\n      <span class=\"token key atrule\">prefix</span><span class=\"token punctuation\">:</span> npm\n\n<span class=\"token key atrule\">run-lint</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> lint\n  <span class=\"token key atrule\">needs</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"install-dependencies\"</span><span class=\"token punctuation\">]</span>\n  <span class=\"token key atrule\">script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> npm install\n    <span class=\"token punctuation\">-</span> npm run lint\n  <span class=\"token key atrule\">only</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> main\n  <span class=\"token key atrule\">cache</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> node_modules\n    <span class=\"token key atrule\">policy</span><span class=\"token punctuation\">:</span> pull\n\n<span class=\"token key atrule\">run-test</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> test\n  <span class=\"token key atrule\">needs</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"install-dependencies\"</span><span class=\"token punctuation\">]</span>\n  <span class=\"token key atrule\">script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> npm install\n    <span class=\"token punctuation\">-</span> echo \"Test successfully<span class=\"token tag\">!\"</span>\n  <span class=\"token key atrule\">only</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> main\n  <span class=\"token key atrule\">cache</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> node_modules\n    <span class=\"token key atrule\">policy</span><span class=\"token punctuation\">:</span> pull\n\n<span class=\"token key atrule\">build-app</span><span class=\"token punctuation\">:</span> \n  <span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> build\n  <span class=\"token key atrule\">needs</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"install-dependencies\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"run-test\"</span><span class=\"token punctuation\">]</span>\n  <span class=\"token key atrule\">script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> npm install\n    <span class=\"token punctuation\">-</span> npm run build\n    <span class=\"token punctuation\">-</span> cp <span class=\"token punctuation\">-</span>a dist/. public/\n    <span class=\"token punctuation\">-</span> echo \"Build successfully<span class=\"token tag\">!\"</span>\n  <span class=\"token key atrule\">only</span><span class=\"token punctuation\">:</span>\n   <span class=\"token punctuation\">-</span> main\n  <span class=\"token key atrule\">cache</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> node_modules\n    <span class=\"token key atrule\">policy</span><span class=\"token punctuation\">:</span> pull\n  <span class=\"token key atrule\">artifacts</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> public\n\n<span class=\"token key atrule\">deploy</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> deploy<span class=\"token punctuation\">-</span>firebase\n  <span class=\"token key atrule\">only</span><span class=\"token punctuation\">:</span> \n    <span class=\"token punctuation\">-</span> main\n  <span class=\"token key atrule\">before_script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> npm install\n    <span class=\"token punctuation\">-</span> npm install <span class=\"token punctuation\">-</span>g firebase<span class=\"token punctuation\">-</span>tools\n  <span class=\"token key atrule\">script</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> firebase deploy <span class=\"token punctuation\">-</span><span class=\"token punctuation\">-</span>token \"$FIREBASE_TOKEN\"\n<span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">FIREBASE_TOKEN</span><span class=\"token punctuation\">:</span> $CI_JOB_TOKEN\n  <span class=\"token key atrule\">VITE_API_URL</span><span class=\"token punctuation\">:</span> $API_URL</code></pre></div>\n<p>En resumen, este proceso de despliegue en Firebase mediante GitLab CI nos proporciona una solución robusta y eficiente para llevar nuestros proyectos a producción y a entornos de pruebas de manera automatizada. A través de la integración continua y la entrega continua, podemos asegurarnos de que los cambios en nuestro código se integren de manera suave y se desplieguen correctamente, reduciendo los posibles errores y garantizando una experiencia de usuario fluida.</p>\n<p>En futuros ejercicios inentare hacer el depliegue en aws, google cloud, azure, por nombrar algunos. </p>\n<p>Saludos!!</p>","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Una parte importante de nuestros desarrollos es realizar el despliegue a producción o ambientes de pruebas. Para esto, contamos con la ayuda de CI (Continuous Integration), que nos permite integrar cambios de código y preparar el proyecto para el despliegue en producción. También contamos con CD (Continuous Delivery), que nos permite automatizar el despliegue a producción. Con la llegada de GitHub Actions, este trabajo es menos complejo, lo que hace que esta integración sea cada día más común. Sin embargo, también utilizamos GitLab para alojar nuestros repositorios y tener el control del despliegue."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como ejercicio, me propuse hacer esta integración. Leyendo la documentación y buscando información al respecto, llegué al resultado esperado para mí en este ejercicio. Principalmente, me enfoqué en hacer el despliegue en Firebase del front-end de la aplicación, por lo que me centraré principalmente en Firebase."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Proyecto en firebase "},{"type":"element","tagName":"a","properties":{"href":"https://ci-ejemplo.web.app/"},"children":[{"type":"text","value":"ci-ejemplo"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Documentación oficial de GitLab "},{"type":"element","tagName":"a","properties":{"href":"https://docs.gitlab.com/ee/ci/yaml/#keywords"},"children":[{"type":"text","value":"CI/CD"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a crear el archivo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".gitlab-ci.yml"}]},{"type":"text","value":" tal como se debe llamar, y creamos las tareas que queremos ejecutar. Estas tareas se llaman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"stages"}]},{"type":"text","value":". En primer lugar, necesitamos instalar las dependencias."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"yml"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stages"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" install\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"install-dependencies"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stage"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" install\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm ci\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" echo \"Install successfully"},{"type":"element","tagName":"span","properties":{"className":["token","tag"]},"children":[{"type":"text","value":"!\""}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"only"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" main\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"cache"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"paths"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" node_modules\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"key"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" \n      "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"files"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" package"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"lock.json\n      "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"prefix"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" npm"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para que el "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"stage: install"}]},{"type":"text","value":" se ejecute, debemos nombrarlo igual que en la definición "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"stages: -install"}]},{"type":"text","value":". A continuación, describiré brevemente los pasos que estamos realizando."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"install-dependencies"}]},{"type":"text","value":": Nombre del stage que aparece en el runner de GitLab."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"stage"}]},{"type":"text","value":": Nombre del paso que se va a ejecutar."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"script"}]},{"type":"text","value":": Los scripts que necesitamos ejecutar, en este caso "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"npm ci"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"only"}]},{"type":"text","value":": Aquí podemos definir cuándo se empezará a ejecutar el runner. En este caso, en la rama "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":" pero hay muchas más opciones."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cache"}]},{"type":"text","value":": Podemos guardar en caché para su uso posterior en otro stage. Aquí se está cacheando "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"node_modules"}]},{"type":"text","value":", que se necesita para otros stages como test, lint y deploy. También se está cacheando el archivo package-lock.json para que las versiones sean correctas."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora agregaremos los stages de lint, test, build y deploy. Cada uno se ejecutará en su orden."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"yml"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stages"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" install\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" lint\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" test \n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" build\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" deploy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"firebase"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En el despliegue en Firebase, necesitamos hacer lo siguiente previamente:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Instalar Firebase CLI: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"npm install -g firebase-tools"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ejecutar "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"firebase init hosting"}]},{"type":"text","value":". Esto creará el archivo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"firebase.json"}]},{"type":"text","value":" necesario para el despliegue."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"json"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"hosting\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"public\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"public\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ignore\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"firebase.json\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"**/.*\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"**/node_modules/**\""}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{"start":3},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ejecutar "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"firebase login:ci"}]},{"type":"text","value":" para iniciar sesión en Firebase, seleccionar el proyecto donde se va a desplegar la aplicación (previamente creado en la consola de Firebase). Esto generará un token y una línea que debe agregarse al archivo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".gitlab-ci.yml"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"shell"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-shell"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-shell"]},"children":[{"type":"text","value":"✔  Success"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!"}]},{"type":"text","value":" Use this token to login on a CI server:\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"//01LQsa808iTKSNwF-L9IrQ1VXTX_XWHLrfjbk_zn3X8mtsX5SiNMcruJV_DKFXfhjshufsyzTnRISFkj9E3K7iRu7xo\n\nExample: firebase deploy --token "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""},{"type":"element","tagName":"span","properties":{"className":["token","variable"]},"children":[{"type":"text","value":"$FIREBASE_TOKEN"}]},{"type":"text","value":"\""}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{"start":4},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Agregas esta línea y creas la variable "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$FIREBASE_TOKEN"}]},{"type":"text","value":" en GitLab > Configuración > CI/CD > Variables. Con esto, estamos listos para completar el "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"stage"}]},{"type":"text","value":" que nos permitirá hacer el deploy desde CI."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"yml"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"deploy"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stage"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" deploy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"firebase\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"only"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" \n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" main\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"before_script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm install\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm install "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"g firebase"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"tools\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" firebase deploy "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"token \"$FIREBASE_TOKEN\"\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"variables"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"FIREBASE_TOKEN"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" $CI_JOB_TOKEN\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"VITE_API_URL"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" $API_URL"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{"start":5},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Si tienes variables de entorno, también debes agregarlas en GitLab y en el archivo de CI, al igual que la variable "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$FIREBASE_TOKEN"}]},{"type":"text","value":". El archivo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".gitlab-ci.yml"}]},{"type":"text","value":" listo para usar queda así:"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"yml"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-yml"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"default"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"image"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" node"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stages"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" install\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" lint\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" test \n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" build\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" docker"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"build\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" deploy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"firebase\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"install-dependencies"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stage"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" install\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm ci\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" echo \"Install successfully"},{"type":"element","tagName":"span","properties":{"className":["token","tag"]},"children":[{"type":"text","value":"!\""}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"only"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" main\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"cache"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"paths"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" node_modules\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"key"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" \n      "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"files"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" package"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"lock.json\n      "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"prefix"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" npm\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"run-lint"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stage"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" lint\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"needs"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"install-dependencies\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm install\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm run lint\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"only"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" main\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"cache"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"paths"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" node_modules\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"policy"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" pull\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"run-test"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stage"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" test\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"needs"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"install-dependencies\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm install\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" echo \"Test successfully"},{"type":"element","tagName":"span","properties":{"className":["token","tag"]},"children":[{"type":"text","value":"!\""}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"only"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" main\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"cache"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"paths"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" node_modules\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"policy"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" pull\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"build-app"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" \n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stage"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" build\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"needs"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"install-dependencies\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"run-test\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm install\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm run build\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" cp "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"a dist/. public/\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" echo \"Build successfully"},{"type":"element","tagName":"span","properties":{"className":["token","tag"]},"children":[{"type":"text","value":"!\""}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"only"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" main\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"cache"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"paths"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" node_modules\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"policy"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" pull\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"artifacts"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"paths"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" public\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"deploy"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"stage"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" deploy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"firebase\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"only"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" \n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" main\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"before_script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm install\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" npm install "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"g firebase"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"tools\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"script"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" firebase deploy "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"token \"$FIREBASE_TOKEN\"\n"},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"variables"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"FIREBASE_TOKEN"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" $CI_JOB_TOKEN\n  "},{"type":"element","tagName":"span","properties":{"className":["token","key","atrule"]},"children":[{"type":"text","value":"VITE_API_URL"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" $API_URL"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En resumen, este proceso de despliegue en Firebase mediante GitLab CI nos proporciona una solución robusta y eficiente para llevar nuestros proyectos a producción y a entornos de pruebas de manera automatizada. A través de la integración continua y la entrega continua, podemos asegurarnos de que los cambios en nuestro código se integren de manera suave y se desplieguen correctamente, reduciendo los posibles errores y garantizando una experiencia de usuario fluida."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En futuros ejercicios inentare hacer el depliegue en aws, google cloud, azure, por nombrar algunos. "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saludos!!"}]}],"data":{"quirksMode":false}},"frontmatter":{"date":"August 08, 2023","title":"Firebase deploy GitLab CI","metaDescription":null,"thumbnail":{"id":"1f74ef2e-e968-5cf9-b549-f9a84c1ab9ac","childImageSharp":{"id":"f57994e5-7d6f-5a8c-9bf5-eb1632c366bc","fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPklEQVQoz61SPU/DMBDtH0Jlgx/AHwCBmICFvaqYWdlZkSLEhAQsLEiMoCJEGwWFpAn5TmgDTUIJTYryZTtcGtpODKWcLPvu2e+ezneVfA6r/AeZkD+SSZpkH14Zo8CH8Ld0ZAyWTkEe8oxNHZaoc3bs31yDE0eR/znICkPwFPYJDaCpcv+SUndXAroRsi29tuZQBwBynCDJuuN6vCC3RUUzXgDs2m/2a+++ybhe/4ccXtXf9xbEjWV+dcmtL35d7AThgGtLPcdlOZFmONOyZdXEGNPM0+1dUxAVuI3jpCBnLjs839a3qspmNThZT+0GgJpusZwgq4ZhdkAW9DXDemg9PksaZNTNTqk8+gMc+qf73lEtT9xxaSSK4/LjoGCoM4UDYUDSNEUITVo14hOc42wazjIkpFiEzNTwuSbsG/H+piuhKVXcAAAAAElFTkSuQmCC","aspectRatio":1.6055045871559632,"src":"/static/c382a2763535c515ef7fe0d588474824/73c85/New%20Project.png","srcSet":"/static/c382a2763535c515ef7fe0d588474824/d4144/New%20Project.png 175w,\n/static/c382a2763535c515ef7fe0d588474824/a5370/New%20Project.png 350w,\n/static/c382a2763535c515ef7fe0d588474824/73c85/New%20Project.png 700w,\n/static/c382a2763535c515ef7fe0d588474824/4ff95/New%20Project.png 1050w,\n/static/c382a2763535c515ef7fe0d588474824/e4d72/New%20Project.png 1280w","sizes":"(max-width: 700px) 100vw, 700px"}}}}}},"pageContext":{"id":"69125df9-e3a5-5f5b-8494-ed00db63523b","previous":{"id":"f8bc4ef2-15b5-54a6-a6d8-d04aa09fa9a4","fields":{"slug":"/blog/hello-world/"},"frontmatter":{"date":"April 26, 2020","title":"Apuntar dominio a Github Pages!!"}},"next":null}}}