最近在看Github Action , 學習他的基本的CI/CD的操作。簡單的記錄一下他的基本流程。
Github action是Github網站提供的一個託管的CI/CD 的工具。具體的文檔可以參考
https://docs.github.com/en/actions/creating-actions/about-actions
Github action本身支持javascript action和Docker action,前者效率更高,可以跑在任何OS平臺上,但是需要手動配置依賴文件;後者因爲是Docker,只能跑在Linux平臺,效率略低,但是不需要手動配置依賴文件。
下面看一個簡單的docker例子,每次我通過git push的時候,都會觸發一個workflow,這個workflow會輸出 runner的內存狀態。
https://github.com/vetpartner/containeraction
我需要創建下面幾個文件。
.github\workflows\config.yaml
on: [push]
jobs:
my-job:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: run the action
id: hello
uses: ./
with:
myInput: 'Chad'
- name: output the memory
run: |
echo ${{ steps.hello.outputs.memory }}
echo "total memory successfully output"
根目錄下面一個 action.yml 文件
name: 'my first container action'
description: 'A demo'
author: 'Beanxyz'
inputs:
myInput:
description: 'greeting to use'
required: true
default: 'Awesome Guru'
outputs:
myOutput:
description: 'total memory'
runs:
using: 'docker'
image: 'Dockerfile'
根目錄下面一個Dockerfile 文件
FROM debian:9.5-slim
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
根目錄下面一個 entrypoint.sh 文件
#!/bin/sh
echo "Hello $INPUT_MYINPUT"
memory=$(cat /proc/meminfo)
echo "::set-output name=memory::$memory"
執行效果如下所示
簡單的描述一下文件和執行的流程
首先我們的workflow 會通過關鍵字 on 觸發 push的事件,下面會執行一系列的jobs,my-job是我的job的名字(id),runs-on 指定這個runner的操作系統爲 ubuntu,我們可以看見他對應的過程叫set up job
接下來,我們的jobs裏面定義了一系列的steps。第一個step 是使用一個關鍵字 use 調用官方的公共的actions/checkout@v2,他的作用就是讀取我的repository裏面的內容 放入一個runner的workflow的臨時空間裏面。這一步是所有workflow裏面必須要有的。除了官方的actions,我們也可以直接use 其他人的actions,格式爲username/repository@XXX, XXX可以指向release version,指向branch,或者指向某一個commit都是可以的
第二個step指向了我自己的根目錄。我的根目錄裏面存放了action.yml, Dockerfile和entrypoint.sh 三個文件。他們的調用順序是 workflow的文件查看action.yml, 發現裏面使用的docker container action方式,於是他會根據我們定義的Dockerfile來創建鏡像和容器,Dockerfile裏面我們配置了一個啓動腳本,因此容器啓動的時候回自動執行這個腳本。
workflow.yml - > action.yml -> Dockerfile - > entrypoint.sh
我在action.yml裏面還可以定義輸入變量和輸出變量,然後在workflow.yml裏面通過 with 來配置, 每個輸入變量他會自動生成一個環境變量$INPUT_變量名ID, 因此在我們的shell腳本里面, 我們使用echo的時候,直接調用了$INPUT_MYINPUT
最後,我們可以輸出output的變量
一個簡單的CI 流程就出來了