# Riferimento Rapido Bitbucket Pipelines

*Pipeline CI/CD, caching, artifact, deployment*

> Source: Bitbucket Documentation (support.atlassian.com/bitbucket-cloud) · MIT

## Basi delle Pipeline

### Come Funziona

| Command | Description |
|---------|-------------|
| `bitbucket-pipelines.yml` | File di configurazione nella root del repository |
| `Container Docker` | Ogni step viene eseguito nel proprio container |
| `Trigger` | Push, PR, tag, pianificazione o manuale |
| `Build minutes` | Quota dipende dal piano |

### Abilitare le Pipeline

```
# Impostazioni Repository → Pipeline → Abilita
# Aggiungere bitbucket-pipelines.yml alla root del repo
# Il primo push attiva la pipeline
```

## bitbucket-pipelines.yml

### Configurazione Minimale

```
image: node:20
pipelines:
  default:
    - step:
        script:
          - npm install
          - npm test
```

### Pipeline Specifiche per Branch

```
pipelines:
  branches:
    main:
      - step:
          script:
            - npm run build
            - npm run deploy
```

### Pipeline per Tag e Pull Request

```
pipelines:
  tags:
    'v*':
      - step:
          script:
            - npm run release
  pull-requests:
    '**':
      - step:
          script:
            - npm test
```

## Step

### Opzioni Step

| Command | Description |
|---------|-------------|
| `name` | Nome visualizzato dello step |
| `image` | Override immagine Docker globale |
| `script` | Lista di comandi shell da eseguire |
| `size` | 1x (4GB) o 2x (8GB) di memoria |
| `max-time` | Timeout in minuti (default 120) |
| `trigger` | manual per step solo manuali |

### Step Paralleli

```
- parallel:
    - step:
        name: "Lint"
        script:
          - npm run lint
    - step:
        name: "Test"
        script:
          - npm test
```

### Step Manuale

```
- step:
    name: "Deploy in Produzione"
    trigger: manual
    script:
      - ./deploy.sh prod
```

## Variabili

### Tipi di Variabili

| Command | Description |
|---------|-------------|
| `Variabili repository` | Impostazioni → Pipeline → Variabili |
| `Variabili deployment` | Scoped a un ambiente di deployment |
| `Variabili protette` | Cifrate, mascherate nei log |
| `Variabili pipeline` | Definite inline nello YAML |

### Usare le Variabili

```
pipelines:
  default:
    - step:
        script:
          - echo $MY_VAR
          - docker login -u $DOCKER_USER -p $DOCKER_PASS
```

### Variabili Predefinite

| Command | Description |
|---------|-------------|
| `$BITBUCKET_COMMIT` | SHA completo del commit |
| `$BITBUCKET_BRANCH` | Nome del branch |
| `$BITBUCKET_TAG` | Nome del tag (pipeline tag) |
| `$BITBUCKET_BUILD_NUMBER` | Numero build incrementale |
| `$BITBUCKET_REPO_SLUG` | Slug del repository |

## Caching

### Cache Predefinite

```
- step:
    caches:
      - node        # ~/.npm
      - pip         # ~/.cache/pip
      - docker      # cache layer Docker
    script:
      - npm install
      - npm test
```

### Cache Personalizzata

```
definitions:
  caches:
    gradle: ~/.gradle/caches
    mylibs: vendor/libs
pipelines:
  default:
    - step:
        caches:
          - gradle
        script:
          - ./gradlew build
```

### Comportamento della Cache

| Command | Description |
|---------|-------------|
| `Durata` | Le cache scadono dopo 7 giorni |
| `Scope` | Condivisa tra tutte le pipeline del repo |
| `Elimina` | Pipeline → Cache → Elimina |

## Artifact

### Passare File tra Step

```
- step:
    name: "Build"
    script:
      - npm run build
    artifacts:
      - dist/**
- step:
    name: "Deploy"
    script:
      - ls dist/    # artifact disponibili
      - ./deploy.sh
```

### Opzioni Artifact

| Command | Description |
|---------|-------------|
| `artifacts` | Pattern glob per i file da passare |
| `Download` | Disponibili automaticamente negli step successivi |
| `Dimensione max` | 1 GB per step |
| `Conservazione` | Disponibili per 14 giorni dopo la build |

## Deployment

### Ambienti di Deployment

```
- step:
    name: "Deploy Staging"
    deployment: staging
    script:
      - ./deploy.sh staging
- step:
    name: "Deploy Produzione"
    deployment: production
    trigger: manual
    script:
      - ./deploy.sh prod
```

### Tipi di Ambiente

| Command | Description |
|---------|-------------|
| `test` | Ambiente di test |
| `staging` | Ambiente pre-produzione |
| `production` | Ambiente live, monitorato nella dashboard |

## Pattern Comuni

### Build e Push Docker

```
- step:
    services:
      - docker
    script:
      - docker build -t myapp:$BITBUCKET_COMMIT .
      - docker login -u $DOCKER_USER -p $DOCKER_PASS
      - docker push myapp:$BITBUCKET_COMMIT
```

### Container di Servizio

```
definitions:
  services:
    postgres:
      image: postgres:16
      variables:
        POSTGRES_DB: testdb
        POSTGRES_PASSWORD: secret
pipelines:
  default:
    - step:
        services:
          - postgres
        script:
          - npm test
```

### Step Condizionale con Pipe

```
- step:
    name: "Deploy su S3"
    script:
      - pipe: atlassian/aws-s3-deploy:1.1.0
        variables:
          AWS_ACCESS_KEY_ID: $AWS_KEY
          AWS_SECRET_ACCESS_KEY: $AWS_SECRET
          S3_BUCKET: my-bucket
          LOCAL_PATH: dist/
```
