Examen de variables de entorno

Completado

Las variables de entorno son esenciales para crear flujos de trabajo de Acciones de GitHub flexibles y fáciles de mantener. Permiten configurar el comportamiento, pasar datos entre pasos y adaptar flujos de trabajo a distintos entornos sin codificar valores de forma rígida.

Descripción de las variables de entorno en Acciones de GitHub

Las variables de entorno proporcionan una manera de almacenar y acceder a los datos de configuración dentro de los flujos de trabajo. Se pueden establecer en distintos ámbitos y usarse en toda la canalización de automatización para una administración de configuración coherente y segura.

Alcance y jerarquía de variables

Acciones de GitHub admite variables de entorno en varios niveles:

Nivel de flujo de trabajo: Disponible para todos los trabajos en el flujo de trabajo Nivel de trabajo: Disponible para todos los pasos en un trabajo específico
Nivel de paso: disponible solo para ese paso específico

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"

Variables de entorno integradas de GitHub

GitHub proporciona automáticamente numerosas variables de entorno con información sobre el contexto de flujo de trabajo:

Variables integradas esenciales

Variable Description Valor de ejemplo
GITHUB_WORKFLOW Nombre del flujo de trabajo "CI Pipeline"
GITHUB_ACTION Identificador único de la acción "__actions_checkout"
GITHUB_REPOSITORY Nombre del repositorio (propietario/repositorio) "microsoft/vscode"
GITHUB_REF Referencia de rama o etiqueta "refs/heads/main"
GITHUB_SHA Confirmación de SHA que desencadenó el flujo de trabajo "ffac537e6cbb..."
GITHUB_ACTOR Nombre de usuario del usuario que desencadenó el flujo de trabajo "octocat"
GITHUB_EVENT_NAME Evento que desencadenó el flujo de trabajo "push"
RUNNER_OS Sistema operativo del ejecutor "Linux"

Variables integradas avanzadas

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"

Reglas de nomenclatura importantes:

  • Las variables integradas usan el GITHUB_ prefijo
  • No se pueden crear variables personalizadas con el GITHUB_ prefijo
  • Los nombres de variables distinguen mayúsculas de minúsculas en la mayoría de los contextos

Patrones prácticos de variables de entorno

Administración de configuración

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 .

Creación de variables dinámicas

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"

Configuración multiplataforma

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 }}

Procedimientos recomendados de seguridad para variables de entorno

Control de datos confidenciales

# 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!

Validación de variables de entorno

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 avanzadas

Variables de entorno 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

Uso de plantillas para variables de entorno

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 }}

Las variables de entorno son una herramienta eficaz para crear flujos de trabajo de Acciones de GitHub flexibles, fáciles de mantener y proteger. Úselas estratégicamente para evitar valores codificados de forma rígida y habilitar la administración de configuración sencilla en distintos entornos.

Para obtener documentación completa sobre las variables de entorno, consulte Variables de entorno en Acciones de GitHub.