GitHub Actions 环境变量 #
环境变量是GitHub Actions中传递配置信息的重要方式。本节详细介绍环境变量的配置和使用。
环境变量概述 #
什么是环境变量? #
环境变量是在工作流运行时可访问的键值对,用于:
- 存储配置信息
- 传递参数
- 设置运行时选项
- 存储敏感信息(通过Secrets)
变量作用域 #
text
工作流级 env
│
├── 作业级 env
│ │
│ └── 步骤级 env
│
└── 默认环境变量(系统提供)
定义环境变量 #
工作流级 #
yaml
name: Workflow
env:
CI: true
NODE_VERSION: '20'
REGISTRY: ghcr.io
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo $CI
- run: echo $NODE_VERSION
作业级 #
yaml
jobs:
build:
runs-on: ubuntu-latest
env:
JOB_VAR: job-value
DATABASE_URL: postgresql://localhost:5432/test
steps:
- run: echo $JOB_VAR
- run: echo $DATABASE_URL
步骤级 #
yaml
steps:
- name: Step with env
env:
STEP_VAR: step-value
API_KEY: ${{ secrets.API_KEY }}
run: |
echo $STEP_VAR
echo $API_KEY
变量优先级 #
步骤级 > 作业级 > 工作流级
yaml
env:
VAR: workflow-value
jobs:
build:
env:
VAR: job-value
steps:
- env:
VAR: step-value
run: echo $VAR # 输出: step-value
- run: echo $VAR # 输出: job-value
默认环境变量 #
GitHub Actions提供以下默认环境变量:
仓库信息 #
| 变量 | 描述 |
|---|---|
GITHUB_REPOSITORY |
仓库所有者和名称 (owner/repo) |
GITHUB_REPOSITORY_OWNER |
仓库所有者 |
GITHUB_REPOSITORY_ID |
仓库ID |
工作流信息 #
| 变量 | 描述 |
|---|---|
GITHUB_WORKFLOW |
工作流名称 |
GITHUB_WORKFLOW_REF |
工作流引用 |
GITHUB_WORKFLOW_SHA |
工作流SHA |
运行信息 #
| 变量 | 描述 |
|---|---|
GITHUB_RUN_ID |
运行ID |
GITHUB_RUN_NUMBER |
运行编号 |
GITHUB_RUN_ATTEMPT |
运行尝试次数 |
事件信息 #
| 变量 | 描述 |
|---|---|
GITHUB_EVENT_NAME |
触发事件名称 |
GITHUB_EVENT_PATH |
事件payload文件路径 |
GITHUB_SHA |
提交SHA |
GITHUB_REF |
分支或标签引用 |
GITHUB_REF_NAME |
引用名称 |
GITHUB_REF_TYPE |
引用类型 (branch/tag) |
其他信息 #
| 变量 | 描述 |
|---|---|
GITHUB_ACTOR |
触发用户 |
GITHUB_TOKEN |
自动生成的令牌 |
GITHUB_JOB |
当前作业ID |
GITHUB_ACTION |
当前Action ID |
GITHUB_ACTION_PATH |
Action路径 |
GITHUB_ACTION_REPOSITORY |
Action仓库 |
GITHUB_ACTION_REF |
Action引用 |
GITHUB_WORKSPACE |
工作区路径 |
GITHUB_SHA |
提交SHA |
GITHUB_SERVER_URL |
GitHub服务器URL |
GITHUB_API_URL |
GitHub API URL |
GITHUB_GRAPHQL_URL |
GitHub GraphQL URL |
使用示例 #
yaml
steps:
- name: Display GitHub context
run: |
echo "Repository: $GITHUB_REPOSITORY"
echo "Workflow: $GITHUB_WORKFLOW"
echo "Run ID: $GITHUB_RUN_ID"
echo "Run Number: $GITHUB_RUN_NUMBER"
echo "Event: $GITHUB_EVENT_NAME"
echo "SHA: $GITHUB_SHA"
echo "Ref: $GITHUB_REF"
echo "Actor: $GITHUB_ACTOR"
echo "Job: $GITHUB_JOB"
运行器环境变量 #
系统信息 #
| 变量 | 描述 |
|---|---|
RUNNER_OS |
操作系统 |
RUNNER_ARCH |
架构 (X64/ARM/ARM64) |
RUNNER_NAME |
运行器名称 |
RUNNER_TOOL_CACHE |
工具缓存目录 |
RUNNER_TEMP |
临时目录 |
RUNNER_WORKSPACE |
工作区目录 |
使用示例 #
yaml
steps:
- name: Display runner info
run: |
echo "OS: $RUNNER_OS"
echo "Arch: $RUNNER_ARCH"
echo "Name: $RUNNER_NAME"
echo "Tool Cache: $RUNNER_TOOL_CACHE"
echo "Temp: $RUNNER_TEMP"
动态设置环境变量 #
使用GITHUB_ENV #
yaml
steps:
- name: Set env var
run: echo "MY_VAR=hello" >> $GITHUB_ENV
- name: Use env var
run: echo $MY_VAR
多行环境变量 #
yaml
steps:
- name: Set multiline env
run: |
{
echo "MULTILINE_VAR<<EOF"
echo "Line 1"
echo "Line 2"
echo "Line 3"
echo "EOF"
} >> $GITHUB_ENV
- name: Use multiline env
run: |
echo "$MULTILINE_VAR"
从文件读取 #
yaml
steps:
- name: Read from file
run: |
echo "FILE_CONTENT=$(cat config.json)" >> $GITHUB_ENV
- name: Use file content
run: echo "$FILE_CONTENT"
从命令输出设置 #
yaml
steps:
- name: Set from command
id: set-var
run: echo "VERSION=$(git describe --tags)" >> $GITHUB_ENV
- name: Use version
run: echo "Version is $VERSION"
添加到PATH #
使用GITHUB_PATH #
yaml
steps:
- name: Add to PATH
run: echo "$HOME/mybin" >> $GITHUB_PATH
- name: Use custom command
run: my-custom-command
添加多个路径 #
yaml
steps:
- name: Add multiple paths
run: |
echo "$HOME/bin" >> $GITHUB_PATH
echo "$HOME/.local/bin" >> $GITHUB_PATH
echo "./node_modules/.bin" >> $GITHUB_PATH
使用上下文 #
github上下文 #
yaml
steps:
- name: Use github context
env:
REPO: ${{ github.repository }}
BRANCH: ${{ github.ref_name }}
SHA: ${{ github.sha }}
run: |
echo "Repository: $REPO"
echo "Branch: $BRANCH"
echo "SHA: $SHA"
runner上下文 #
yaml
steps:
- name: Use runner context
env:
OS: ${{ runner.os }}
ARCH: ${{ runner.arch }}
run: |
echo "OS: $OS"
echo "Arch: $ARCH"
job上下文 #
yaml
jobs:
build:
runs-on: ubuntu-latest
outputs:
status: ${{ job.status }}
steps:
- name: Job info
run: echo "Job status: ${{ job.status }}"
steps上下文 #
yaml
steps:
- id: step1
run: echo "result=success" >> $GITHUB_OUTPUT
- name: Use step output
run: echo "Step 1 result: ${{ steps.step1.outputs.result }}"
实际应用示例 #
配置多环境 #
yaml
name: Deploy
on:
workflow_dispatch:
inputs:
environment:
type: choice
options:
- staging
- production
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
deploy:
runs-on: ubuntu-latest
env:
ENVIRONMENT: ${{ github.event.inputs.environment }}
steps:
- name: Set environment-specific variables
run: |
if [ "$ENVIRONMENT" == "production" ]; then
echo "API_URL=https://api.example.com" >> $GITHUB_ENV
echo "DB_HOST=prod-db.example.com" >> $GITHUB_ENV
else
echo "API_URL=https://staging-api.example.com" >> $GITHUB_ENV
echo "DB_HOST=staging-db.example.com" >> $GITHUB_ENV
fi
- name: Deploy
run: |
echo "Deploying to $ENVIRONMENT"
echo "API URL: $API_URL"
echo "DB Host: $DB_HOST"
版本管理 #
yaml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set version
run: |
if [ "${{ github.ref_type }}" == "tag" ]; then
echo "VERSION=${{ github.ref_name }}" >> $GITHUB_ENV
else
echo "VERSION=$(git describe --tags --always)" >> $GITHUB_ENV
fi
- name: Build
run: |
echo "Building version $VERSION"
npm version $VERSION
npm run build
条件配置 #
yaml
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Configure based on OS
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
echo "PACKAGE_MANAGER=apt" >> $GITHUB_ENV
elif [ "$RUNNER_OS" == "macOS" ]; then
echo "PACKAGE_MANAGER=brew" >> $GITHUB_ENV
elif [ "$RUNNER_OS" == "Windows" ]; then
echo "PACKAGE_MANAGER=choco" >> $GITHUB_ENV
fi
- name: Install dependencies
run: |
echo "Using $PACKAGE_MANAGER"
最佳实践 #
1. 使用有意义的变量名 #
yaml
env:
NODE_VERSION: '20'
REGISTRY_URL: ghcr.io
DEPLOY_ENVIRONMENT: production
2. 集中管理配置 #
yaml
env:
CI: true
NODE_VERSION: '20'
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
env:
BUILD_ENV: production
3. 不要在环境变量中存储敏感信息 #
yaml
# 错误
env:
API_KEY: my-secret-key
# 正确
steps:
- env:
API_KEY: ${{ secrets.API_KEY }}
4. 使用上下文而非环境变量 #
yaml
# 推荐
- run: echo "Branch: ${{ github.ref_name }}"
# 也可以
- run: echo "Branch: $GITHUB_REF_NAME"
5. 文档化变量用途 #
yaml
env:
# Node.js version for all jobs
NODE_VERSION: '20'
# Container registry URL
REGISTRY: ghcr.io
# Image name (repository name)
IMAGE_NAME: ${{ github.repository }}
下一步学习 #
小结 #
- 环境变量分为工作流级、作业级和步骤级
- GitHub提供默认环境变量
- 使用GITHUB_ENV动态设置环境变量
- 使用GITHUB_PATH添加到系统路径
- 变量优先级:步骤级 > 作业级 > 工作流级
- 不要在环境变量中存储敏感信息
- 使用有意义的变量名并文档化
最后更新:2026-03-28