身為學生還不趕快GitHub Actions起來

NYUST GDSC Leads Tim


今日主角 Github Actions


Small Introduction

  • GitHub Actions 為GitHub平台提供的CI/CD服務(程式自動化服務)

工作流程架構介紹

整個GitHub Actions的最小流程為 action

整個工作內容有一定的階層關係在
由最高階層至最低階層為

  1. Workflow(工作流程)
  2. Job(工作)
  3. Step(步驟)
  4. Action(動作)

Workflow可以擁有多個Job
Job可以擁有多個Step
Step可以擁有多個Action


OK 那我要怎麼讓我的現有專案程式自動化哩

好問題


實作環節


找一個現有專案(這裡以我之前的ELK專案作範例)

可以到GitHub 進行參考

專案連結

以下提供範例專案


我們來說明一下 此專案所需要的環境情境

  1. 我希望在Open Pull Request跟Push 的時候觸發Pipeline
  2. 這是一個Django 專案
    • 需要Python 環境 且指定版本3.10
    • 需要Pip來安裝專案Dependencies
    • 根據專案的Pipenv File來安裝所需Dependencies
  3. 作者在專案有附註有Docker Compose yml註記需要其他外在環境
    • Elastic Search
    • Kibana
    • Logstash
    • PostgreSQL
    • pgAdmin
  4. 希望在建置好環境後進行軟體測試

OK 需求訂製好了 我們來一步步的將需求轉換成Github Action的YAML檔案上


Step 1 作用於Open Pull Request 與 Push

on是GitHub Action 作用於得關鍵字
中括弧裡面的是作用Branch

1
2
3
4
5
6
7
on:
workflow_call:
workflow_dispatch:
push:
branches: [main]
pull_request:
branches: [main]

完成後GitHub Action就知道你要在Main被Open PR與Push的時候執行Pipeline


Step 2 建置Django專案Python環境

執行環境需要作業系統 我們使用Ubuntu LTS 以及所需環境變數

1
2
3
4
5
6
7
8
9
10
jobs:
simple_build:
runs-on: ubuntu-latest
env:
DJANGO_SECRET_KEY: "erqwer23"
PYTHON_VERSION: "3.9"
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Checkout code
uses: actions/checkout@v3

安裝Python及Pipenv與套件

1
2
3
4
5
6
7
8
9
- name: Setup Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v2
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Install pipenv
run: pip install pipenv
- name: Install Dependencies from pipenv
run: |
pipenv install

Step 3 根據專案的Docker Compose yaml進行環境建置

1
2
3
4
- name: Docker Compose Action
uses: isbang/[email protected]
with:
compose-file: "./docker-compose.yml"

Step 4 進行軟體測試

1
2
3
4
- name: Run tests
run: |
pipenv run python manage.py test


GitHub Actions Secret


我的環境是不想被公開放到GitHub的隱蔽資料,但CI需要這項資料該怎麼辦?

通常我們會將敏感資料建立在專案的環境變數裏頭,.env 那有時候我們的密鑰阿或是資料庫密碼等等由於需要隱藏會放在.env裡面且避免Commit到Repository上會透過.gitignore來避免提交,但是在GitHub Actions CI由於沒有.env裡面的特定環境變數而無法建置或測試專案,這個時候GitHub Actions有提供一項功能來解決以上的困擾。


點開GitHub 專案的Settings選項就能找到他
最後在Repository Secret裏頭寫入需要的環境變數就建立完成了

GitHub Actions調用Secret環境變數方法

使用$即可調用

1
2
with: 
API_SECRET: ${{ secrets.APISecret }}