在上一篇我們學到了workflow是由job組成,job則由step組成
在這篇我們會來了解一下workflow中的變數,以及如何在job、step之間傳遞資料
首先要釐清一下在workflow中可能會出現兩種變數,分別為GitHub Actions的變數、shell的變數
GitHub Actions的變數是指存在於context中的變數
,而不是以shell command去宣告,並存在shell環境的變數
run: |
# NAME是shell變數
echo NAME="Tempura"
變數是用來存放非敏感資訊的,反之存放敏感資訊則用 secret
Github預設環境變數只存在於runner
,是一種全域
變數,通常以GITHUB_或者RUNNER_開頭
,大多數的情況下無法覆寫
其值 (唯有CI這個變數除外),只能
夠寫入
變數
需要使用 github context,或者 runner context 才能取得
,但是無法透過 env context 取得它,因為env context內的都是自訂變數
舉例來說變數名叫GITHUB_REF,取得時`${{github.ref}},若叫RUNNER_OS,則用${{runner.os}}
使用 env
keyword 可以在 workflow 中宣告變數
,不過型別只能是string、number、boolean
以這種方法定義的變數具有scope
,在 top level 的變數是全域的,在 job、step 宣告的變數則只在該job、step可以取用
env: # 全域變數
DAY_OF_WEEK: Monday
jobs:
greeting_job:
runs-on: ubuntu-latest
env: # 存在於這個job內的變數
Greeting: Hello
steps:
- name: Say Hello
# 在變數名前加上$可以取得環境變數
run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
env: # 只存在於這個step內的變數
First_Name: Tempura
如果你在某個 step 中有個 value,只要把它塞進環境變數中,並寫入GITHUB_ENV
,就可以在和同個 job 的後續的 step 分享
它
但需要注意有些值 (ex: NODE_OPTIONS) 因為安全問題,無法被寫入 GITHUB_ENV
steps:
- name: Set variables
run: |
echo "Greeting=Hello" >> $GITHUB_ENV
echo "First_Name=Tempura" >> $GITHUB_ENV
echo "DAY_OF_WEEK=Monday" >> $GITHUB_ENV
- name: Say Hello
run: |
echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
GITHUB_ENV 可以被同個 workflow 中用到的 action,或者 shell command 使用
如果你想要把 step 中的 value 傳給不同 job 的 step,那要需要做以下幾件事
jobs:
set-style:
runs-on: ubuntu-latest
outputs: # 一定要定義outputs,才能讓其他job的step取用primary-color
primary-color: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
steps:
- name: Set color
id: color-selector
# 將SELECTED_COLOR的值設為green,然後把SELECTED_COLOR寫入GITHUB_OUTPUT
# 這樣同個job內的之後的step就可以取用SELECTED_COLOR
run: echo "SELECTED_COLOR=green" >> $GITHUB_OUTPUT
- name: Get color
env:
# 透過step id來取得output,並存到名為FAVORITE_COLOR的環境變數
FAVORITE_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
# 印出FAVORITE_COLOR
run: echo "The selected color is $FAVORITE_COLOR"
get-style:
runs-on: ubuntu-latest
# 一定要設定needs才能從set-style取用primary-color
needs: set-style
steps:
- name: Get color of style
# 印出名為set-style的job的output.primary-color
run: echo "The color be selected in last job was ${{ needs.set-style.outputs.primary-color }}."
echo "SELECTED_COLOR=green" >> $GITHUB_OUTPUT
和 echo "::set-output name=SELECTED_COLOR::green"
功能是一樣的
不過還是推薦用GITHUB_OUTPUT
,因為官方已公告,基於安全的理由未來會把::set-output 廢棄