Eines Principals del Mercat
3. Eines Principals del Mercat
3.1 Jenkins
Versió: Jenkins 2.440.x (LTS estable a gener 2025)
Tipus: Self-hosted, open source
Llenguatge: Java
URL: https://www.jenkins.io/
Característiques: - Una de les eines més antigues i establertes (2011) - Altament extensible amb més de 1.800 plugins - Suporta pipelines com a codi (Jenkinsfile) - Requereix infraestructura pròpia (servidor dedicat) - Gran comunitat i documentació
Casos d'ús ideals: - Organitzacions que necessiten control total - Entorns amb requisits de seguretat estrictes (on-premises) - Pipelines molt complexos i personalitzats
Exemple de Jenkinsfile:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Deploy') {
steps {
sh './deploy.sh'
}
}
}
}
Referències: - Documentació oficial: https://www.jenkins.io/doc/ - Pipeline Syntax: https://www.jenkins.io/doc/book/pipeline/syntax/
3.2 GitLab CI/CD
Versió: GitLab 16.x (Community i Enterprise)
Tipus: Integrat amb GitLab, self-hosted o cloud
Format: YAML (.gitlab-ci.yml)
URL: https://docs.gitlab.com/ee/ci/
Característiques: - Integració nativa amb Git (mateix producte) - No requereix configuració externa si uses GitLab - Runners que executen els jobs (shared o self-hosted) - Auto DevOps: configuració automàtica per projectes estàndard - Container Registry integrat
Casos d'ús ideals: - Equips que ja usen GitLab com a repositori - Necessitat d'integració completa DevOps en una sola plataforma - Projectes que usen Docker intensivament
Exemple de .gitlab-ci.yml:
stages:
- build
- test
- deploy
variables:
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"
build-job:
stage: build
image: maven:3.9-openjdk-17
script:
- mvn clean package
artifacts:
paths:
- target/*.jar
expire_in: 1 week
test-job:
stage: test
image: maven:3.9-openjdk-17
script:
- mvn test
coverage: '/Total.*?([0-9]{1,3})%/'
deploy-production:
stage: deploy
script:
- echo "Deploying to production server"
- scp target/*.jar user@production-server:/app/
only:
- main
when: manual
Referències: - Documentació CI/CD: https://docs.gitlab.com/ee/ci/ - Examples: https://docs.gitlab.com/ee/ci/examples/
3.3 GitHub Actions
Versió: En constant evolució (servei cloud)
Tipus: Cloud-native, integrat amb GitHub
Format: YAML (.github/workflows/)
URL: https://docs.github.com/en/actions
Característiques: - Integració perfecta amb GitHub - Marketplace amb milers d'accions reutilitzables - Minuts gratuïts en plans públics i privats - Matrix builds per provar múltiples versions - Secrets management integrat
Casos d'ús ideals: - Projectes open source a GitHub - Equips petits que no volen gestionar infraestructura - Necessitat d'accions comunitàries predefinides
Exemple de workflow (.github/workflows/ci.yml):
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Cache Maven packages
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
- name: Build with Maven
run: mvn clean package
- name: Run tests
run: mvn test
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: application
path: target/*.jar
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Download artifact
uses: actions/download-artifact@v3
with:
name: application
- name: Deploy to production
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
run: |
echo "Deploying to production..."
# Your deployment script here
Referències: - Documentació: https://docs.github.com/en/actions - Marketplace: https://github.com/marketplace?type=actions
3.4 CircleCI
Versió: CircleCI Cloud (servei gestionat)
Tipus: Cloud o self-hosted
Format: YAML (.circleci/config.yml)
URL: https://circleci.com/docs/
Característiques: - Configuració basada en Docker - Orbs (paquets reutilitzables de configuració) - Execució paral·lela de tests - Insights i analytics avançats - Integració amb AWS, Azure, GCP
Casos d'ús ideals: - Aplicacions containeritzades - Necessitat d'executar molts tests en paral·lel - Equips que busquen velocitat d'execució
Exemple de config.yml:
version: 2.1
orbs:
node: circleci/node@5.1.0
jobs:
build-and-test:
docker:
- image: cimg/node:18.19
steps:
- checkout
- node/install-packages:
pkg-manager: npm
- run:
name: Run tests
command: npm test
- run:
name: Build application
command: npm run build
- persist_to_workspace:
root: .
paths:
- dist
deploy:
docker:
- image: cimg/node:18.19
steps:
- attach_workspace:
at: .
- run:
name: Deploy to production
command: |
npm run deploy
workflows:
build-test-deploy:
jobs:
- build-and-test
- deploy:
requires:
- build-and-test
filters:
branches:
only: main
Referències: - Documentació: https://circleci.com/docs/ - Orbs Registry: https://circleci.com/developer/orbs
3.5 Azure DevOps Pipelines
Versió: Azure DevOps Services (cloud)
Tipus: Cloud o self-hosted (Azure DevOps Server)
Format: YAML (azure-pipelines.yml)
URL: https://learn.microsoft.com/azure/devops/pipelines/
Característiques: - Integració profunda amb ecosistema Microsoft - Suport per aplicacions .NET, Java, Python, Node.js - Agents de build (Microsoft-hosted o self-hosted) - Gestió de releases amb aprovacions - Integració amb Azure Cloud
Casos d'ús ideals: - Organitzacions amb stack Microsoft - Aplicacions .NET - Empreses que usen Azure
Exemple de azure-pipelines.yml:
trigger:
branches:
include:
- main
- develop
pool:
vmImage: 'ubuntu-latest'
variables:
buildConfiguration: 'Release'
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- task: UseDotNet@2
inputs:
version: '8.x'
- task: DotNetCoreCLI@2
displayName: 'Restore packages'
inputs:
command: 'restore'
- task: DotNetCoreCLI@2
displayName: 'Build project'
inputs:
command: 'build'
arguments: '--configuration $(buildConfiguration)'
- task: DotNetCoreCLI@2
displayName: 'Run tests'
inputs:
command: 'test'
arguments: '--configuration $(buildConfiguration)'
- stage: Deploy
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: DeployWeb
environment: 'production'
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs:
azureSubscription: 'MyAzureSubscription'
appName: 'my-web-app'
package: '$(Pipeline.Workspace)/**/*.zip'
Referències: - Documentació: https://learn.microsoft.com/azure/devops/pipelines/ - YAML Schema: https://learn.microsoft.com/azure/devops/pipelines/yaml-schema/
3.6 Comparativa d'Eines
| Característica | Jenkins | GitLab CI | GitHub Actions | CircleCI | Azure DevOps |
|---|---|---|---|---|---|
| Cost | Gratuït (infra pròpia) | Gratuït/Premium | Gratuït amb límits | Gratuït amb límits | Gratuït amb límits |
| Hosting | Self-hosted | Cloud/Self-hosted | Cloud | Cloud/Self-hosted | Cloud/Self-hosted |
| Corba d'aprenentatge | Alta | Mitjana | Baixa | Baixa | Mitjana |
| Flexibilitat | Molt alta | Alta | Alta | Mitjana-Alta | Alta |
| Ecosistema | Plugins | Integrat GitLab | GitHub Marketplace | Orbs | Azure Services |
| Millor per a | Empreses grans | Equips GitLab | Projectes GitHub | Apps containeritzades | Stack Microsoft |