⚙️ CircleCI — CI/CD “config.yml”, Workflows, Orbs, Runners
CircleCI est une plateforme CI/CD orientée pipelines as code via .circleci/config.yml (version 2.1), orchestrée par workflows, enrichie par Orbs (packages de config réutilisables) et exécutée sur compute cloud ou self-hosted runners. :contentReference[oaicite:1]{index=1}
Vue d’ensemble
CircleCI en 2026 : philosophie, forces, cas d’usage, modèle credits, cloud vs runners.
CI/CDCloudPipelinesArchitecture & concepts
Jobs, steps, workflows, contexts, workspaces, caching, artifacts, approvals.
WorkflowsContextsCaching.circleci/config.yml
Structure YAML 2.1, executors (docker/machine/macOS), filters, parameters, matrix.
YAML2.1ExecutorsWorkflows
Orchestration: dépendances entre jobs, fan-out/fan-in, approvals, branches/tags.
OrchestrateApprovalsFiltersOrbs
Packages réutilisables de config: commands/jobs/executors. Registry & orbs privés.
ReuseRegistryDRYSelf-hosted Runners
Exécuter les jobs on-prem / VPC / arch spécifique, resource classes, contrôle OS.
RunnerOn-premResource classCaches / Workspaces / Artifacts
Accélération CI: caches (deps), workspaces (handoff), artifacts (outputs).
SpeedArtifactsWorkspacesSécurité & secrets
Contexts, env vars, least privilege, tokens, isolation, runner network, audit.
ContextsSecretsIsolationPerf & coûts (Credits)
Comprendre le modèle credits: coût = classe machine × minutes; stratégies d’optimisation.
CreditsFinOpsParallelBonnes pratiques
DRY via orbs/commands, pipelines rapides vs full, gating, immutabilité artefacts, rollback.
Best practicesDRYGatesMigration
Mapping Jenkins/Bamboo → CircleCI, stratégie progressive, check-list, pièges.
MigrationCI/CDChecklistLiens & docs
Docs officielles : pipelines, config intro + reference, orbs, runners, pricing/credits.
DocsPricingReferenceCheat-sheet
Résumé ultra opérationnel + phrase “CV-ready”.
TL;DRCVOpsCircleCI en 30 secondes
CircleCI exécute tes builds/tests/deploy à partir d’un fichier .circleci/config.yml. Tu définis des jobs (étapes), tu les orchestras via des workflows, et tu factorises via des Orbs (packages de config réutilisables). :contentReference[oaicite:2]{index=2}
Catégorisation IDEO-Lab
Cloud compute + self-hosted runners
- Cloud : Docker / VM / macOS (selon options), rapide à démarrer.
- Self-hosted runners : exécuter dans ton VPC / on-prem, avec accès réseau privé & contrôle OS. :contentReference[oaicite:3]{index=3}
- Resource classes : router certains jobs vers des capacités spécifiques (Linux/macOS/etc.). :contentReference[oaicite:4]{index=4}
Repo push/PR
-> pipeline (config.yml)
-> workflows
-> jobs
-> executor (docker/machine/runner)
-> artifacts / caches / workspaces
Diagramme CI/CD simple (build → test → deploy)
workflows:
build_test_deploy:
jobs:
- lint
- unit_tests:
requires: [lint]
- build_image:
requires: [unit_tests]
- deploy_staging:
requires: [build_image]
- hold_prod:
type: approval
requires: [deploy_staging]
- deploy_prod:
requires: [hold_prod]
✅ Très pertinent si…
- Tu veux du CI/CD robuste “as code” avec workflows clairs.
- Tu veux un catalogue de building blocks (Orbs) pour standardiser les pipelines. :contentReference[oaicite:5]{index=5}
- Tu as besoin de runners self-hosted (réseau privé / compliance / arch atypique). :contentReference[oaicite:6]{index=6}
- Tu veux optimiser coût/temps via classes machines + parallélisme.
⚠️ Points d’attention
- La discipline “config as code” est essentielle : conventions, factorisation (commands/orbs).
- Gérer les secrets proprement (contexts, env vars, least privilege).
- FinOps: mesurer durée, queue time, cache hit, et ajuster la classe machine.
Modèle “Credits” (lecture rapide)
Le coût est généralement lié à la consommation de compute (classe machine × durée). CircleCI documente l’usage des credits et la vente en packs. :contentReference[oaicite:7]{index=7}
Modèle mental
config.yml (2.1)
- executors: docker/machine/macOS/runner
- commands: mini-steps réutilisables
- jobs: suites de steps
- workflows: orchestration jobs (requires, filters, approval)
Workflows = orchestration
- Fan-out (jobs parallèles) puis fan-in (agrégation).
- Filtres branches/tags pour éviter les builds inutiles.
- Approval step pour PROD / release.
Caches / Workspaces / Artifacts : ne pas confondre
| Mécanisme | But | Exemple | Risque |
|---|---|---|---|
| Cache | accélérer | pip/npm/maven | cache “sale” si clé mal conçue |
| Workspace | handoff jobs | build → test → package | gros workspace = lent |
| Artifacts | outputs | logs, reports, packages | retenue/stockage |
Contexts : secrets “réutilisables” et gouvernance
Pattern:
- Context "org-prod" (secrets prod)
- Context "org-staging"
- Context "org-ci" (tokens read-only)
Attach contexts only to workflows/jobs that need them.
- Principe de moindre privilège (least privilege).
- Rotation des secrets + audit des usages.
- Éviter “secrets dans repo” (toujours via env vars/contexts).
Gates & approvals
- job: hold_prod
type: approval
requires:
- deploy_staging
Structure minimale (2.1)
version: 2.1
jobs:
build:
docker:
- image: cimg/python:3.12
steps:
- checkout
- run: python --version
workflows:
main:
jobs:
- build
Executors (lecture rapide)
| Executor | Quand | Notes |
|---|---|---|
| docker | web apps / tests | rapide, reproductible |
| machine | Docker-in-Docker / besoins VM | accès OS plus complet |
| macOS | iOS/mac builds | spécifique mobile |
| runner (self-hosted) | VPC/on-prem | contrôle + réseau privé :contentReference[oaicite:10]{index=10} |
Pipeline parameters (config “dynamique”)
version: 2.1
parameters:
image-tag:
type: string
default: "current"
jobs:
build:
docker:
- image: myorg/app:<< pipeline.parameters.image-tag >>
steps: [checkout]
workflows:
main:
jobs: [build]
Exemple Django (lint + tests + reports)
version: 2.1
jobs:
test:
docker:
- image: cimg/python:3.12
steps:
- checkout
- run:
name: Install deps
command: |
python -m venv venv
. venv/bin/activate
pip install -r requirements.txt
- run:
name: Lint + tests
command: |
. venv/bin/activate
ruff check .
pytest -q --maxfail=1
workflows:
ci:
jobs:
- test
Fan-out / fan-in
workflows:
build_test:
jobs:
- lint
- unit_tests
- integration_tests
- package:
requires: [lint, unit_tests, integration_tests]
Filters (branches/tags) — éviter les builds inutiles
workflows:
ci:
jobs:
- unit_tests:
filters:
branches:
ignore: /release.*/
- deploy_prod:
filters:
tags:
only: /^v.*/
branches:
ignore: /.*/
Approval step = gate humain
- hold_prod:
type: approval
requires:
- deploy_staging
- deploy_prod:
requires:
- hold_prod
Orbs = “packages de configuration”
Un orb est un package réutilisable (commands/jobs/executors) pour ne pas répéter la même configuration dans chaque repo. :contentReference[oaicite:13]{index=13}
Importer un orb
version: 2.1
orbs:
node: circleci/node@x.y.z
jobs:
build:
docker:
- image: cimg/base:stable
steps:
- checkout
- node/install
- run: node --version
Créer / publier un orb (pattern)
Approche:
- créer des commands réutilisables (setup, build, test, deploy)
- versionner (semver)
- publier dans registry (public/privé)
Pourquoi utiliser des runners ?
- Exécution dans un environnement que CircleCI ne fournit pas en compute cloud (arch/OS spécifiques). :contentReference[oaicite:16]{index=16}
- Accès réseau privé (DB interne, registry privé, VPC, proxy d’entreprise).
- Contrôle de l’OS + monitoring + IAM (ex : AWS IAM si runner dans AWS). :contentReference[oaicite:17]{index=17}
Resource classes = “router” les jobs
# Exemple concept
jobs:
build_linux_private:
resource_class: orgname/linux
steps: ...
build_macos_private:
resource_class: orgname/macOS
steps: ...
Best practices runners
- Pool dédié “prod deploy” isolé (réseau + secrets + permissions).
- Golden image + patching + rotation (sécurité).
- Observabilité : logs + métriques machine + queue time.
- Caches/workspaces/artifacts compatibles (FAQ runners). :contentReference[oaicite:19]{index=19}
Stratégie “fast feedback”
1) Cache deps (pip/npm/maven)
2) Split jobs (lint / unit / integration) + parallélisme
3) Workspaces: passer uniquement le nécessaire (pas tout le repo)
4) Artifacts: garder reports (junit/coverage) et packages
Règles d’or
✅ Contexts dédiés (prod/staging/ci)
✅ Secrets jamais dans repo
✅ Tokens à privilèges minimaux
✅ Runners isolés réseau + IAM (si VPC/on-prem)
✅ Artefacts immuables + approvals PROD
Lecture du pricing
CircleCI décrit les credits (packs, coût compute) et présente un pricing page “plans”. :contentReference[oaicite:20]{index=20}
KPIs indispensables
| KPI | Symptôme | Action |
|---|---|---|
| Queue time | saturation | augmenter parallélisme / runners / class |
| Duration | feedback lent | cache + split jobs + tests shards |
| Cache hit | deps re-download | clé cache basée lockfile |
| Flaky rate | instabilité | isolation, retry ciblé, timeouts |
Quick wins (80/20)
- Pipeline PR “fast” (lint + unit) ; pipeline nightly “full”.
- Paralléliser tests (sharding).
- Cache deps + Docker layers (selon executor).
- Workspaces minimaux (uniquement build outputs).
Top 10 pratiques pro
- DRY : factoriser via commands et orbs. :contentReference[oaicite:21]{index=21}
- Workflows explicites + requires (lisibles).
- PR fast pipeline + nightly full pipeline.
- Caching correct (clé = lockfile hash).
- Workspaces minimalistes.
- Artefacts immuables (build once deploy many).
- Approvals en prod (release gating).
- Secrets via contexts + least privilege.
- Runners isolés pour déploiements sensibles. :contentReference[oaicite:22]{index=22}
- Mesure coût/temps (credits) + optimisation continue. :contentReference[oaicite:23]{index=23}
Une ligne CV-ready
Industrialisation CI/CD sur CircleCI : pipelines as code (.circleci/config.yml), workflows multi-jobs,
standardisation via Orbs, accélération (cache/workspaces), et exécution hybride cloud + self-hosted runners,
avec gates/approvals pour releases PROD et gestion sécurisée des secrets via contexts.
Mapping conceptuel
| Jenkins | Bamboo | CircleCI | Notes |
|---|---|---|---|
| Jenkinsfile | Plan | config.yml | YAML, version 2.1 :contentReference[oaicite:24]{index=24} |
| Stages | Stages | Workflows + jobs | requires, fan-out/fan-in |
| Agents/Nodes | Agents | Executors / Runners | cloud compute ou self-hosted :contentReference[oaicite:25]{index=25} |
| Shared libs | Specs partagées | Orbs / commands | DRY + standardisation :contentReference[oaicite:26]{index=26} |
| Credentials | Variables globales | Contexts + env vars | least privilege |
Stratégie safe (progressive)
- Pilote sur 1–2 repos (non critiques) → reproduire CI “à l’identique”.
- Standardiser très tôt : commands/orbs, conventions (noms jobs, caches).
- Activer caches + parallélisme + metrics (queue time, duration).
- Basculer progressivement : triggers, équipes, environnements.
- Isoler déploiements sensibles sur runners dédiés (VPC/on-prem).
Pièges fréquents
- Cache mal conçu → builds non reproductibles / bugs fantômes.
- Workspaces trop volumineux → pipelines lents.
- Secrets trop “larges” (contexts) → risque majeur.
- Absence d’artefacts immuables → déploiements inconsistants.
Checklist
| Item | OK ? | Notes |
|---|---|---|
| Conventions config.yml + commands/orbs | ⬜ | |
| Caches (clé lockfile) + workspaces minimaux | ⬜ | |
| Contexts secrets least privilege | ⬜ | |
| Approvals pour releases PROD | ⬜ | |
| Runners dédiés prod (isolation) | ⬜ | |
| KPI: queue time, duration, flaky rate, cache hit | ⬜ |
Docs (CircleCI)
- Pipelines overview
- Config intro (getting started)
- Configuration reference
- Orbs overview
- Self-hosted runner overview
- Pricing
- Credits (how it works)
TL;DR
CircleCI = CI/CD via .circleci/config.yml (2.1)
- jobs + steps
- workflows (requires, filters, approvals)
- Orbs (réutilisation/standardisation)
- Executors (docker/machine/macOS) + self-hosted runners
- Perf: cache / workspaces / artifacts
- FinOps: credits = compute classe x minutes
