Aller au contenu

Aide-mémoire CircleCI

Aide-mémoire CircleCI

Installation

PlateformeCommande
Linux (curl)`curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh \
Linux (snap)sudo snap install circleci
macOS (Homebrew)brew install circleci
macOS (curl)`curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh \
Windows (Chocolatey)choco install circleci-cli
Windows (Scoop)scoop install circleci
Verify Installationcircleci version
Initial Setupcircleci setup
Update CLIcircleci update

Commandes de base

CommandeDescription
circleci config validateValidate your .circleci/config.yml file
circleci config validate -c path/to/config.ymlValider un fichier de configuration spécifique
circleci config process .circleci/config.ymlTraiter et développer la configuration (résoudre les orbs)
circleci local executeExécuter un job localement à l’aide de Docker
circleci local execute --job job-nameExécuter un travail spécifique localement
circleci followLister tous les projets suivis
circleci follow github/org/repoSuivre un projet spécifique
circleci project info github/org/repoObtenir les informations du projet
circleci pipeline run github/org/repoDéclencher un nouveau pipeline
circleci pipeline run github/org/repo --branch developDéclencher le pipeline sur une branche spécifique
circleci pipeline list github/org/repoLister les pipelines récents pour un projet
circleci pipeline get <pipeline-id>Obtenir les détails d’un pipeline spécifique
circleci build list github/org/repoLister les builds récents d’un projet
circleci build get <build-number>Obtenir des informations sur un build spécifique
circleci build cancel <build-number>Annuler un build en cours

Utilisation avancée

CommandeDescription
circleci pipeline run github/org/repo --parameters '{"key":"value"}'Déclencher le pipeline avec des paramètres
circleci local execute --env VAR1=value1 --env VAR2=value2Exécuter localement avec des variables d’environnement
circleci context list github org-nameLister tous les contextes pour une organisation
circleci context create github org-name context-nameCréer un nouveau contexte
circleci context show github org-name context-nameAfficher les détails du contexte
circleci context delete github org-name context-nameSupprimer un contexte
circleci context env-var list github org-name context-nameLister les variables d’environnement dans un contexte
circleci context env-var store github org-name context-name VAR_NAMEStocker la variable d’environnement dans le contexte
circleci orb listLister tous les orbs publics disponibles
circleci orb search <query>Rechercher des orbs par mot-clé
circleci orb info namespace/orb@versionObtenez des informations détaillées sur un orb
circleci orb source namespace/orb@versionAfficher le code source d’un orb
circleci orb create namespace/orbCréer un nouvel orb
circleci orb publish path/to/orb.yml namespace/orb@dev:firstPublier la version de développement d’un orb
circleci orb publish promote namespace/orb@dev:first patchPromouvoir orb en production (version de patch)
circleci orb validate path/to/orb.ymlValider une configuration d’orb
circleci api graphql-query --query '{ me { id name } }'Exécuter une requête d’API GraphQL
circleci api get /meEffectuer une requête GET sur l’API REST
circleci diagnosticExécuter des vérifications de diagnostic sur la configuration CLI
circleci config pack src/ > orb.ymlRegrouper les fichiers source orb dans un seul fichier YAML

Configuration

Structure de base du fichier de configuration

Le fichier de configuration CircleCI est situé à .circleci/config.ymlà la racine de votre dépôt.

version: 2.1

# Define reusable execution environments
executors:
  node-executor:
    docker:
      - image: cimg/node:18.16
    resource_class: medium
    working_directory: ~/project

# Define reusable command sequences
commands:
  install-deps:
    steps:
      - restore_cache:
          keys:
            - v1-deps-{{ checksum "package-lock.json" }}
      - run: npm ci
      - save_cache:
          key: v1-deps-{{ checksum "package-lock.json" }}
          paths:
            - node_modules

# Define jobs
jobs:
  build:
    executor: node-executor
    steps:
      - checkout
      - install-deps
      - run: npm run build
      - persist_to_workspace:
          root: .
          paths:
            - dist

  test:
    executor: node-executor
    steps:
      - checkout
      - install-deps
      - run: npm test
      - store_test_results:
          path: test-results

# Define workflows
workflows:
  build-and-test:
    jobs:
      - build
      - test:
          requires:
            - build

Configuration de l’exécuteur Docker

jobs:
  build:
    docker:
      - image: cimg/python:3.11
        auth:
          username: $DOCKERHUB_USERNAME
          password: $DOCKERHUB_PASSWORD
        environment:
          FLASK_ENV: development
      - image: cimg/postgres:14.0
        environment:
          POSTGRES_USER: testuser
          POSTGRES_DB: testdb
    resource_class: large
    steps:
      - checkout
      - run: python app.py

Configuration de l’exécuteur Machine

jobs:
  build:
    machine:
      image: ubuntu-2204:2023.04.2
      docker_layer_caching: true
    resource_class: large
    steps:
      - checkout
      - run: docker build -t myapp .

Utilisation des Orbs

version: 2.1

orbs:
  node: circleci/node@5.1.0
  aws-cli: circleci/aws-cli@3.1.0
  slack: circleci/slack@4.12.0

jobs:
  deploy:
    executor: node/default
    steps:
      - checkout
      - node/install-packages
      - aws-cli/setup
      - run: npm run deploy
      - slack/notify:
          event: pass
          template: success_tagged_deploy_1

Filtres de workflow et planification

workflows:
  version: 2
  build-deploy:
    jobs:
      - build
      - test:
          requires:
            - build
      - deploy:
          requires:
            - test
          filters:
            branches:
              only:
                - main
                - /release\/.*/
            tags:
              only: /^v.*/
  
  nightly:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only: main
    jobs:
      - test

Parallélisme et répartition des tests

jobs:
  test:
    docker:
      - image: cimg/node:18.16
    parallelism: 4
    steps:
      - checkout
      - run: npm ci
      - run:
          name: Run Tests
          command: |
            TESTFILES=$(circleci tests glob "tests/**/*.test.js" | \
                        circleci tests split --split-by=timings)
            npm test $TESTFILES
      - store_test_results:
          path: test-results

Classes de ressources

jobs:
  small-job:
    docker:
      - image: cimg/base:stable
    resource_class: small  # 1 vCPU, 2GB RAM
  
  large-job:
    docker:
      - image: cimg/base:stable
    resource_class: large  # 4 vCPU, 8GB RAM
  
  xlarge-job:
    docker:
      - image: cimg/base:stable
    resource_class: xlarge  # 8 vCPU, 16GB RAM

Cas d’utilisation courants

Cas d’utilisation 1 : Pipeline d’application Node.js multi-étapes

version: 2.1

orbs:
  node: circleci/node@5.1.0

jobs:
  build:
    executor: node/default
    steps:
      - checkout
      - node/install-packages:
          pkg-manager: npm
      - run:
          name: Build Application
          command: npm run build
      - persist_to_workspace:
          root: .
          paths:
            - dist
            - node_modules

  test:
    executor: node/default
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Run Unit Tests
          command: npm test
      - store_test_results:
          path: test-results

  deploy-staging:
    executor: node/default
    steps:
      - attach_workspace:
          at: .
      - run:
          name: Deploy to Staging
          command: npm run deploy:staging

workflows:
  build-test-deploy:
    jobs:
      - build
      - test:
          requires:
            - build
      - deploy-staging:
          requires:
            - test
          filters:
            branches:
              only: develop

Cas d’utilisation 2 : Construction et envoi d’image Docker

version: 2.1

orbs:
  docker: circleci/docker@2.2.0

jobs:
  build-and-push:
    executor: docker/docker
    steps:
      - setup_remote_docker:
          docker_layer_caching: true
      - checkout
      - docker/check
      - docker/build:
          image: myorg/myapp
          tag: ${CIRCLE_SHA1},latest
      - docker/push:
          image: myorg/myapp
          tag: ${CIRCLE_SHA1},latest

workflows:
  build-deploy:
    jobs:
      - build-and-push:
          context: docker-hub-creds
          filters:
            branches:
              only: main

Cas d’utilisation 3 : Tests parallèles avec répartition des tests

version: 2.1

jobs:
  test:
    docker:
      - image: cimg/python:3.11
    parallelism: 8
    steps:
      - checkout
      - run: pip install -r requirements.txt
      - run:
          name: Run Tests in Parallel
          command: |
            TESTFILES=$(circleci tests glob "tests/**/test_*.py" | \
                        circleci tests split --split-by=timings)
            pytest $TESTFILES \
              --junitxml=test-results/junit.xml \
              --cov=app \
              --cov-report=html
      - store_test_results:
          path: test-results
      - store_artifacts:
          path: htmlcov

workflows:
  test:
    jobs:
      - test

Cas d’utilisation 4 : Workflow conditionnel avec paramètres

version: 2.1

parameters:
  run-integration-tests:
    type: boolean
    default: false
  deployment-environment:
    type: string
    default: "staging"

jobs:
  unit-test:
    docker:
      - image: cimg/node:18.16
    steps:
      - checkout
      - run: npm ci
      - run: npm run test:unit

  integration-test:
    docker:
      - image: cimg/node:18.16
    steps:
      - checkout
      - run: npm ci
      - run: npm run test:integration

  deploy:
    docker:
      - image: cimg/node:18.16
    parameters:
      environment:
        type: string
    steps:
      - checkout
      - run: npm ci
      - run: npm run deploy:<< parameters.environment >>

workflows:
  test-and-deploy:
    jobs:
      - unit-test
      - integration-test:
          when: << pipeline.parameters.run-integration-tests >>
      - deploy:
          environment: << pipeline.parameters.deployment-environment >>
          requires:
            - unit-test
          filters:
            branches:
              only: main

Cas d’utilisation 5 : Monorepo avec filtrage de chemin

version: 2.1

setup: true

orbs:
  path-filtering: circleci/path-filtering@0.1.3

workflows:
  setup-workflow:
    jobs:
      - path-filtering/filter:
          base-revision: main
          config-path: .circleci/continue-config.yml
          mapping: |
            services/api/.* api-build true
            services/web/.* web-build true
            packages/.* all-build true

continue-config.yml :

version: 2.1

parameters:
  api-build:
    type: boolean
    default: false
  web-build:
    type: boolean
    default: false
  all-build:
    type: boolean
    default: false

jobs:
  build-api:
    docker:
      - image: cimg/node:18.16
    steps:
      - checkout
      - run: cd services/api && npm ci && npm run build

  build-web:
    docker:
      - image: cimg/node:18.16
    steps:
      - checkout
      - run: cd services/web && npm ci && npm run build

workflows:
  api-workflow:
    when: << pipeline.parameters.api-build >>
    jobs:
      - build-api

  web-workflow:
    when: << pipeline.parameters.web-build >>
    jobs:
      - build-web

Meilleures pratiques

  • Utiliser des Orbs pour les tâches courantes : Exploitez les orbs CircleCI pour des intégrations standardisées (AWS, Docker, Slack) afin de réduire la complexité de configuration et la charge de maintenance.

  • Implémenter le cache de manière stratégique : Mettez en cache les dépendances à l’aide de clés basées sur la somme de contrôle ({{ checksum "package-lock.json" }}) pour accélérer les builds tout en garantissant l’invalidation du cache lorsque les dépendances changent.

  • Optimiser les classes de ressources : Choisissez des classes de ressources appropriées pour chaque tâche ; utilisez des instances plus petites pour les tâches simples et réservez des instances plus grandes pour les opérations nécessitant beaucoup de calcul comme la compilation ou les tests complexes.

  • Activer le cache de couches Docker : Pour les tâches qui construisent des images Docker, activez

Note: Some sections (3-19) were left untranslated as no specific text was provided in the original input.docker_layer_caching: truepour réduire significativement les temps de construction en réutilisant les couches inchangées. circleci tests splitDiviser les Tests pour une Exécution Parallèle : Utiliser --split-by=timingspour distribuer les tests sur des conteneurs parallèles en fonction des temps d’exécution historiques, maximisant l’efficacité. persist_to_workspacepour conserver les artefacts de construction attach_workspaceau lieu de reconstruire dans les tâches suivantes, économisant du temps et garantissant la cohérence. circleci config validatepour exécuter des validations de configuration circleci local executeavant de pousser pour détecter les erreurs de syntaxe et les problèmes de configuration dès le début.

ProblèmeSolution
”Config file not found” errorEnsure .circleci/config.yml exists in repository root. Run circleci config validate to check file location and syntax.
Local execution fails with Docker errorsVerify Docker is running: docker ps. Ensure the CLI has access to Docker socket. On Linux, add user to docker group: sudo usermod -aG docker $USER.
”Invalid configuration” during validationRun circleci config process .circleci/config.yml to see expanded config and identify syntax errors. Check YAML indentation (use spaces, not tabs).
Jobs not triggering on pushVerify project is followed: circleci follow github/org/repo. Check workflow filters aren’t excluding your branch. Ensure webhook is configured in VCS settings.
Workspace attachment failsEnsure persist_to_workspace in upstream job completes successfully. Verify root and paths match between persist and attach. Check job dependencies in workflow.
Cache not restoringVerify cache key matches between save_cache and restore_cache. Use fallback keys: keys: [v1-{{ checksum "file" }}, v1-]. Check cache hasn’t expired (30 days).
Authentication errors with CLIRe-run circleci setup with a valid API token. Generate new token at https://app.circleci.com/settings/user/tokens. Verify token has correct permissions.
Parallel test splitting not workingEnsure test results are stored with store_test_results. Use glob patterns that match your test files. Verify parallelism is set greater than 1.
Out of memory errorsIncrease resource_class to large or xlarge. Optimize memory-intensive operations. Check for memory leaks in application code.
Context environment variables not availableVerify job uses correct context in workflow: context: context-name. Check user has access to context in organization settings. Ensure variable names don’t conflict.
Orb import failsVerify orb exists: circleci orb info namespace/orb@version. Check version is valid. For private orbs, ensure organization has access and use --org-id flag.
- run: circleci-agent step haltdans la configuration à l’endroit où vous voulez faire une pause. Réexécuter la tâche avec SSH activé. Utiliser la commande SSH fournie dans les 10 minutes avant l’expiration.
  • Implémenter des Filtres de Workflow : Utiliser des filtres de branches et de tags pour contrôler quand les tâches s’exécutent, empêchant les déploiements inutiles et économisant des crédits tout en maintenant la sécurité.

  • Stocker les Secrets dans des Contextes : Gérer les informations d’identification sensibles dans les contextes CircleCI plutôt que dans les variables d’environnement du projet pour une meilleure sécurité, un meilleur contrôle d’accès et une réutilisabilité entre projets.

  • Surveiller et Optimiser l’Utilisation des Crédits : Examiner régulièrement les Insights et Analytics pour identifier les tâches lentes, optimiser les paramètres de parallélisme et réduire les exécutions de workflow inutiles afin de gérer efficacement les coûts.

Dépannage