Examinar variáveis de ambiente

Concluído

As variáveis de ambiente são essenciais para criar fluxos de trabalho flexíveis e manteneveis do GitHub Actions. Elas permitem que você configure o comportamento, passe dados entre etapas e adapte fluxos de trabalho a ambientes diferentes sem valores de codificação.

Noções básicas sobre variáveis de ambiente no GitHub Actions

As variáveis de ambiente fornecem uma maneira de armazenar e acessar dados de configuração em seus fluxos de trabalho. Eles podem ser definidos em escopos diferentes e usados em todo o pipeline de automação para gerenciamento de configuração consistente e seguro.

Escopos e hierarquia de variáveis

O GitHub Actions dá suporte a variáveis de ambiente em vários níveis:

Nível de fluxo de trabalho: disponível para todos os trabalhos no nível de trabalho do fluxo de trabalho: disponível para todas as etapas em um trabalho específico
Nível da etapa: disponível apenas para essa etapa específica

name: Multi-level Environment Variables

# Workflow-level variables
env:
  NODE_VERSION: "20"
  BUILD_CONFIGURATION: "Release"

jobs:
  build:
    runs-on: ubuntu-latest

    # Job-level variables
    env:
      DATABASE_NAME: "production_db"
      API_TIMEOUT: "30000"

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}

      - name: Run tests with custom config
        run: npm test
        # Step-level variables
        env:
          TEST_ENVIRONMENT: "ci"
          LOG_LEVEL: "debug"

Variáveis de ambiente internas do GitHub

O GitHub fornece automaticamente várias variáveis de ambiente com informações sobre o contexto do fluxo de trabalho:

Variáveis internas essenciais

Variable Description Exemplo de valor
GITHUB_WORKFLOW Nome do fluxo de trabalho "CI Pipeline"
GITHUB_ACTION Identificador exclusivo da ação "__actions_checkout"
GITHUB_REPOSITORY Nome do repositório (proprietário/repositório) "microsoft/vscode"
GITHUB_REF Referência de branch ou marca "refs/heads/main"
GITHUB_SHA Confirmar SHA que disparou o fluxo de trabalho "ffac537e6cbb..."
GITHUB_ACTOR Nome de usuário do usuário que disparou o fluxo de trabalho "octocat"
GITHUB_EVENT_NAME Evento que disparou o fluxo de trabalho "push"
RUNNER_OS Sistema operacional do executor "Linux"

Variáveis internas avançadas

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Display workflow context
        run: |
          echo "Workflow: $GITHUB_WORKFLOW"
          echo "Repository: $GITHUB_REPOSITORY"
          echo "Branch: ${GITHUB_REF#refs/heads/}"
          echo "Commit: $GITHUB_SHA"
          echo "Actor: $GITHUB_ACTOR"
          echo "Event: $GITHUB_EVENT_NAME"
          echo "Runner OS: $RUNNER_OS"

Regras de nomenclatura importantes:

  • Variáveis internas usam o GITHUB_ prefixo
  • Você não pode criar variáveis personalizadas com o GITHUB_ prefixo
  • Os nomes de variáveis diferenciam maiúsculas de minúsculas na maioria dos contextos

Padrões práticos de variável de ambiente

Gerenciamento de configuração

name: Environment-specific Deployment

env:
  # Global configuration
  APP_NAME: "my-awesome-app"
  DOCKER_REGISTRY: "ghcr.io"

jobs:
  deploy-staging:
    if: github.ref == 'refs/heads/develop'
    runs-on: ubuntu-latest
    env:
      ENVIRONMENT: "staging"
      API_URL: "https://api.staging.example.com"
      DATABASE_TIER: "basic"
    steps:
      - name: Deploy to staging
        run: |
          echo "Deploying $APP_NAME to $ENVIRONMENT"
          echo "API URL: $API_URL"
          docker build -t $DOCKER_REGISTRY/$APP_NAME:$GITHUB_SHA .

  deploy-production:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    env:
      ENVIRONMENT: "production"
      API_URL: "https://api.example.com"
      DATABASE_TIER: "premium"
    steps:
      - name: Deploy to production
        run: |
          echo "Deploying $APP_NAME to $ENVIRONMENT"
          echo "API URL: $API_URL"
          docker build -t $DOCKER_REGISTRY/$APP_NAME:latest .

Criação de variável dinâmica

steps:
  - name: Generate build metadata
    id: metadata
    run: |
      BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
      BUILD_NUMBER=$GITHUB_RUN_NUMBER
      VERSION_TAG=${GITHUB_REF#refs/tags/}

      echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
      echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITHUB_ENV
      echo "VERSION_TAG=$VERSION_TAG" >> $GITHUB_ENV

  - name: Use generated variables
    run: |
      echo "Build Date: $BUILD_DATE"
      echo "Build Number: $BUILD_NUMBER"
      echo "Version: $VERSION_TAG"

Configuração de várias plataformas

jobs:
  build:
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        include:
          - os: ubuntu-latest
            BUILD_COMMAND: "make build-linux"
            PACKAGE_EXT: ".deb"
          - os: windows-latest
            BUILD_COMMAND: "msbuild /p:Configuration=Release"
            PACKAGE_EXT: ".msi"
          - os: macos-latest
            BUILD_COMMAND: "xcodebuild -configuration Release"
            PACKAGE_EXT: ".dmg"

    runs-on: ${{ matrix.os }}
    env:
      BUILD_COMMAND: ${{ matrix.BUILD_COMMAND }}
      PACKAGE_EXT: ${{ matrix.PACKAGE_EXT }}

    steps:
      - name: Build application
        run: ${{ env.BUILD_COMMAND }}

Práticas recomendadas de segurança para variáveis de ambiente

Tratamento de dados confidenciais

# DON'T: Store secrets in plain environment variables
env:
  DATABASE_PASSWORD: 'super-secret-password'  # Visible in logs!

# DO: Use GitHub Secrets for sensitive data
env:
  DATABASE_HOST: 'db.example.com'
  DATABASE_PORT: '5432'
  DATABASE_USER: 'app_user'
  DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}  # Secure!

Validação de variável de ambiente

steps:
  - name: Validate required environment variables
    run: |
      required_vars=("API_URL" "DATABASE_HOST" "ENVIRONMENT")

      for var in "${required_vars[@]}"; do
        if [ -z "${!var}" ]; then
          echo "ERROR: Required environment variable $var is not set"
          exit 1
        else
          echo "OK: $var is set"
        fi
      done

Técnicas avançadas

Variáveis de ambiente condicional

steps:
  - name: Set environment-specific variables
    run: |
      if [ "$GITHUB_REF" = "refs/heads/main" ]; then
        echo "LOG_LEVEL=info" >> $GITHUB_ENV
        echo "CACHE_TTL=3600" >> $GITHUB_ENV
      elif [ "$GITHUB_REF" = "refs/heads/develop" ]; then
        echo "LOG_LEVEL=debug" >> $GITHUB_ENV
        echo "CACHE_TTL=300" >> $GITHUB_ENV
      else
        echo "LOG_LEVEL=warn" >> $GITHUB_ENV
        echo "CACHE_TTL=60" >> $GITHUB_ENV
      fi

Modelagem de variável de ambiente

env:
  APP_VERSION: ${{ github.ref_name }}
  BUILD_ID: ${{ github.run_number }}
  FULL_VERSION: ${{ github.ref_name }}-build.${{ github.run_number }}
  CONTAINER_TAG: ${{ github.repository }}:${{ github.ref_name }}

As variáveis de ambiente são uma ferramenta poderosa para criar fluxos de trabalho flexíveis, manteneveis e seguros do GitHub Actions. Use-os estrategicamente para evitar valores codificados e habilitar o gerenciamento de configuração fácil em ambientes diferentes.

Para obter a documentação completa sobre variáveis de ambiente, consulte Variáveis de ambiente no GitHub Actions.