Untersuchen von Umgebungsvariablen

Abgeschlossen

Umgebungsvariablen sind für die Erstellung flexibler und wartungsfähiger GitHub-Aktionen-Workflows unerlässlich. Sie ermöglichen es Ihnen, Das Verhalten zu konfigurieren, Daten zwischen Schritten zu übergeben und Workflows ohne Hartcodierungswerte an verschiedene Umgebungen anzupassen.

Grundlegendes zu Umgebungsvariablen in GitHub-Aktionen

Umgebungsvariablen bieten eine Möglichkeit zum Speichern und Zugreifen auf Konfigurationsdaten in Ihren Workflows. Sie können in unterschiedlichen Bereichen festgelegt und in Ihrer Automatisierungspipeline verwendet werden, um eine konsistente und sichere Konfigurationsverwaltung zu ermöglichen.

Variable Bereiche und Hierarchie

GitHub-Aktionen unterstützen Umgebungsvariablen auf mehreren Ebenen:

Workflowebene: Verfügbar für alle Aufträge im Workflow Jobebene: Verfügbar für alle Schritte in einem bestimmten Auftrag
Schrittebene: Nur für diesen bestimmten Schritt verfügbar

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"

Integrierte GitHub-Umgebungsvariablen

GitHub stellt automatisch zahlreiche Umgebungsvariablen mit Informationen zum Workflowkontext bereit:

Wichtige integrierte Variablen

Variable Description Beispielwert
GITHUB_WORKFLOW Name des Workflows "CI Pipeline"
GITHUB_ACTION Eindeutiger Bezeichner der Aktion "__actions_checkout"
GITHUB_REPOSITORY Repository-Name (Besitzer/Repo) "microsoft/vscode"
GITHUB_REF Verzweigungs- oder Tagreferenz "refs/heads/main"
GITHUB_SHA Der Commit-SHA, der den Workflow ausgelöst hat "ffac537e6cbb..."
GITHUB_ACTOR Benutzername des Benutzers, der den Workflow ausgelöst hat "octocat"
GITHUB_EVENT_NAME Ereignis, das den Workflow ausgelöst hat "push"
RUNNER_OS Betriebssystem des Läufers "Linux"

Erweiterte integrierte Variablen

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"

Wichtige Benennungsregeln:

  • Integrierte Variablen verwenden das GITHUB_ Präfix
  • Sie können keine benutzerdefinierten Variablen mit dem GITHUB_ Präfix erstellen.
  • Variablennamen berücksichtigen in den meisten Kontexten Groß- und Kleinschreibung

Praktische Umgebungsvariablenmuster

Konfigurationsverwaltung

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 .

Dynamische Variablenerstellung

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"

Konfiguration mit mehreren Plattformen

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

Bewährte Methoden für Sicherheit für Umgebungsvariablen

Verarbeitung vertraulicher Daten

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

Überprüfung der Umgebungsvariable

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

Erweiterte Techniken

Bedingte Umgebungsvariablen

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

Umgebungsvariablenvorlagen

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

Umgebungsvariablen sind ein leistungsstarkes Tool zum Erstellen flexibler, wartungsfähiger und sicherer GitHub-Aktionen-Workflows. Verwenden Sie sie strategisch, um hartcodierte Werte zu vermeiden und eine einfache Konfigurationsverwaltung in verschiedenen Umgebungen zu ermöglichen.

Vollständige Dokumentation zu Umgebungsvariablen finden Sie unter "Umgebungsvariablen" in GitHub-Aktionen.