{"id":250,"date":"2025-11-01T20:33:18","date_gmt":"2025-11-01T20:33:18","guid":{"rendered":"https:\/\/codefornoobs.pt\/?p=250"},"modified":"2025-11-01T20:33:19","modified_gmt":"2025-11-01T20:33:19","slug":"%f0%9f%9a%80-comeca-a-automatizar-o-teu-desenvolvimento-de-software","status":"publish","type":"post","link":"https:\/\/codefornoobs.pt\/?p=250","title":{"rendered":"\ud83d\ude80 Come\u00e7a a automatizar o teu desenvolvimento de software"},"content":{"rendered":"\n<p>Depois do c\u00f3digo estar escrito, testado e validado, chega ao momento de movermos o c\u00f3digo para produ\u00e7\u00e3o ou at\u00e9 mesmo para pr\u00e9-produ\u00e7\u00e3o de forma que fique dispon\u00edvel para o p\u00fablico-alvo. Podemos sempre publicar de forma manual utilizando cli ou at\u00e9 mesmo diretamente no Visual Studio ou Rider, mas uma forma melhor \u00e9 automatizar este processo. A melhor forma de automatizar \u00e9 com CI\/CD.<\/p>\n\n\n\n<p>A integra\u00e7\u00e3o cont\u00ednua (CI) e entrega cont\u00ednua (CD) s\u00e3o mais do que buzzwords \u2014 s\u00e3o pilares de um desenvolvimento moderno, \u00e1gil e sustent\u00e1vel. Neste post, vou partilhar a ferramenta de CI\/CD que vou usar na automatiza\u00e7\u00e3o dos meu processos e fluxo de trabalho.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde9 O que \u00e9 CI\/CD e por que importa?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CI (Continuous Integration)<\/strong>: Automatiza a integra\u00e7\u00e3o de c\u00f3digo novo no reposit\u00f3rio principal, garantindo testes e valida\u00e7\u00f5es constantes.<\/li>\n\n\n\n<li><strong>CD (Continuous Delivery\/Deployment)<\/strong>: Automatiza a entrega do software para ambientes de staging ou produ\u00e7\u00e3o, com seguran\u00e7a e consist\u00eancia.<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 Benef\u00edcios:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Menos erros em produ\u00e7\u00e3o<\/li>\n\n\n\n<li>Feedback r\u00e1pido<\/li>\n\n\n\n<li>Deploys mais frequentes e confi\u00e1veis<\/li>\n\n\n\n<li>Equipa mais alinhada e produtiva<\/li>\n<\/ul>\n\n\n\n<p>Existem algumas ferramentas que podem ajudar neste processo. Vou deixar aqui algumas op\u00e7\u00f5es que encontrei enquanto tentava decidir como iniciar com a integra\u00e7\u00e3o cont\u00ednua. Ainda estou muito no in\u00edcio, tamb\u00e9m, por isso, \u00e9 prov\u00e1vel que n\u00e3o tenha a informa\u00e7\u00e3o toda ou que cometa alguns erros. As ferramentas que encontrei s\u00e3o as seguintes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddf1 Jenkins<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Open-source, auto-hospedado<\/li>\n\n\n\n<li><strong>Pontos fortes<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Extensibilidade<\/em>: +1800 plugins para quase tudo<\/li>\n\n\n\n<li><em>Flexibilidade total<\/em>: pipelines altamente customiz\u00e1veis<\/li>\n\n\n\n<li><em>Escal\u00e1vel<\/em>: ideal para ambientes distribu\u00eddos<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Desvantagens<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Curva de aprendizagem acentuada<\/em><\/li>\n\n\n\n<li><em>Manuten\u00e7\u00e3o constante<\/em>: atualiza\u00e7\u00f5es, seguran\u00e7a, plugins<\/li>\n\n\n\n<li><em>UI antiquada<\/em>: menos intuitiva para iniciantes<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udfd7\ufe0f TeamCity (JetBrains)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Comercial, com vers\u00e3o gratuita limitada<\/li>\n\n\n\n<li><strong>Pontos fortes<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Interface moderna e intuitiva<\/em><\/li>\n\n\n\n<li><em>Suporte nativo a .NET, Java, Docker, etc.<\/em><\/li>\n\n\n\n<li><em>Builds paralelos e gest\u00e3o de agentes eficiente<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Desvantagens<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Licenciamento<\/em>: vers\u00e3o completa \u00e9 paga<\/li>\n\n\n\n<li><em>Menos plugins que Jenkins<\/em><\/li>\n\n\n\n<li><em>Menos popular para projetos open-source<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udc19 GitHub Actions<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nativo do GitHub, baseado em YAML<\/li>\n\n\n\n<li><strong>Pontos fortes<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Sem configura\u00e7\u00e3o inicial<\/em>: j\u00e1 integrado no GitHub<\/li>\n\n\n\n<li><em>Marketplace com milhares de a\u00e7\u00f5es reutiliz\u00e1veis<\/em><\/li>\n\n\n\n<li><em>Bom suporte a Docker, runners self-hosted<\/em><\/li>\n\n\n\n<li><em>Gratuito para projetos p\u00fablicos<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Desvantagens<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Limita\u00e7\u00f5es de tempo e recursos em planos gratuitos<\/em><\/li>\n\n\n\n<li><em>Menos adequado para pipelines extremamente complexos<\/em><\/li>\n\n\n\n<li><em>Dependente do ecossistema GitHub<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udd8a GitLab CI\/CD<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nativo do GitLab, baseado em YAML<\/li>\n\n\n\n<li><strong>Pontos fortes<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Pipeline como c\u00f3digo com <\/em><code>.gitlab-ci.yml<\/code><\/li>\n\n\n\n<li><em>Integra\u00e7\u00e3o total com GitLab (issues, merge requests, etc.)<\/em><\/li>\n\n\n\n<li><em>Suporte a runners customizados e escal\u00e1veis<\/em><\/li>\n\n\n\n<li><em>Interface clara e poderosa<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Desvantagens<\/strong>:\n<ul class=\"wp-block-list\">\n<li><em>Menos intuitivo para quem vem do GitHub<\/em><\/li>\n\n\n\n<li><em>Configura\u00e7\u00e3o inicial pode ser mais t\u00e9cnica<\/em><\/li>\n\n\n\n<li><em>Alguns recursos avan\u00e7ados s\u00e3o pagos<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">A minha escolha<\/h2>\n\n\n\n<p>Jenkins deve ser uma das ferramentas de CI\/CD mais conhecidas e que mais ouvi falar para as mais variadas linguagens. Inicialmente at\u00e9 estava a pensar em utilizar Jenkins, mas o facto de dizerem que pode ser muito confuso para iniciar acabei por me afastar desta op\u00e7\u00e3o. Queria algo que fosse simples de configurar e pudesse come\u00e7ar a usar quase logo desde o in\u00edcio. Como uso Rider para programar, ainda pesquisei por TeamCity, mas sinceramente j\u00e1 tentei por duas vezes usar e sempre foi muito confuso para mim. Gitlab seria uma op\u00e7\u00e3o, mas teria de mover os meus projectos para o gitlab, por isso acabei por escolher Github Actions. \u00c9 relativamente f\u00e1cil de usar, tens uma comunidade relativamente grande, por isso \u00e9 f\u00e1cil de encontrar sugest\u00f5es e resolu\u00e7\u00e3o de problemas. A vers\u00e3o gratuita tem limite de minutos (2000 minutos), mas \u00e9 mais do que suficiente para os meus projectos. Outra coisa importante para mim era que corresse localmente na minha m\u00e1quina, porque publico os meus projectos diretamente no meu home server. O Github Actions permite ter runners locais que tratam disso, por isso quando passar \u00e0 parte de publicar o projecto \u00e9 muito simples de o fazer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Nesta primeira introdu\u00e7\u00e3o vimos algumas op\u00e7\u00f5es de ferramentas e quais os motivos que me fizeram escolher Github Actions. Para mim, \u00e9 a melhor op\u00e7\u00e3o por ter uma grande comunidade, ser f\u00e1cil de utilizar e poder usar agentes locais. As outras op\u00e7\u00f5es tamb\u00e9m s\u00e3o muito v\u00e1lidas e at\u00e9 existem muitas mais que me apareceram, mas nem considerei, por nunca ter ouvido falar nelas. Irei continuar a aprender sobre CI\/CD e nos pr\u00f3ximos tempos irei ter o meu setup completamente otimizado. Acompanha-me nesta aventura.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Depois do c\u00f3digo estar escrito, testado e validado, chega ao momento de movermos o c\u00f3digo para produ\u00e7\u00e3o ou at\u00e9 mesmo para pr\u00e9-produ\u00e7\u00e3o de forma que fique dispon\u00edvel para o p\u00fablico-alvo. Podemos sempre publicar de forma manual utilizando cli ou at\u00e9 mesmo diretamente no Visual Studio ou Rider, mas uma forma melhor \u00e9 automatizar este processo&#8230;.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-250","post","type-post","status-publish","format-standard","hentry","category-sem-categoria"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=\/wp\/v2\/posts\/250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=250"}],"version-history":[{"count":3,"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=\/wp\/v2\/posts\/250\/revisions"}],"predecessor-version":[{"id":254,"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=\/wp\/v2\/posts\/250\/revisions\/254"}],"wp:attachment":[{"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codefornoobs.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}