Azure Container Registry - Publish From GitHub Actions

Através do Azure Container Registry é possível armazenar imagens privadas do Docker dentro do Azure em sua conta. O Docker também possui o seu repositório para armazenamento de images, o Docker Hub.

A vantagem de ter toda esta estrutura do Azure é que você não precisa outros serviços para gerenciar as imagens geradas do seu sistema, ficando tudo da mesma infraestrutura (IaaS).

As funcionalidades do GitHub Actions permite que você automatize algumas tarefas de CI/CD, build, deploy, test, criação de imagens docker, entre outros.

Perceba que através de um dos repositórios do seu GitHub é possível configurar um fluxo e neste fluxo gerar uma imagem com o código do repositório e enviar esta imagem para o Azure Container Registry, bacana né, então vamos aos passos para que tudo isso funcione.

Create Container Registry

No Azure, você deve criar o Container Registry, para facilitar, crie o Resource Group e clique em Add e siga as imagens a seguir.

Create Container Registry from Marketplace on Azure Clique em Container Registry para abrir a próxima imagem.

Create Container Registry on Azure Preencha as informações conforme sua necessidade e siga em frente (next, next, finish).

Access Keys Configuration

Para que o GitHub possa publicar uma imagens do Docker no Container Registry criado, precisamos dar ao repositório lá no GitHub algumas informações das credenciais, são elas: Login server, Username, password2 conforme exibido na imagem a seguir.

Você deve estar se perguntando, por que usar o password2, eu costumo utilizar sempre o password2 para ferramentas externas no caso aqui esta senha vai ser utilizada pelo GitHub, caso seja necessário resetar a senha, somente este é necessário, a primeira senha eu costumo utilizar para questões internas dentro do próprio azure, pois faz parte da mesma plataforma.

Container Registry Access Keys

Container Registry Pricing

Você pode conferir os custos do Container Registry aqui

GitHub Repository

Para que este processo de integração entre o GitHub e o Azure funcione, precisamos de um repositório onde vai ficar o código da aplicação que utilizei para testar ficará armazenado, então no GitHub eu criei este repositório. A aplicação do tipo WebAPI eu criei ASP.NET Core API, no modelo "next, next, finish", apenas para que pudessemos testar este processo de integração.

Integrating GitHub and Azure

Este processo de integração entre o GitHub e o Azure ficou fácil de entender quando utilizamos a anologia de que o GitHub passa a ser um client do Azure neste processo, lá no post ASP.NET Core 3.1 - IdentityServer4 - In-memory (Parte 1) eu falo sobre o client, nos posts seguintes também há muitas referências.

Para que esta conexão entre os dois funcione, é necessário que o GitHub possua as credenciais de acesso ao Azure, Login server, Username, password2 que eu comentei mais acima.

Lá no GitHub, nas configurações (settings) do repositório que eu criei, eu configurei três secrets conforme a imagem a seguir, cada uma delas contendo o Login server, password2 e Username.

GitHub Repository Settings Secret

Depois disso, para o mesmo repositório, eu fui até a aba Actions para criar o workflow de geração da imagem e publicação no Azure Registry Container como mostrado nos passos da imagens a seguir.

GitHub Repository Actions New Workflow Clique em New workflow.

Em seguida, procure pela opção "Docker image", preste bastante atenção, pois inicialmente nem todas as opções vão aparecer, então você deve usar o botáo More continuous integration workflow.
GitHub Repository Actions New Workflow Docker Image Clique em Set up this workflow

Do lado direito, você vai ver a opção Marketplace, procure no Marketplace pelo serviço Azure Container Registry Login, perceba que este serviço é by Azure, tome cuidado com serviços que não sejam oficiais. Clique sobre ele e você vai ter a tela exatamente como a da imagem a seguir
GitHub Repository Actions New Workflow Docker Image yml No Marketplace, ao clicar sobre o serviço, você vai ver uma prévia da configuração (snippet) necessária para o uso adequado.

Eu já aproveitei e deixei o arquivo de configuração do workflow (.yml) prontinho para ser utilizado. Você vai perceber uma diferença, que foi uma customização para podermos usar as secrets que criamos para poder ser autorizado pelo Azure, é desta forma que é feito.

Por fim, clique em "Start commit", preencha as informações conforme sua preferência e clique em "Commit new file".

GitHub Repository Actions New Workflow Docker Image Commit

Dockerfile

Se você seguir o exemplo que eu criei e a configuração das pastas como eu fiz, você vai ter que colocar o seu arquivo Dockerfile na raiz do projeto e o seu conteúdo deve ficar como o mostrado a seguir.
Caso você siga uma outra abordagem, talvez você precise fazer alguma adaptação por conta do contexto na geração da imagem, mas com as mensagens de erro que podem ocorrer é possível resolver com tranquilidade.

yml Troubleshooting

O arquivo yml é bem sensível, possui um formato próprio que precisa de atenção e é importante compreender seu funcionamento.
Ele funciona na base de nós e tabulações (identação), assim como a linguagem Python, então você pode ter erros como este:

every step must define a "uses" or "run" key

Significa que a identação está errada ou um "uses" está faltando em um nó que representa uma determinada ação, sendo que os nós que possuem o "run", não precisam do "uses". Se você seguir o arquivo que eu deixei como modelo vai funcionar.

O próximo erro está relacionado ao nome do repositório, deve estar sempre com letras minúsculas, caso contrário você pode se deparar com o erro abaixo.

invalid argument "*/AzureRegistryGitActions:latest" for "-t, --tag" flag: invalid reference format: repository name must be lowercase

O próximo problema está relacionado ao local onde seu arquivo "Dockerfile" está localizado, ele deve estar na raiz do repositório, pois é na raiz que o papiline de execução vai utilizar como contexto para encontrar o "Dockerfile" e a partir dele buscar os arquivos do projeto que estão na pasta "/src".

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/runner/work/AzureRegistryGitActions/AzureRegistryGitActions/Dockerfile: no such file or directory

Se o seu workflow der certo, uma publicação de uma imagem vai ser apresentada lá no seu Azure Container Registry e sucesso!

GitHub Packages

Em todos estes testes eu me surpreendi em saber que o GitHub possui um Docker interno para publicação das imagens. Na esperança de publicar no Docker Hub da própria Docker, acabou indo parar dentro dos packages do GitHub. O que eu fiz? Vamos aos passos.

Adicionei um New workflow e selecionei o Marketplace diferente do anterior, como mostrado na imagem a seguir.

GitHub Repository Actions New Workflow Docker Container Image

Ao clicar em Set up this workflow, como você já está dentro do GitHub, não é necessário realizar nenhuma alteração no arquivo yml (o meu foi criado como mostrado a seguir) que será criado, basta apenas realizar o commit e pronto.

Por fim, no GitHub você vai ver que há um pacote associado ao seu repositório, ao qual você pode realizar o pull em seu Docker Desktop e executar localmente.