iT邦幫忙

2024 iThome 鐵人賽

DAY 6
1
DevOps

菜逼八用Github Actions系列 第 6

Day 06 - GitHub Actions的變數

  • 分享至 

  • xImage
  •  

目錄

摘要

在上一篇我們學到了workflow是由job組成,job則由step組成

在這篇我們會來了解一下workflow中的變數,以及如何在job、step之間傳遞資料

GitHub Actions的變數類型

首先要釐清一下在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

在 job 間共享資料

在 job 和 step 間共享資料

同個 job 間

如果你在某個 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 使用

不同 job 間

如果你想要把 step 中的 value 傳給不同 job 的 step,那要需要做以下幾件事

  1. 把它定義成 output (類似step的 return value 的概念)
  2. 並在要使用 output 的另一個 job 定義 needs
  3. 透過step id來取得output
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_OUTPUTecho "::set-output name=SELECTED_COLOR::green"功能是一樣的

不過還是推薦用GITHUB_OUTPUT,因為官方已公告,基於安全的理由未來會把::set-output 廢棄


上一篇
Day 05 - workflow的組成
下一篇
Day 07 - context
系列文
菜逼八用Github Actions29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言