circleci

Use ao escrever, editar ou revisar a configuração do CircleCI para o repositório Astronomer APC. Abrange organização de scripts, scripts inline vs externos e…

npx skills add https://github.com/astronomer/astronomer --skill circleci

CircleCI Configuration Guide

Critical Rules

  1. No long inline scripts — script logic for any language must not be written inline in .circleci/config.yml if the script has complicated flow control. Complicated scripts belong in bin/.
  2. Scripts live in bin/ — every script called from CircleCI must exist as a file in the bin/ directory with an appropriate extension (e.g. bin/my-script.sh, bin/my-script.py).
  3. Pin all versions — never use latest or unpinned tags for Docker images or installed tools. Always specify an exact version to prevent supply chain vulnerabilities and ensure reproducible builds.

Script Organization

Scripts invoked by CircleCI jobs must be committed to the repository under bin/ so they can be:

  • Linted and reviewed like any other source file
  • Tested and run locally without needing CI
  • Reused across multiple jobs or workflows
# ✅ CORRECT — call a script from bin/
steps:
  - run:
      name: Build Helm chart
      command: bin/build-helm-chart.sh
# ❌ WRONG — inline shell logic in the CircleCI config
steps:
  - run:
      name: Build Helm chart
      command: |
        helm package .
        mv astronomer-*.tgz /tmp/chart/

Config Generation Pipeline

.circleci/config.yml is never edited directly. It is a generated file produced by rendering the Jinja2 template .circleci/config.yml.j2 via bin/generate_circleci_config.py:

# Regenerate config.yml from the template
uv run bin/generate_circleci_config.py

The generator injects a small set of computed variables (e.g. ci_runner_version, kube_versions, machine_image_version, docker_images) into the template at render time. Always edit .circleci/config.yml.j2, then regenerate.


Version Pinning

Always pin exact versions for Docker images and any tools installed during a job. Using latest or loose tags introduces supply chain risk and makes builds non-reproducible.

All pinned versions must be declared as Jinja2 variables at the top of .circleci/config.yml.j2, not scattered inline throughout the file. This makes them easy to audit and update in one place. All version declarations must include a link to where the list of released versions can be found, so that updating them is straightforward and doesn't require searching online to find more recent releases.

{# ✅ CORRECT — versions declared at top of config.yml.j2 #}
{#- https://circleci.com/docs/guides/execution-managed/building-docker-images/#docker-version -#}
{%- set circleci_docker_version = 'docker23' -%}

{#- https://circleci.com/developer/machine/image/ubuntu-2404 -#}
{%- set machine_image_version = 'ubuntu-2404:2025.09.1' -%}
# Then referenced inline:
docker:
  - image: cimg/python:{{ python_image_version }}
# ❌ WRONG — version hardcoded inline, not declared at top
docker:
  - image: cimg/python:3.8.1
# ❌ WRONG — unpinned image
docker:
  - image: cimg/python:latest
# ✅ CORRECT — pinned tool version installed in a step
- run:
    name: Install helm
    command: bin/install-ci-tools.py 3.17.2

# ❌ WRONG — unversioned tool install
- run:
    name: Install helm
    command: curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Mais skills de astronomer

airflow-state-store
astronomer
Persists task and asset state across retries and DAG runs using Airflow 3.3's AIP-103 key/value stores (`task_state_store`, `asset_state_store`) and the…
creating-openlineage-extractors
astronomer
Extratores OpenLineage personalizados para operadores Airflow não suportados e cenários complexos de linhagem. Duas abordagens: adicionar métodos OpenLineage diretamente aos operadores que você possui (recomendado), ou criar extratores personalizados para operadores de terceiros que você não pode modificar. Os extratores interceptam a execução do operador em três pontos: antes da execução para linhagem estática, após o sucesso para saídas determinadas em tempo de execução e, opcionalmente, após falha para linhagem parcial. Registre os extratores via airflow.cfg ou ambiente...
debugging-dags
astronomer
Análise sistemática de causa raiz e remediação para DAGs do Airflow com falhas, utilizando fluxos de investigação estruturados. Orienta por um processo de diagnóstico em quatro etapas: identificar a falha, extrair detalhes do erro, reunir informações contextuais e fornecer etapas de remediação acionáveis. Classifica as falhas em quatro tipos (dados, código, infraestrutura, dependência) para focar a investigação e sugerir correções apropriadas. Fornece comandos CLI prontos para recuperação de logs, comparação de execuções, limpeza de tarefas e DAG...
delegating-to-otto
astronomer
Direciona o agente Otto da
deploying-airflow
astronomer
Implantar DAGs e projetos do Airflow. Use quando o usuário quiser implantar código, enviar DAGs, configurar CI/CD, implantar em produção ou perguntar sobre estratégias de implantação…
deploying-go-sdk-bundles
astronomer
Compila, empacota e implanta pacotes compilados do Airflow Go SDK para que o ExecutableCoordinator possa executá-los. Use quando o usuário quiser compilar um pacote de tarefas Go, pedir…
testing-dags
astronomer
Ciclos iterativos de teste-depuração-correção para DAGs do Airflow com diagnóstico abrangente de falhas. Comece com af runs trigger-wait <dag_id> para executar um DAG e aguardar a conclusão; não são necessárias verificações prévias. Em caso de falha, use af runs diagnose para um resumo abrangente de falhas e af tasks logs para inspecionar detalhes de erros de tarefas específicas. Suporta configuração personalizada, timeouts e tentativas de repetição; lida com cenários de sucesso, falha e timeout com interpretação clara da resposta. Validação rápida disponível...
tracing-downstream-lineage
astronomer
Rastreie a linhagem de dados downstream para avaliar o impacto de alterações antes de modificar tabelas ou DAGs. Identifica consumidores diretos de uma tabela ou DAG alvo por meio de busca em código-fonte, dependências de views e conexões com ferramentas de BI. Constrói uma árvore de dependências completa mapeando todos os impactos downstream, desde tabelas até dashboards e modelos de ML. Categoriza dependências por criticidade (crítica, alta, média, baixa) para priorizar comunicação com stakeholders e testes. Gera um relatório de impacto com avaliação de risco, afetados...