Paulo Henrique Rodrigues Pinheiro

Um blog sobre programação para programadores!


Quase um deploy contínuo!

Ainda não é um deploy contínuo (mas falta um pouquinho): usando os triggers do pipeline no Bitbucket.

Bitbucket Pipeline

Continuando

Em texto anterior, Desenvolvendo e publicando um site Javascript na Amazon AWS, foi mostrado como publicar automaticamente um site em javascript na Amazon, sem precisar de um servidor, e sem precisar mandar publicar.

Uma forma de deploy contínuo, usando os pipelines do Bibucket. Ideia simples: alterou a master, se os testes passarem, um bucket S3 é atualizado, que por sua vez, está atrelado a uma distribuição CloudFront.

Outro problema

Até aí tudo bem, com essas configurações, conseguimos ter todo o processo de homologação sob controle. Mas e a produção? Um script pra publicar?

Não!

Nova solução

Tentando resolver esse problema aqui na CARGOBR, deparei-me com essa belezura que é um trigger por tag criado no git.

Criou uma tag no seu repositório, se ele bater com o padrão informado, uma ação é disparada. O padrão aqui exemplificado é: se uma tag começando com production- for criada no repositório, ela será publicada em produção.

Assim temos um processo automático de geração para homologação, e quando as coisas estiverem bem, vai pra produção, tudo feito ou através da interface do Bitbucket, ou linha de comando mesmo, com git push --tags.

Para isso, basta alterar o bitbucket-pipelines.yml (veja o texto citado no começo), e adicionar o elemento tags:


tags:
    production-*:
      - step:
          name: Build assets
          image: node:9.11-alpine
          caches:
            - node
          script:
            - npm install
            - npm run-script build
          artifacts:
            - dist/**
      - step:
          name: Deploy assets to AWS S3 - Production
          image: python:3.6-alpine3.7
          deployment: production
          script:
            - pip install awscli
            - aws s3 sync --acl public-read --content-encoding utf-8 --delete dist/ $CARGOBR_S3_BUCKET_PRODUCTION
            - aws cloudfront create-invalidation --distribution-id $CARGOBR_CF_DISTRIBUTION_ID_PRODUCTION --paths="/*"

Três pontos a atentar:

  1. Adicionou-se a glob para verificar se a tag interessa ou não (production-*:).
  2. Os passos são os mesmos, eu sei, está um copiar e colar do passo anterior.
  3. As variáveis de ambiente para produção são diferentes de homologação!

Com isso: