Azure Pipelines
Tags: azure, devops, beginners, braziliandevs
Published: 2023-04-19 17:44:29

O Azure DevOps é um conjunto de ferramentas de colaboração e gerenciamento de projetos desenvolvido pela Microsoft para suportar a entrega de software de maneira ágil e eficiente. Ele inclui recursos para gerenciamento de código-fonte, planejamento de projetos, rastreamento de problemas, implantação automatizada, testes e integração contínua.

O Azure DevOps é composto por vários serviços, incluindo o Azure Repos para controle de versão de código-fonte, o Azure Boards para gerenciamento de projetos e planejamento ágil, o Azure Artifacts para gerenciamento de pacotes e artefatos de build, o Azure Test Plans para gerenciamento de testes e o Azure Pipelines para executar as pipelines dos projetost.

Bora falar de Azure Pipelines =D 

O Azure Pipelines permite a criação de pipelines de integração contínua e entrega contínua (CI/CD), ajudando as equipes de desenvolvimento a automatizar todo o processo de criação e implantação de aplicativos, desde a compilação até a implantação em diferentes ambientes.

O Azure Pipelines pode interagir com outros serviços do Azure Devops, uma sugestão de interação seria essa: 

![Azure Devops](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yhlr14fswqjm73drou1n.png)

1.  No Azure Board você gerencia o seu projeto e cria a sua task. Você também pode associar o repositório do Azure Repos a sua task. 
2.  O Azure Repos é utilizado como servidor de repositório remoto de código ele pode ser criado com base no Git ou TFVC. Recomendo criar com base em Git.
3.  O Azure Pipelines executa as pipelines que vamos ver aqui como funciona. 
4.  O Azure Test armazena os planos de execução e os testes executados pela pipeline.
5.  O Azure Artifacts armazena os artefatos binários gerados pelos builds das aplicações do Azure Pipelines.

## Composição de pipelines no Azure

Existem 3 agrupamentos lógicos na construção da pipeline no Azure Pipelines: **pipelines**, **stages** e **steps**. 

![Composição de pipelines no Azure](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y7animpmlunhraxdq5xp.png)

1.  Um **"trigger"** diz a um **"Pipeline"** para executar.  
2.  Um **"pipeline"** é composto por uma ou mais "stages". 
3.  Um **"pipeline"** pode ser implantado em um ou mais ambientes.
4.  Uma **"stages"** é uma maneira de organizar **"job"** em um "pipeline" e cada "stages" pode ter um ou mais job.
5.  Cada **"job"** é executado por um **"Agent"**. Um **"job"** também pode não ter agente.
6.  Cada **"agent"** executa um **"Job"** que contém uma ou mais steps.
7.  Uma **"step"** pode ser uma tarefa ou script e é o menor bloco de construção de um **"pipeline"**.
8.  Uma **"task"** é um script pré-embalado que realiza uma ação, como invocar uma API REST ou publicar um artefato de construção.
9.  Um artefato é uma coleção de arquivos ou pacotes publicados por uma execução.

## Escrevendo a Pipeline

As pipelines são escritas com um arquivo de configuração YAML, ele seria um JSON melhorado, para saber mais: [https://yaml.org/](https://yaml.org/)

Como vimos anteriormente, vamos precisar de 4 blocos de código: trigger, stages, jobs e steps. Cada um deles tem seus parâmetros e atributos, vejamos como fica em um código simples. 

```yaml
trigger:
  branches:
    include:
    - master
stages:
- stage: AzurePipelines
  displayName: 'Hello World for pipelines'
  jobs:
  - job: AzurePipelines
    displayName: 'Hello World for pipelines'
    steps:
      - script: echo "hello to my first pipeline"
```

Para saber mais sobre os parâmetros e atributos consulte a referencia de schema da Microsoft [https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/](https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/)

Tudo certo você terá sua primeira execução de pipeline. 

![primeira execução de pipeline](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m87k4rz3fovso2nt4s1y.png)

## Log de execução 

Achei interessante trazer o log de execução para vermos cada comando executado na pipeline a partir do nosso código simples. 

```bash
##[section]Starting: Hello World for pipelines
##[section]Starting: Initialize job
Agent name: 'Azure Pipelines 2'
Agent machine name: 'fv-az179-88'
Current agent version: '2.220.0'
##[group]Operating System
Ubuntu
22.04.2
LTS
##[endgroup]
##[group]Runner Image
Image: ubuntu-22.04
Version: 20230402.1
Included Software: https://github.com/actions/runner-images/blob/ubuntu22/20230402.1/images/linux/Ubuntu2204-Readme.md
Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu22%2F20230402.1
##[endgroup]
##[group]Runner Image Provisioner
2.0.139.1
##[endgroup]
Current image version: '20230402.1'
Agent running as: 'vsts'
Prepare build directory.
Set build variables.
Download all required tasks.
Downloading task: CmdLine (2.212.0)
Checking job knob settings.
   Knob: DockerActionRetries = true Source: $(VSTSAGENT_DOCKER_ACTION_RETRIES) 
   Knob: AgentToolsDirectory = /opt/hostedtoolcache Source: ${AGENT_TOOLSDIRECTORY} 
   Knob: AgentPerflog = /home/vsts/perflog Source: ${VSTS_AGENT_PERFLOG} 
   Knob: ContinueAfterCancelProcessTreeKillAttempt = true Source: $(VSTSAGENT_CONTINUE_AFTER_CANCEL_PROCESSTREEKILL_ATTEMPT) 
Finished checking job knob settings.
Start tracking orphan processes.
##[section]Finishing: Initialize job
##[section]Starting: Checkout Dev Wiki@master to s
==============================================================================
Task         : Get sources
Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.
Version      : 1.0.0
Author       : Microsoft
Help         : [More Information](https://go.microsoft.com/fwlink/?LinkId=798199)
==============================================================================
Syncing repository: Dev Wiki (Git)
##[command]git version
git version 2.40.0
##[command]git lfs version
git-lfs/3.3.0 (GitHub; linux amd64; go 1.19.3)
##[command]git init "/home/vsts/work/1/s"
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /home/vsts/work/1/s/.git/
##[command]git remote add origin https://brbernardo.visualstudio.com/Dev%AZP2520Wiki/_git/Dev%AZP2520Wiki
##[command]git config gc.auto 0
##[command]git config --get-all http.https://brbernardo.visualstudio.com/Dev%AZP2520Wiki/_git/Dev%AZP2520Wiki.extraheader
##[command]git config --get-all http.extraheader
##[command]git config --get-regexp .*extraheader
##[command]git config --get-all http.proxy
##[command]git config http.version HTTP/1.1
##[command]git --config-env=http.extraheader=env_var_http.extraheader fetch --force --tags --prune --prune-tags --progress --no-recurse-submodules origin --depth=1 +ef8b3e859aedc2469c92a222fdf63fce2497ecc2:refs/remotes/origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2
remote: Azure Repos        
remote: 
remote: Found 45 objects to send. (0 ms)        
From https://brbernardo.visualstudio.com/Dev%20Wiki/_git/Dev%20Wiki
 * [new ref]         ef8b3e859aedc2469c92a222fdf63fce2497ecc2 -> origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2
##[command]git --config-env=http.extraheader=env_var_http.extraheader fetch --force --tags --prune --prune-tags --progress --no-recurse-submodules origin --depth=1 +ef8b3e859aedc2469c92a222fdf63fce2497ecc2
remote: Azure Repos        
remote: 
remote: Found 0 objects to send. (0 ms)        
From https://brbernardo.visualstudio.com/Dev%20Wiki/_git/Dev%20Wiki
 * branch            ef8b3e859aedc2469c92a222fdf63fce2497ecc2 -> FETCH_HEAD
##[command]git checkout --progress --force refs/remotes/origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2
Note: switching to 'refs/remotes/origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at ef8b3e8 update
##[section]Finishing: Checkout Dev Wiki@master to s
##[section]Starting: CmdLine
==============================================================================
Task         : Command line
Description  : Run a command line script using Bash on Linux and macOS and cmd.exe on Windows
Version      : 2.212.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line
==============================================================================
Generating script.
Script contents:
echo "hello to my first pipeline"
========================== Starting Command Output ===========================
[command]/usr/bin/bash --noprofile --norc /home/vsts/work/_temp/caf7686d-81a0-417e-86b7-0a7f102f78ce.sh
hello to my first pipeline
##[section]Finishing: CmdLine
##[section]Starting: Checkout Dev Wiki@master to s
==============================================================================
Task         : Get sources
Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.
Version      : 1.0.0
Author       : Microsoft
Help         : [More Information](https://go.microsoft.com/fwlink/?LinkId=798199)
==============================================================================
Cleaning any cached credential from repository: Dev Wiki (Git)
##[section]Finishing: Checkout Dev Wiki@master to s
##[section]Starting: Finalize Job
Cleaning up task key
Start cleaning up orphan processes.
##[section]Finishing: Finalize Job
##[section]Finishing: Hello World for pipelines
```

As pipelines no Azure Pipelines utilizam arquivos descritivos baseados em YAML. Isso traz algumas facilidades diminuindo a complexidade. 

Estarei trazendo mais alguns exemplos de YAMLs para o Azure Pipelines.