Skip to content

Overriding Variables

When you define variables with the same name at multiple levels (workflow, job, step), GitHub Actions follows a precedence order.

Precedence Rule

Step Level > Job Level > Workflow Level

A variable defined at the step level overrides a variable with the same name at the job level, which in turn overrides the workflow level.

Example Workflow

In this example, the COPY_TARGET_FOLDER is defined globally as /tmp. However, in the last step, it is overridden to /opt.

name: overriding-variables

on: workflow_dispatch

env:
  MVN_TARGET_FOLDER: "target"
  MVN_WAR_FILE_NAME: "hello-world*.war"
  COPY_TARGET_FOLDER: "/tmp"

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Printing predefined variables
        run: |
          echo "$GITHUB_WORKFLOW"
          echo "$GITHUB_ACTION"
          echo "$GITHUB_REPOSITORY"
      - name: Setup Maven
        uses: stCarolas/setup-maven@v4.5
        with:
          maven-version: 3.6.0
      - name: Maven Build
        run: |
          mvn clean package
          pwd
          ls -l ${{ env.MVN_TARGET_FOLDER }}
          du -sh ${{ env.MVN_TARGET_FOLDER }}
          du -sh ${{ env.MVN_TARGET_FOLDER }}/${{ env.MVN_WAR_FILE_NAME }}
      - name: Copying war file to tmp folder
        run: |
          cp ${{ env.MVN_TARGET_FOLDER }}/${{ env.MVN_WAR_FILE_NAME }} ${{ env.COPY_TARGET_FOLDER }}
          pwd
          ls -l ${{ env.COPY_TARGET_FOLDER }}
      - name: Copying war file to /opt folder
        env:
          COPY_TARGET_FOLDER: "/opt"
        run: |
          cp ${{ env.MVN_TARGET_FOLDER }}/${{ env.MVN_WAR_FILE_NAME }} ${{ env.COPY_TARGET_FOLDER }}
          pwd
          ls -l ${{ env.COPY_TARGET_FOLDER }}

Outcome

  • Step "Copying war file to tmp folder" uses /tmp (from workflow env).
  • Step "Copying war file to /opt folder" uses /opt (from step env overrides).

📬 DevopsPilot Weekly — Learn DevOps, Cloud & Gen AI the simple way.
👉 Subscribe here