# 身為學生還不趕快 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 }}