<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>automação de build - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/automacao-de-build/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Fri, 04 Jul 2025 20:08:49 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>automação de build - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Automatizando e Orquestrando Contêineres com Docker Compose e GitHub Actions &#8211; Tutorial Parte 2</title>
		<link>https://mcu.tec.br/infraestrutura/automatizando-e-orquestrando-conteineres-com-docker-compose-e-github-actions-tutorial-parte-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=automatizando-e-orquestrando-conteineres-com-docker-compose-e-github-actions-tutorial-parte-2</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 04 Jul 2025 19:51:27 +0000</pubDate>
				<category><![CDATA[Infraestrutura]]></category>
		<category><![CDATA[Artifact Registry]]></category>
		<category><![CDATA[automação de build]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[container name]]></category>
		<category><![CDATA[deploy na nuvem]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Docker Compose]]></category>
		<category><![CDATA[docker volumes]]></category>
		<category><![CDATA[docker-compose.yml]]></category>
		<category><![CDATA[Dockerfile]]></category>
		<category><![CDATA[GitHub Actions]]></category>
		<category><![CDATA[Google Cloud]]></category>
		<category><![CDATA[Integração Contínua]]></category>
		<category><![CDATA[pipeline GitHub]]></category>
		<category><![CDATA[push no GitHub]]></category>
		<category><![CDATA[Tutorial DevOps]]></category>
		<category><![CDATA[versionamento semântico]]></category>
		<category><![CDATA[workflow GitHub]]></category>
		<category><![CDATA[YAML]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=562</guid>

					<description><![CDATA[<p>Aprenda neste tutorial como usar Docker Compose e GitHub Actions para automatizar o build de sua aplicação, validar com CI e preparar o deploy na nuvem com o Google Cloud.</p>
<p>The post <a href="https://mcu.tec.br/infraestrutura/automatizando-e-orquestrando-conteineres-com-docker-compose-e-github-actions-tutorial-parte-2/">Automatizando e Orquestrando Contêineres com Docker Compose e GitHub Actions – Tutorial Parte 2</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">Neste segundo tutorial da nossa série sobre Cloud e DevOps, avançamos no uso do Docker, explorando maneiras mais eficientes de executar aplicações por meio da orquestração com Docker Compose. Também aprendemos a integrar esse processo ao GitHub utilizando workflows automáticos com GitHub Actions, preparando o caminho para o deploy em nuvem. O foco aqui é a produtividade, a padronização e a portabilidade do ambiente de desenvolvimento.</p>



<h2 class="wp-block-heading">Otimizando o Uso do Docker com Docker Compose</h2>



<p class="wp-block-paragraph">Na primeira parte da série, rodamos a aplicação com um comando extenso usando <code>docker run</code>. Agora, substituímos essa abordagem manual pela criação de um arquivo <code>docker-compose.yml</code>, que automatiza e simplifica o processo de build e execução da aplicação.</p>



<p class="wp-block-paragraph">O Docker Compose permite descrever os serviços de uma aplicação usando YAML, o mesmo formato utilizado amplamente em DevOps (como em Kubernetes, Prometheus, entre outros). Com ele, é possível definir serviços, volumes, portas, variáveis de ambiente e dependências entre aplicações – tudo em um único arquivo.</p>



<p class="wp-block-paragraph">Exemplo de estrutura simples do <code>docker-compose.yml</code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="services:
  app:
    build: .
    container_name: imersao-api
    ports:
      - &quot;8000:8000&quot;
    volumes:
      - .:/app
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  app</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    build</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">imersao</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8000:8000</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">app</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Essa estrutura permite que o código fonte editado localmente seja refletido imediatamente no contêiner, sem necessidade de reiniciar o serviço, graças à montagem do volume <code>.:/app</code>.</p>



<h2 class="wp-block-heading">Criando e Executando com Docker Compose</h2>



<p class="wp-block-paragraph">Com o arquivo YAML configurado, o comando necessário para subir o ambiente se resume a:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="docker compose up
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">compose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">up</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse comando compila a imagem (caso necessário) e sobe o contêiner em background ou com os logs visíveis, dependendo do uso da flag <code>-d</code>. Isso representa um grande ganho em relação ao processo anterior, que exigia múltiplos comandos de terminal, configuração de ambiente virtual, instalação de dependências e execução manual da aplicação.</p>



<h2 class="wp-block-heading">Commit e Versionamento do Projeto</h2>



<p class="wp-block-paragraph">Com a aplicação funcional e o ambiente Docker pronto, o próximo passo é versionar o projeto e enviá-lo ao GitHub. A convenção de commits sugerida segue o modelo do Angular, com prefixos como <code>feat</code>, <code>fix</code>, entre outros. Por exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="git commit -m &quot;feat: adiciona Docker Compose ao repositório&quot;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">commit</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">m</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">feat: adiciona Docker Compose ao repositório</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O projeto é então enviado ao GitHub via <code>git push</code>, já contendo os arquivos <code>Dockerfile</code> e <code>docker-compose.yml</code>, prontos para replicar o ambiente em qualquer máquina.</p>



<h2 class="wp-block-heading">Integração Contínua com GitHub Actions</h2>



<p class="wp-block-paragraph">Em seguida, foi configurado um pipeline básico de integração contínua (CI) com GitHub Actions. A configuração está em um arquivo YAML no caminho <code>.github/workflows/docker-image.yml</code>. Esse pipeline é disparado automaticamente a cada push na branch <code>main</code> e executa a build da imagem Docker.</p>



<p class="wp-block-paragraph">A Action utiliza um runner baseado em Ubuntu e realiza passos como:</p>



<ul class="wp-block-list">
<li>Verificação do push</li>



<li>Build da imagem Docker com o <code>Dockerfile</code></li>



<li>Output da imagem com uma tag (que pode ser personalizada com hash de commit ou versão semântica)</li>
</ul>



<p class="wp-block-paragraph">Isso garante que toda atualização de código seja validada automaticamente, reduzindo erros e garantindo consistência para deploys futuros.</p>



<h2 class="wp-block-heading">Boas Práticas: Versionamento e SemVer</h2>



<p class="wp-block-paragraph">Foi abordada também a importância de versionar imagens corretamente, evitando o uso da tag <code>latest</code> em produção. Recomenda-se seguir o padrão SemVer (Semantic Versioning), com versões <code>major.minor.patch</code>, o que facilita rollbacks e controle de mudanças.</p>



<h2 class="wp-block-heading">Próximos Passos</h2>



<p class="wp-block-paragraph">Com a imagem construída e validada via GitHub Actions, o próximo passo será enviar essa aplicação para a nuvem – mais especificamente, para o Google Cloud. Para isso, foi apresentado o processo de resgate de créditos na plataforma, criação de projeto e ativação do faturamento.</p>



<ol class="wp-block-list"></ol>



<h2 class="wp-block-heading">Criando o Projeto na Google Cloud</h2>



<p class="wp-block-paragraph">Agora é necessário criar um projeto no console do Google Cloud, que será o destino do deploy da aplicação.</p>



<h3 class="wp-block-heading">Etapas:</h3>



<ol class="wp-block-list">
<li>Acesse o console e clique em “Abrir seletor de projetos”.</li>



<li>Clique em <strong>&#8220;Novo Projeto&#8221;</strong>, dê um nome (ex: <code>Alura-Imersao</code>) e crie.</li>



<li>Após criado, clique sobre o projeto para selecioná-lo.</li>



<li>Em seguida, vá até a aba <strong>Faturamento</strong> e vincule os créditos ativados ao projeto. Selecione a conta de faturamento &#8220;de avaliação&#8221; e clique em &#8220;Definir conta&#8221;.</li>
</ol>



<p class="wp-block-paragraph">Após isso, o painel exibirá o valor disponível para o projeto, que pode ser usado para criar instâncias, serviços e realizar o deploy.</p>



<h2 class="wp-block-heading">Finalizando a Preparação para o Deploy</h2>



<p class="wp-block-paragraph">Com os créditos ativos e o projeto criado, a estrutura para o deploy está pronta. O próximo passo – a ser abordado no próximo tutorial – será <strong>colocar no ar a aplicação que foi versionada e enviada ao GitHub</strong>, utilizando os serviços da Google Cloud, como o <strong>Artifact Registry</strong> ou o <strong>Cloud Run</strong>, tornando a API acessível de qualquer lugar da internet.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Recapitulando o que aprendemos neste tutorial</h2>



<ul class="wp-block-list">
<li>Criamos um <code>docker-compose.yml</code> para orquestrar o build e a execução da aplicação com um único comando.</li>



<li>Automatizamos o processo de CI com GitHub Actions.</li>



<li>Versionamos e subimos o projeto no GitHub.</li>



<li>Ativamos créditos gratuitos no Google Cloud.</li>



<li>Criamos e configuramos um projeto na plataforma para receber a aplicação.</li>



<li>Entendemos o papel do CI na consistência de builds e na produtividade do time DevOps.</li>
</ul>



<h2 class="wp-block-heading">Automatizando o Build com GitHub Actions</h2>



<p class="wp-block-paragraph">Uma das grandes vantagens do uso do GitHub em projetos DevOps é a possibilidade de criar <strong>pipelines de integração contínua (CI)</strong> com <strong>GitHub Actions</strong>, utilizando arquivos YAML que descrevem o passo a passo da automação.</p>



<p class="wp-block-paragraph">No nosso projeto, configuramos um workflow chamado <code>docker-image.yml</code>, responsável por:</p>



<ul class="wp-block-list">
<li>Monitorar alterações (<code>push</code> ou <code>pull_request</code>) na branch <code>main</code>.</li>



<li>Executar os passos para <strong>construir a imagem Docker</strong> da aplicação.</li>



<li>Validar que a imagem foi construída com sucesso, sem a necessidade de rodar comandos manuais.</li>
</ul>



<p class="wp-block-paragraph">Esse processo ajuda a garantir que qualquer mudança feita no repositório principal gere uma nova versão da imagem de forma <strong>automática, reproduzível e rastreável</strong>.</p>



<h3 class="wp-block-heading">Boas práticas aplicadas:</h3>



<ul class="wp-block-list">
<li>Definição de etapas (<code>steps</code>) claras no YAML, como <code>build</code>, <code>run</code>, <code>login</code>.</li>



<li>Separação lógica das fases de execução, facilitando a leitura por desenvolvedores e DevOps.</li>



<li>Uso opcional de <code>tags</code> e versionamento semanticamente significativos (evitando <code>latest</code> em produção).</li>



<li>Possibilidade de usar <code>hash de commit</code>, <code>data</code>, ou <code>número de versão</code> como parte do nome da imagem.</li>
</ul>



<h2 class="wp-block-heading">O Que Mais Podemos Fazer com Workflows?</h2>



<p class="wp-block-paragraph">Embora neste tutorial o foco tenha sido a criação e validação da imagem Docker, os workflows do GitHub Actions vão muito além:</p>



<ul class="wp-block-list">
<li><strong>Rodar testes automatizados</strong> (unitários, de integração, de segurança).</li>



<li><strong>Executar análise estática de código</strong>.</li>



<li><strong>Escanear imagens Docker por vulnerabilidades</strong>.</li>



<li><strong>Efetuar deploys automáticos</strong> para ambientes como Docker Hub, Google Cloud ou AWS.</li>



<li><strong>Gerenciar pipelines CI/CD completas</strong>, desde o push até o deploy em produção.</li>
</ul>



<h2 class="wp-block-heading">Caminho para o Deploy</h2>



<p class="wp-block-paragraph">Com a imagem criada, validada e o projeto devidamente versionado no GitHub, além de termos o projeto no Google Cloud com os créditos ativados, estamos prontos para a etapa final desta trilogia de tutoriais: <strong>colocar a aplicação no ar com um link acessível publicamente</strong>.</p>



<p class="wp-block-paragraph">Esse processo envolverá:</p>



<ul class="wp-block-list">
<li>Escolha de um serviço de deploy (Cloud Run, GKE, App Engine&#8230;).</li>



<li>Autenticação com o Google Cloud.</li>



<li>Push da imagem para o repositório de imagens (Artifact Registry).</li>



<li>Configuração de variáveis e ambiente.</li>



<li>Acesso via navegador com domínio público.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusão do Tutorial Parte 2</h2>



<p class="wp-block-paragraph">Neste tutorial você aprendeu a:</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Automatizar o build de sua aplicação com Docker Compose<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Configurar workflows de CI com GitHub Actions<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Utilizar boas práticas de versionamento e padronização<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Criar um projeto no Google Cloud e ativar seus créditos<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Preparar o ambiente para o deploy na nuvem</p>



<p class="wp-block-paragraph">No próximo e último tutorial da série, vamos realizar o deploy completo da aplicação na Google Cloud, garantindo que ela funcione <strong>fora da sua máquina local</strong>, de forma segura e profissional.</p><p>The post <a href="https://mcu.tec.br/infraestrutura/automatizando-e-orquestrando-conteineres-com-docker-compose-e-github-actions-tutorial-parte-2/">Automatizando e Orquestrando Contêineres com Docker Compose e GitHub Actions – Tutorial Parte 2</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">562</post-id>	</item>
	</channel>
</rss>
