Automatizando a entrega contínua em contêineres com CodeBuild, ECR e CodeDeploy
Shutterstock / Ribkhan
Integração Contínua / Entrega Contínua (CI / CD) é o processo de automatizar atualizações de aplicativos, de alterações no controle de origem, compilações automatizadas e implantações automatizadas em seus servidores. A AWS fornece um serviço para isso, chamado CodePipeline, que pode ser configurado para funcionar com contêineres.
Entrega contínua em contêineres
Os contêineres são um pouco mais complicados que os aplicativos tradicionais. Muitos aplicativos em contêineres realmente usam duas imagens de contêiner. A primeira, chamada de imagem base, é essencialmente uma AMI personalizada pré-carregada com dependências e outros aplicativos. Isso é feito para acelerar os tempos de construção, porque se você está apenas atualizando o código do aplicativo, não precisa reinstalar o NGINX e todos os outros softwares no contêiner. A segunda imagem é a imagem real do aplicativo, que estende a imagem base e contém seu próprio código.
Dessa forma, o pipeline de CI / CD que configuraremos será na verdade dois pipelines. O primeiro observará as alterações na imagem base e acionará uma reconstrução e atualização no ECR quando isso acontecer. O segundo pipeline conterá dois estágios de origem - um que observa alterações no repositório de ECR da imagem base e outro que escuta atualizações no código fonte da imagem do aplicativo. Dessa forma, se você estiver apenas atualizando a imagem do aplicativo, a imagem base não precisará ser reconstruída.
Com dois pipelines, o CodePipeline acionará as atualizações de aplicativos de uma das duas maneiras:
- Alterações na imagem do aplicativo desencadearão uma reconstrução da imagem do aplicativo, usando a imagem base mais recente, que não precisa ser reconstruída. A atualização será enviada para ECR, com implantação opcional no ECS ou em outro serviço de contêiner.
- As alterações na imagem base acionarão uma reconstrução da imagem base, que implantará as atualizações no ECR. Isso, por sua vez, acionará uma reconstrução da imagem do aplicativo, que será enviada para ECR e depois para ECS.
No entanto, essa configuração de pipeline duplo pode não ser necessária para todos os aplicativos, e se você estiver apenas usando uma imagem do SO base pré-criada como o Ubuntu, precisará de apenas um pipeline para lidar com tudo.
Configuração da função do IAM
Primeiro, você precisará configurar uma função de serviço para conceder ao CodeBuild as permissões necessárias para interagir com outros serviços da AWS (como ECR) em seu nome. Abra o Console de Gerenciamento do IAM e crie uma nova função em "Funções". Escolha "Serviço da AWS", ” e selecione CodeBuild na lista.
Para as políticas, você desejará criar uma nova política com as seguintes permissões:
{"Versão": "17/10/2012", "Instrução": [{"Sid": "CloudWatchLogsPolicy", "Efeito": "Permitir", "Ação": ["logs: CreateLogGroup "," logs: CreateLogStream "," logs: PutLogEvents "]," Recurso ": [" * "]}, {" Sid ":" CodeCommitPolicy "," Efeito ":" Permitir "," Ação ": [" codecommit : GitPull "]," Recurso ": [" * "]}, {" Sid ":" S3GetObjectPolicy "," Efeito ":" Permitir "," Ação ": [" s3: GetObject "," s3: GetObjectVersion "] , "Recurso": ["*"]}, {"Sid": "S3PutObjectPolicy", "Efeito": "Permitir", "Ação": ["s3: PutObject"], "Recurso": ["*"] }, {"Sid": "ECRPullPolicy", "Effect": "Allow", "Action": ["ecr: BatchCheckLayerAvailability", "ecr: GetDownloadUrlForLayer", "ecr: BatchGetImage"], "Recurso": ["* "]}, {" Sid ":" ECRAuthPolicy "," Efeito ":" Permitir "," Ação ": [" ecr: GetAuthorizationToken "]," Recurso ": [" * "]}, {" Sid ":" S3BucketIdentity "," Efeito ":" Permitir "," Ação ": [" s3: GetBucketAcl "," s3: GetBucketLocation "]," Recurso ":" * "}]}
Cole isso na guia JSON no editor de políticas. Dê um nome e anexe-o à função. Você também deseja anexar a política premade, AmazonEC2ContainerRegistryPowerUser.
Depois que essas duas políticas forem anexadas, dê um nome à função e clique em criar.
Configurando o controle de origem e o CodeBuild
O CodePipeline oferece suporte a atualizações de código extraídas do controle de origem CodeCommit do GitHub, BitBucket e AWS. Você terá a melhor experiência usando o CodeCommit como um repositório de versão secundário, mas o GitHub funcionará perfeitamente. Se você estiver usando o GitLab ou outro provedor, precisará usar o CodeCommit para enviar atualizações.
Nesta etapa, você desejará ter dois repositórios diferentes ", um para a imagem de base e outro para a imagem do aplicativo. Se você não estiver usando uma imagem base personalizada, poderá pular a configuração.
Para a imagem base, você desejará criar um arquivo buildspec, essencialmente uma lista de comandos que o CodeBuild executará ao criar sua imagem. Você pode inserir isso manualmente ao configurar o CodeBuild, mas é melhor salvá-lo como um arquivo chamado buildspec. yml na raiz do seu repositório.
Sua configuração exata pode variar dependendo dos requisitos de sua aplicação, mas deve ser algo como isto:
versão: 0.2 fases: pre_build: comandos: - eco Efetuando login no Amazon ECR ... - aws --version - $ (aws ecr get-login - região $ AWS_DEFAULT_REGION - sem inclusão de email ) - REPOSITORY_URI = 012345678910. dkr. ecr. us-east-1. amazonaws. com / base-image - COMMIT_HASH = $ (eco $ CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG = $ build: comandos: - construção de eco: iniciado em `date` - eco Criando a imagem do Docker ... - docker build -t $ REPOSITORY_URI: mais recente. - tag docker $ REPOSITORY_URI: mais recente $ REPOSITORY_URI: $ IMAGE_TAG post_build: comandos: - construção de eco concluída em `date` - eco Empurrando as imagens do Docker ... - empurrando as imagens do Docker ... - empurrando a docker $ REPOSITORY_URI: mais recente - empurrando o docker $ REPOSITORY_URI: $ IMAGE_TAG
Este exemplo fará logon no ECR, definirá a tag da imagem como o ID de compilação do CodeBuild, compilará a imagem do Docker e, em seguida, enviará as alterações ao seu repositório do ECR. Você desejará alterar a declaração da variável REPOSITORY_URI para ser o URI do seu repositório de ECR de destino.
Salve isso como buildspec. yml e coloque-o na raiz do repositório de imagens base e do aplicativo. Você pode testar seu buildspec iniciando manualmente uma compilação no console do CodeBuild ou simplesmente prosseguir para a configuração do pipeline e corrigir os erros que possam surgir.
Configurando o pipeline
Depois de organizar o seu buildspec, abra o CodePipeline Console e crie um novo pipeline para a imagem base. Dê um nome a ele e deixe-o criar uma nova função de serviço. Para o estágio de controle de origem, escolha o tipo que você está usando e selecione um repositório e uma ramificação. Se você quiser, poderá configurar uma ramificação adicional para rastrear lançamentos, e o CodePipeline ignorará as alterações no mestre.
Para o estágio de construção, selecione "Criar projeto". ” Isso exibirá uma caixa de diálogo na qual você poderá configurar o CodeBuild.
Normalmente, você precisa vincular o CodeBuild ao seu controle de origem, mas isso é tratado automaticamente pelo pipeline ao criar um novo projeto dessa maneira. Você precisará configurar o ambiente em que sua compilação é executada. Você pode escolher uma imagem personalizada do Docker, carregada com todos os programas necessários para compilação, ou pode instalá-las manualmente na fase de pré-compilação do buildspec. yml. Se você não precisar de nada de especial, poderá selecionar o Amazon Linux 2 e o tempo de execução padrão, que é fornecido com a maioria dos tempos de execução da linguagem de programação e com o Docker pré-instalado.
Você também deseja selecionar a função de serviço criada anteriormente:
Por fim, você pode alterar manualmente o nome do arquivo buildspec, se não o desejar no diretório raiz da sua fonte ou se tiver vários arquivos entre os quais você precisará diferenciar. Você também pode inserir comandos de construção manualmente aqui, mas recomendamos o rastreamento como um arquivo no git.
Para o estágio de implantação, você desejará pular para a imagem base. O arquivo buildspec criará e enviará alterações para o ECR, que é tudo o que você precisa para esta etapa. Você pode testar o pipeline pressionando alterações no seu repositório de imagens base.
Configurando o pipeline de imagem do aplicativo
Em seguida, você configurará um pipeline adicional para a imagem do seu aplicativo. Crie um novo pipeline a partir do console e selecione "ECR" ” como a fonte. Selecione seu repositório de imagens base e deixe a tag da imagem em branco, que será o padrão para a última.
Para o estágio de construção, você desejará configurar o CodeBuild da mesma maneira que o estágio de imagem base - crie um novo projeto de construção, selecione o ambiente padrão e insira a função de serviço que você criou anteriormente .
O estágio de implantação é opcional. Sem ele, as alterações na imagem base ou na imagem do aplicativo simplesmente acionam a imagem do aplicativo para reconstruir e enviam as alterações ao ECR. No entanto, se você estiver usando o ECS para implantação, poderá adicionar outro estágio que levará sua imagem criada e atualizará seus servidores.
De qualquer forma, clique em criar para criar o pipeline. Algumas alterações são necessárias antes que funcione, então clique em "Editar" ” no pipeline, então “ Edit Stage ” para o estágio de controle de origem:
Tal como está, o estágio de controle de origem simplesmente extrai do ECR para a imagem base. Isso é necessário, mas também é necessário que o código do aplicativo faça alguma coisa útil e também responda a alterações no código do aplicativo (não apenas na imagem base).
Clique em Adicionar ação: ”
Escolha CodeCommit (ou outro controle de origem) como o tipo de ação e selecione seu repositório e filial. Para Artefatos de Saída, ” você desejará entrar no SourceArtifact para indicar que este é o código-fonte do aplicativo.
Você também desejará editar o estágio ECR para especificar que o artefato de saída é uma Imagem Base.
Isso deve ser tudo o que o CodeBuild precisa para executar e, uma vez que você atualiza seu pipeline, ele deve executar novamente, espero que sem erros.
Se você cometer erros, é provável que o seu buildspec para o CodeBuild não esteja funcionando corretamente. Você pode visualizar os logs de compilação no console do CodeBuild ou consultar a Referência de especificações de compilação da AWS para obter mais informações sobre como tudo funciona.
Via: How to Geek
Nenhum comentário