Como usar o Jenkins para versões distribuídas no Compute Engine


Neste tutorial, mostramos como fazer as seguintes tarefas:

  • Criar um sistema de integração contínua Jenkins para executar versões usando agentes do Jenkins sob demanda no Compute Engine.
  • Armazenar artefatos de versão no Cloud Storage.
  • Aplicar uma política de ciclo de vida para migrar artefatos de versão mais antigos no Cloud Storage para opções de armazenamento menos dispendiosas.

Arquitetura

O diagrama a seguir é um panorama da arquitetura do tutorial.

Arquitetura em que uma conta de serviço envia artefatos por meio do Compute Engine para o Cloud Storage.

Nele, uma conta de serviço é adicionada ao Jenkins para que as instâncias de agente sejam criadas e os artefatos sejam enviados para o Cloud Storage para armazenamento de longo prazo. O Jenkins provisiona as instâncias instantaneamente, enquanto executa as versões. À medida que os artefatos de versão envelhecem, eles passam por várias classes de armazenamento para limitar o custo de retenção.

Objetivos

  • Criar uma imagem de base com o Packer para executar as versões do Jenkins.
  • Provisionar o Jenkins usando o Cloud Marketplace.
  • Configurar o Jenkins para implantar agentes de versão temporários.
  • Fazer o upload de artefatos de versão no Cloud Storage.
  • Configurar as políticas de ciclo de vida para otimizar os custos do Cloud Storage.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

  • Compute Engine
  • Cloud Storage

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Use a calculadora de preços para gerar uma estimativa de custo com base no uso previsto.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative a API Compute Engine.

    Ative a API

  5. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  7. Ative a API Compute Engine.

    Ative a API

Como configurar o ambiente

Nesta seção, você configurará a infraestrutura e as identidades necessárias para concluir o tutorial. Você executará o restante do tutorial dentro do Cloud Shell.

Abra o Cloud Shell

Configurar IAM

Crie uma conta de serviço de gerenciamento de identidade e acesso (IAM) para delegar permissões ao Jenkins. Essa conta permitirá que o Jenkins armazene dados no Cloud Storage e inicie instâncias no Compute Engine. O Jenkins executa as versões em instâncias temporárias e armazena os artefatos no Cloud Storage.

Criar uma conta de serviço

  1. Crie a conta de serviço:

    gcloud iam service-accounts create jenkins --display-name jenkins
  2. Armazene o endereço de e-mail da conta de serviço e o código do seu projeto atual do Google Cloud em variáveis de ambiente para uso em comandos posteriores:

    export SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:jenkins" --format='value(email)')
    export PROJECT=$(gcloud info --format='value(config.project)')
  3. Vincule os seguintes papéis à conta de serviço:

    gcloud projects add-iam-policy-binding $PROJECT \
        --role roles/storage.admin --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.instanceAdmin.v1 \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.networkAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.securityAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/iam.serviceAccountActor \
        --member serviceAccount:$SA_EMAIL

Download da chave da conta de serviço

Depois de conceder as permissões adequadas à conta de serviço, é necessário criar e fazer o download da chave da conta. Mantenha essa chave em um lugar seguro. Você precisará dela em uma etapa posterior, quando configurar o plug-in do JClouds para autenticação na Compute Engine API.

  1. Crie o arquivo de chave:

    gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
  2. No Cloud Shell, clique em Mais e em Fazer o download do arquivo.

  3. Digite jenkins-sa.json.

  4. Clique em Fazer o download para salvar o arquivo localmente.

Criar uma imagem de agente do Jenkins

Em seguida, crie uma imagem reutilizável do Compute Engine que contenha o software e as ferramentas necessários para a execução como um executor do Jenkins.

Criar uma chave SSH para o Cloud Shell

Mais adiante neste tutorial, você usará o Packer para criar imagens, o que exige que o comando ssh se comunique com as instâncias da versão. Para ativar o acesso SSH, crie e faça o upload de uma chave SSH no Cloud Shell:

  1. Crie um par de chaves SSH. Se já existir um par de chaves, este comando o usará, senão, criará um novo:

    ls ~/.ssh/id_rsa.pub || ssh-keygen -N ""
  2. Adicione a chave SSH pública do Cloud Shell aos metadados do projeto:

    gcloud compute project-info describe \
        --format=json | jq -r '.commonInstanceMetadata.items[] | select(.key == "ssh-keys") | .value' > sshKeys.pub
    echo "$USER:$(cat ~/.ssh/id_rsa.pub)" >> sshKeys.pub
    gcloud compute project-info add-metadata --metadata-from-file ssh-keys=sshKeys.pub

Cria a imagem de base

A próxima etapa consiste em usar o Packer para criar uma imagem de máquina virtual (VM, na sigla em inglês) de base para os agentes de versão, que atuam como executores de versão temporários no Jenkins. O agente do Jenkins mais básico requer a instalação do Java apenas. É possível personalizar a imagem adicionando comandos de shell na seção provisioners da configuração do Packer ou adicionando outros provisionadores do Packer.

  1. No Cloud Shell, faça o download e descompacte a versão mais recente do Packer. O exemplo a seguir usa o Packer 1.7.10. Consulte o site do Hashicorp (em inglês) para ver se há uma versão mais recente:

    wget https://releases.hashicorp.com/packer/1.7.10/packer_1.7.10_linux_amd64.zip
    unzip packer_1.7.10_linux_amd64.zip
  2. Crie o arquivo de configuração das suas versões de imagem do Packer:

    export PROJECT=$(gcloud info --format='value(config.project)')
    cat > jenkins-agent.json <<EOF
    {
      "builders": [
        {
          "type": "googlecompute",
          "project_id": "$PROJECT",
          "source_image_family": "ubuntu-2004-lts",
          "source_image_project_id": "ubuntu-os-cloud",
          "zone": "us-central1-a",
          "disk_size": "50",
          "image_name": "jenkins-agent-{{timestamp}}",
          "image_family": "jenkins-agent",
          "ssh_username": "ubuntu"
        }
      ],
      "provisioners": [
        {
          "type": "shell",
          "inline": ["sudo apt-get update && sudo apt-get install -y default-jdk"]
        }
      ]
    }
    EOF
    
  3. Execute o Packer para criar a imagem:

    ./packer build jenkins-agent.json

    Quando a versão estiver concluída, o nome da imagem do disco será exibido com o formato jenkins-agent-[TIMESTAMP], em que [TIMESTAMP] é a época em que a criação foi iniciada.

    ==> Builds finished. The artifacts of successful builds are:
    --> googlecompute: A disk image was created: jenkins-agent-1612997575
    

Instalar o Jenkins

Nesta seção, use o Cloud Marketplace para provisionar uma instância do Jenkins. Personalize essa instância para usar a imagem do agente que você criou na seção anterior.

  1. Acesse a solução do Cloud Marketplace para Jenkins.

  2. Clique em Iniciar.

  3. Altere o campo Tipo de máquina para 4 vCPUs - 15 GB de memória, n1-standard-4.

    Seleção do tipo de máquina para implantação do Jenkins.

  4. Clique em Implantar e aguarde o fim do provisionamento da instância do Jenkins. Quando estiver finalizado, você verá:

    O Jenkins foi implantado.

  5. Clique no link Endereço do site para abrir a instância do Jenkins no navegador.

  6. Faça login no Jenkins usando o Usuário administrador e a Senha do administrador exibidos no painel de detalhes.

    Painel de detalhes com credenciais e outros detalhes da implantação.

A instância do Jenkins estará pronta para uso.

Como configurar os plug-ins do Jenkins

O Jenkins requer plug-ins para criar agentes sob demanda no Compute Engine e armazenar artefatos no Cloud Storage. É necessário instalar e configurar esses plug-ins.

Instalar plug-ins

  1. Na IU do Jenkins, selecione Manage Jenkins.
  2. Clique em Manage Plugins.
  3. Clique na guia Available.
  4. Use a barra Filter para encontrar os plug-ins a seguir e selecione as caixas ao lado deles:

    • plug-in do Compute Engine
    • plug-in do Cloud Storage

    Na imagem a seguir, veja o plug-in do Cloud Storage selecionado.

    Plug-in do Cloud Storage.

  5. Clique em Download now and install after restart.

  6. Clique na caixa de seleção Restart Jenkins when installation is complete and no jobs are running. O Jenkins reinicia e conclui a instalação dos plug-ins.

Criar credenciais de plug-ins

É preciso criar Google Credentials para os novos plug-ins:

  1. Faça login no Jenkins novamente e clique em Manage Jenkins.
  2. Clique em Credentials.
  3. Em Store, clique em Jenkins.
  4. No painel principal da IU, clique em Credenciais globais (irrestrito).
  5. Crie as credenciais do Google:

    1. Clique em Add Credentials.
    2. Defina Kind como Google Service Account from private key.
    3. No campo Project Name, insira o código do projeto do Google Cloud.
    4. Clique em Choose file.
    5. Selecione o arquivo jenkins-sa.json que você baixou do Cloud Shell.
    6. Clique em OK.

      Credenciais de chave JSON.

  6. Clique em Jenkins.

Configurar o plug-in do Compute Engine

Configure o plug-in do Compute Engine com as credenciais que ele usa para provisionar as instâncias do agente.

  1. Clique em Manage Jenkins.
  2. Clique em Manage Nodes and Clouds.
  3. Clique em Configure Clouds.
  4. Clique em Add a new Cloud.
  5. Clique em Compute Engine.
  6. Defina as seguintes configurações e substitua [YOUR_PROJECT_ID] pelo código do seu projeto do Google Cloud:

    • Name: gce
    • Project ID: [YOUR_PROJECT_ID]
    • Instance Cap: 8
  7. Escolha a conta de serviço na lista suspensa Service Account Credentials. Ele aparece como o código do projeto do Google Cloud.

Definir configurações de instância do Jenkins

Agora que o plug-in do Compute Engine está configurado, é possível definir configurações de instância do Jenkins para quantas configurações de versão você quiser.

  1. Na página Configure Clouds, clique em Add em Instance Configurations.
  2. Insira as seguintes configurações em General:

    • Name: ubuntu-2004
    • Description: Ubuntu agent
    • Labels: ubuntu-2004
  3. Nas configurações de Location, use:

    • us-central1 para Region;
    • us-central1-f para Zone.
  4. Clique em Advanced.

  5. Em Machine Configuration, escolha o Machine Type n1-standard-1.

  6. Em Networking, escolha as seguintes configurações:

    • Network: mantenha a configuração padrão.
    • Subnetwork: mantenha a configuração padrão.
    • Selecione Attach External IP?.
  7. Selecione as seguintes configurações em Boot Disk:

    • Em Image project, escolha o projeto do Google Cloud.
    • Em Image name, selecione a imagem que você criou anteriormente usando o Packer.
  8. Clique em Save para manter as alterações de configuração.

    Configurações do Compute Engine para Jenkins.

Como criar um job do Jenkins para testar a configuração

O Jenkins é configurado para iniciar uma instância automaticamente quando um job que requer um agente com o rótulo ubuntu-2004 é acionado. Crie um job que testa se a configuração está funcionando conforme o esperado.

  1. Clique em Create new job na interface do Jenkins.
  2. Use test como o nome do item.
  3. Clique em Freestyle project e depois em OK.
  4. Selecione as caixas Execute concurrent builds if necessary e Restrict where this project can run.
  5. No campo Label Expression, insira ubuntu-2004.
  6. Na seção Build, clique em Add build step.
  7. Clique em Execute Shell.
  8. Na caixa de comando, digite uma string de teste:

    echo "Hello world!"

    Hello World digitado na caixa de comando do Jenkins.

  9. Clique em Save.

  10. Clique em Build Now para iniciar uma versão.

    Build Now.

Como fazer upload de artefatos de versão no Cloud Storage

Se você quiser, armazene artefatos de versão para testes ou análises futuros. Configure seu job do Jenkins para gerar um artefato e fazer o upload dele no Cloud Storage. O registro da versão é enviado para o mesmo bucket.

  1. No Cloud Shell, crie um bucket de armazenamento para os artefatos:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-jenkins-artifacts
  2. Na lista de jobs na IU do Jenkins, clique em test.

  3. Clique em Configure.

  4. Em Build, defina o campo de texto Command como:

    env > build_environment.txt
  5. Em Post-build Actions, clique em Add post-build action.

  6. Clique em Cloud Storage Plugin.

  7. Preencha o campo Storage Location com o caminho do seu artefato, substituindo [YOUR_PROJECT_ID] com o código do projeto do Google Cloud:

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
  8. Clique em Add Operation.

  9. Clique em Classic Upload.

  10. No campo File Pattern campo, insira build_environment.txt.

  11. No campo Storage Location, insira o caminho de armazenamento, substituindo [YOUR_PROJECT_ID] com o código do projeto do Google Cloud:

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER

    Ações pós-criação referentes ao plug-in do Cloud Storage.

  12. Clique em Save.

  13. Clique em Build Now para iniciar uma nova versão. A versão é executada na instância do Compute Engine que você provisionou anteriormente. Quando ela estiver concluída, o upload do arquivo do artefato (build_environment.txt) será feito para o bucket do Cloud Storage configurado.

  14. No Cloud Shell, veja o artefato da versão usando gsutil:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil cat gs://$PROJECT-jenkins-artifacts/test/2/build_environment.txt

Como configurar o gerenciamento do ciclo de vida de objetos

Provavelmente, você acessará mais os artefatos de versão mais recentes. Para economizar custos de objetos acessados com pouca frequência, use o gerenciamento do ciclo de vida de objetos para migrar os artefatos de classes de armazenamento com melhor desempenho para aquelas com maior latência e menor custo.

  1. No Cloud Shell, crie o arquivo de configuração do ciclo de vida para passar todos os objetos para Nearline Storage após 30 dias e os objetos Nearline para Coldline Storage após 365 dias.

    cat > artifact-lifecycle.json <<EOF
    {
    "lifecycle": {
      "rule": [
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "NEARLINE"
        },
        "condition": {
          "age": 30,
          "matchesStorageClass": ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
        }
      },
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "COLDLINE"
        },
        "condition": {
          "age": 365,
          "matchesStorageClass": ["NEARLINE"]
        }
      }
    ]
    }
    }
    EOF
  2. Faça o upload do arquivo de configuração no bucket de armazenamento de artefatos:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil lifecycle set artifact-lifecycle.json gs://$PROJECT-jenkins-artifacts

Limpeza

  1. Exclua todos os agentes do Jenkins que ainda estão em execução:

    gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
  2. Usando o Cloud Deployment Manager, exclua a instância do Jenkins:

    gcloud deployment-manager deployments delete jenkins-1
  3. Exclua o bucket do Cloud Storage:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
  4. Exclua a conta de serviço:

    export SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName:jenkins" --format='value(email)')
    gcloud iam service-accounts delete $SA_EMAIL

A seguir