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.
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.
Use a calculadora de preços para gerar uma estimativa de custo baseada na projeção de uso.
Antes de começar
- 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.
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Ative a API Compute Engine.
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Ative a API Compute Engine.
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.
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
Crie a conta de serviço:
gcloud iam service-accounts create jenkins --display-name jenkins
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)')
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.
Crie o arquivo de chave:
gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
No Cloud Shell, clique em Mais more_vert e em Fazer o download do arquivo.
Digite
jenkins-sa.json
.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
para se comunicar 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:
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 ""
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 valor de referência 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.
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 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
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
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
Como 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.
Clique em Iniciar.
Altere o campo Tipo de máquina para 4 vCPUs - 15 GB de memória, n1-standard-4.
Clique em Implantar e aguarde o fim do provisionamento da instância do Jenkins. Quando estiver finalizado, você verá:
Clique no link Endereço do site para abrir a instância do Jenkins no navegador.
Faça login no Jenkins usando o Usuário administrador e a Senha do administrador exibidos no painel de detalhes.
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
- Na IU do Jenkins, selecione Manage Jenkins.
- Clique em Manage Plugins.
- Clique na guia Available.
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.
Clique em Download now and install after restart.
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:
- Faça login no Jenkins novamente e clique em Manage Jenkins.
- Clique em Credentials.
- Em Store, clique em Jenkins.
- No painel principal da IU, clique em Credenciais globais (irrestrito).
Crie as credenciais do Google:
- Clique em Add Credentials.
- Defina Kind como Google Service Account from private key.
- No campo Project Name, insira o código do projeto do Google Cloud.
- Clique em Choose file.
- Selecione o arquivo
jenkins-sa.json
que você baixou do Cloud Shell. Clique em OK.
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.
- Clique em Manage Jenkins.
- Clique em Manage Nodes and Clouds.
- Clique em Configure Clouds.
- Clique em Add a new Cloud.
- Clique em Compute Engine.
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
- Name:
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.
- Na página Configure Clouds, clique em Add add em Instance Configurations.
Insira as seguintes configurações em General:
- Name:
ubuntu-2004
- Description:
Ubuntu agent
- Labels:
ubuntu-2004
- Name:
Nas configurações de Location, use:
us-central1
para Region;us-central1-f
para Zone.
Clique em Advanced.
Em Machine Configuration, escolha o Machine Type n1-standard-1.
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?.
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.
Clique em Save para manter as alterações de configuração.
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.
- Clique em Create new job na interface do Jenkins.
- Use
test
como o nome do item. - Clique em Freestyle project e depois em OK.
- Selecione as caixas Execute concurrent builds if necessary e Restrict where this project can run.
- No campo Label Expression, insira
ubuntu-2004
. - Na seção Build, clique em Add build step.
- Clique em Execute Shell.
Na caixa de comando, digite uma string de teste:
echo "Hello world!"
Clique em Save.
Clique em Build Now para iniciar uma versão.
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.
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
Na lista de jobs na IU do Jenkins, clique em test.
Clique em Configure.
Em Build, defina o campo de texto Command como:
env > build_environment.txt
Em Post-build Actions, clique em Add post-build action.
Clique em Cloud Storage Plugin.
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
Clique em Add Operation.
Clique em Classic Upload.
No campo File Pattern campo, insira
build_environment.txt
.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
Clique em Save.
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.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. Visando reduzir os custos de objetos que são acessados com pouca frequência, use o gerenciamento de 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.
No Cloud Shell, crie o arquivo de configuração do ciclo de vida para fazer a transição de todos os objetos para o armazenamento Nearline após 30 dias, bem como dos objetos Nearline para o armazenamento Coldline 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
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
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
Usando o Cloud Deployment Manager, exclua a instância do Jenkins:
gcloud deployment-manager deployments delete jenkins-1
Exclua o bucket do Cloud Storage:
export PROJECT=$(gcloud info --format='value(config.project)') gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
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
- Conheça a implantação contínua com o Jenkins
- Implante o Jenkins no Kubernetes Engine
- Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.