【Workflow】自動化工作流程如初見

前言

話說,筆者為什麼要學Workflows的,絕對不是因為要CI / CD,因為基本上,手機APP都是單人作業的,除非是很大型的專案,不然不太會有使用它的機會 (其實是筆者不會啦),主要還是在學Tauri製作小桌面APP,想要打包成各平台的執行檔,但是…筆者只有mac mini,那要怎麼辦呢?就可以使用GitHub Workflows,來自動打包成各平台的執行檔,雖然說,還是要實際上到各平台測一下才知道能不能用…

想做一個這樣子的功能

建立專案

  1. 因為現在Github都是使用Token登入使用的,所以要先把該workflows的功能先打勾才能使用…
  2. 先在Github上建立一個名叫github-workflows-first的倉庫
  3. 然後下載下來使用…
  4. 我們使用VSCode工具,建立.github/workflows資料夾,上面建立linux-x86.yml檔案…
  5. 這資料夾位置是固定的,當然,設定檔也可以有多個,如windows-x86_64.yml / macOS-arm64.yml

安裝系統

  1. 現在,就把下面的程式碼貼到linux-x86.yml檔案上吧…
  2. 除了安裝ubuntu系統之外,我們也順道取得它的系統名稱CPU架構來顯示…
name: Linux x86 Workflow

on:
  push:
    branches:
      - debug

  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: 取得系統名稱
        id: get_os
        run: echo "OS_NAME=$(uname -s)" >> $GITHUB_OUTPUT

      - name: 取得CPU架構
        id: get_arch
        run: echo "CPU_ARCH=$(uname -m)" >> $GITHUB_OUTPUT

      - name: 列印系統名稱和CPU架構
        run: |
          echo "系統名稱: ${{ steps.get_os.outputs.OS_NAME }}"
          echo "CPU架構: ${{ steps.get_arch.outputs.CPU_ARCH }}"

上傳檔案

  1. 這裡我們使用Source-Tree來把檔案push到github上,當然…直接用指令也是可以的…
  2. 上傳之後,可以到github專案上的actions查看一下…
  3. 聰明如你,身為軟體打字工的各位,應該對它不陌生吧?

解譯程式碼

  1. 主要jobs就是執行工作的區塊,而build則是工作項目的名字 (可自訂)…
  2. steps就是工作步驟,就一步一步的去執行…
  3. 當然也可以把中間過程的值存下來,以便之前去使用,大部分都是存在$GITHUB_OUTPUT之中…
  4. 我們就按下Run workflow來取得OS / CPU的值,照著影片一步步去做就可以了…

安裝軟體

  • 我們來安裝node.js吧,因為每個系統安裝軟體的方式各有不同,而就有好心人撰寫腳本來整合,而actions/setup-node@v4就是別人寫好的功能,我們就直接拿來使用吧…
  • 記得要git push,然後再跟之前的影片一樣,手動執行Run workflow,去看看結果…
name: Linux x86 Workflow

on:
    ...

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
     ...
      - name: 安裝 Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: 驗證 Node.js 版本
        run: node -v

執行檔案

  1. 如果我們要執行上傳程式碼的話呢?這是一個一定會用到的功能,所以就有好心人寫好了功能,就是actions/checkout@v4,它可以讓workflow下載已上傳程式碼到我們安裝的系統中…
  2. 先在根目錄下新增app.js,寫個Hello World,然後上傳…
  3. 可以看到設定檔內容,其實就是在執行系統指令,所以也可以自己在實機上先試試…
console.log('安安你好嗎 !!!');

name: Linux x86 Workflow

on:
  push:
    branches:
      - debug

  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: 將你的 Git 儲存庫的程式碼下載(checkout)到工作流程執行器(runner)的檔案系統中。
        uses: actions/checkout@v4

        ...

      - name: 驗證 Node.js 版本
        run: node -v

      - name: 執行JavaScript檔案
        run: node 'app.js'

  1. 可以在Actions可以看到很多執行過的記錄,可以一一查詢…

設定可輸入變數

  1. 接著我們來設定一個可輸入的變數,雖然全自動也是不錯的,但是有時候還是手動輸入的好,能完整查看過程,不用重新一直push
  2. 我們來設定安裝nodejs的版本為22吧…
  3. workflow_dispatch -> inputs的地方可以輸入變數名稱跟設定值…
  4. 取值時為github.event.inputs.<變數名稱>的格式,但是因為在自動跑的時候,我們並沒有輸入值,所以還是要自己加入一個預設值才行…
name: Linux x86 Workflow

on:
  push:
    branches:
      - debug

  workflow_dispatch:
    inputs:
      jsName:
        description: '要執行的 JavaScript 檔案名稱'
        required: true
        default: 'app.js'

      nodeVersion:
        description: 'Node.js 版本'
        required: true
        default: '20'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
        ...

      - name: 安裝 Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ github.event.inputs.nodeVersion || '20' }}

        ...

      - name: 執行JavaScript檔案
        run: node ${{ github.event.inputs.jsName || 'app.js' }}

執行指令

  1. 接下來我們就來執行指令 - 壓縮檔案 (zip),就可以說是打包檔案,然後順道查看一下目錄內容
  2. 檔案更新完成後,可以去看看有沒有壓縮成功,檔案名稱有沒有跟我們設定的一樣…
name: Linux x86 Workflow

on:
  push:
    branches:
      - debug

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    ...
      - name: 壓縮 app.js 成 app.zip
        run: zip app.zip app.js

      - name: 列印目前目錄內容
        run: ls -al

環境變數

  1. 除了之前介紹的存在$GITHUB_OUTPUT的值之外,還有一個叫環境變數的功能…
  2. 它的功能就是在步驟之內使用的,也就是<步驟名稱> -> env中設定…
  3. 使用的方式就很簡單啦,就是env.<變數名稱>,這樣子可以一次改多個變數,而且VSCode還支援,自動填充變數名呢…
  4. 其實它就是存在$GITHUB_ENV內的變數啦…
name: Linux x86 Workflow

on:
  push:
    branches:
      - debug

  workflow_dispatch:
    inputs:
      jsName:
        description: '要執行的 JavaScript 檔案名稱'
        required: true
        default: 'app.js'

      nodeVersion:
        description: 'Node.js 版本'
        required: true
        default: '20'

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      OS: ubuntu

    steps:
        ...
      - name: 設定壓縮檔案名稱
        run: echo "FILE_NAME=app-${{ env.OS }}.zip" >> $GITHUB_ENV

      - name: 壓縮 app.js 成 app.zip
        run: zip ${{ env.FILE_NAME }} app.js

      - name: 列印目前目錄內容
        run: ls -al

上傳檔案到 GitHub Release

  1. 最後,我們來自動執行workflow…
  2. on -> push,可以看到有branchestags的字樣,可以分別設定在某個分支名稱某個版本號,上傳之後自動執行…
  3. 當然,也可以加上定時執行的功能,就是on -> schedule -> cron,這裡就不細說了…
  4. 記得上傳後要馬上去看看,因為它是自動執行的…
  5. 最後在專案的Releases下,也看看壓縮好的檔案有沒有順利上傳上去…
name: Linux x86 Workflow

on:
  push:
    branches:
      - debug
    tags:
      - 'v*'

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    env:
      OS: ubuntu

    steps:
        ...

      - name: 上傳 app.zip 到 GitHub Release
        uses: softprops/action-gh-release@v1
        with:
          files: ${{ env.FILE_NAME }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  1. 最後也附上macOS / Windows版本執行的版本…
  2. 其實也可以把各系統的yml整合成一個的,大家有興趣的話也可以去查查看…

範例程式碼下載

後記

  • 雖然筆者是一個學習新事物很慢的人,常常都是一步一腳印的去做,然後筆記起來,就不用再想一次了嘛,也許在別人看來,我都是在學一些不流行的事物,不太潮流的新知,看起來很弱,言而無物,但自己還是喜歡基礎的學習,畢竟是個實際執行的人,炫麗的技術是大人物在談論的,而且過新的技術不一定長久、穩定,自認就只是一個小人物,我就是那種別人在談大海,我在說漱口杯的人啊…😂