讓你滿意的GitHub Actions詳解

GitHub Actions 指南

GitHub Actions使你可以直接在你的GitHub庫中創(chuàng)建自定義的工作流,工作流指的就是自動化的流程柬讨,比如構(gòu)建崩瓤、測試、打包踩官、發(fā)布却桶、部署等等,也就是說你可以直接進行 CI(持續(xù)集成)和 CD(持續(xù)部署)蔗牡。

基本概念

(1)workflow: 一個 workflow 工作流就是一個完整的過程颖系,每個workflow 包含一組 jobs任務(wù)。

(2)job : jobs任務(wù)包含一個或多個job 辩越,每個 job包含一系列的 steps 步驟嘁扼。

(3)step : 每個 step 步驟可以執(zhí)行指令或者使用一個 action 動作。

(4)action : 每個 action 動作就是一個通用的基本單元黔攒。

配置 workflow

workflow必須存儲在你的項目庫根路徑下的 .github/workflows 目錄中趁啸,每一個 workflow對應(yīng)一個具體的.yml 文件(或者 .yaml)。

workflow 示例:

name:GreetEveryone
# This workflow is triggered on pushes to the repository.
on: [push]
jobs:
your_job_id:
# Job name is Greeting
name: Greeting
# This job runs on Linux
runs-on: ubuntu-latest
steps:
# This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action
- name: Hello world
uses: actions/hello-world-javascript-action@v1
with:
who-to-greet: 'Mona the Octocat'
id: hello
# This step prints an output (time) from the previous step's action.
- name: Echo the greeting's time
run: echo 'The time was ${{ steps.hello.outputs.time }}.

說明:
(1)最外層的 name 指定了 workflow的名稱亏钩。

(2)on 聲明了一旦發(fā)生了 push 操作就會觸發(fā)這個 workflow莲绰。

(3)jobs定義了任務(wù)集,其中可以有一個或多個job 任務(wù)姑丑,示例中只有一個蛤签。

(4)runs-on 聲明了運行的環(huán)境。

(5)steps定義需要執(zhí)行哪些步驟栅哀。

(6)每個 step可以定義自己的 nameid震肮,通過 uses 可以聲明使用一個具體的 action称龙,通過run 聲明需要執(zhí)行哪些指令。

(7)${{}}可以使用上下文參數(shù)戳晌。

上述示例可以抽象為:

name: <workflow name>
on: <events that trigger workflows>
jobs:
<job_id>:
name: <job_name>
runs-on: <runner>
steps:
- name: <step_name>
uses: <action>
with:
<parameter_name>: <parameter_value>
id: <step_id>
- name: <step_name>
run: <commands>

on

on聲明了何時觸發(fā) workflow 鲫尊,它可以是:

(1)一個或多個GitHub 事件,比如 ush 了一個 commit沦偎、創(chuàng)建了一個issue疫向、產(chǎn)生了一次pull`` request 等等,示例:

on:[push,pull_request]

(2)預(yù)定的時間豪嚎,示例(每天零點零分觸發(fā)):

on:
    schedule:
        -cron:'00 ***'

(3)某個外部事件搔驼。所謂外部事件觸發(fā),簡而言之就是你可以通過REST APIGitHub 發(fā)送請求去觸發(fā)侈询,具體請查閱官方文檔: repository-dispatch-event

配置多個事件舌涨,示例:

on:

# Trigger the workflow on push or pull request,

# but only for the master branch

push:

branches:

- master

pull_request:

branches:

- master

# Also trigger on page_build, as well as release created events

page_build:

release:

types: # This configuration does not affect the page_build event above

- created

詳細文檔請參考: 觸發(fā)事件

jobs

jobs可以包含一個或多個 job ,如:

jobs:

my_first_job:

name: My first job

my_second_job:

name: My second job

如果多個job 之間存在依賴關(guān)系扔字,那么你可能需要使用 needs :

jobs:

job1:

job2:

needs: job1

job3:

needs: [job1, job2]

這里的needs聲明了job2 必須等待 job1 成功完成囊嘉,job3必須等待 job1job2依次成功完成。

每個任務(wù)默認超時時間最長為 360分鐘革为,你可以通過 timeout-minutes 進行配置:

jobs:
    job1:
        timeout-minutes:

runs-on & strategy

runs-on 指定了任務(wù)的 runner 即執(zhí)行環(huán)境扭粱,runner 分兩種:GitHub-hosted runnerself-hosted runner

所謂的 self-hosted runner 就是用你自己的機器震檩,但是需要 GitHub 能進行訪問并給與其所需的機器權(quán)限焊刹,這個不在本文描述范圍內(nèi),有興趣可參考 self-hosted runner 恳蹲。

GitHub-hosted runner 其實就是 GitHub 提供的虛擬環(huán)境虐块,目前有以下四種:

(1)windows-latest : Windows Server 2019

(2)ubuntu-latestubuntu-18.04 : Ubuntu 18.04

(3)ubuntu-16.04 : Ubuntu 16.04

(4)macos-latest : macOS Catalina 10.15

比較常見的:

runs-on:ubuntu-latest

runs-on 多環(huán)境

有時候我們常常需要對多個操作系統(tǒng)、多個平臺嘉蕾、多個編程語言版本進行測試贺奠,為此我們可以配置一個構(gòu)建矩陣。

例如:

runs-on: ${{ matrix.os }}

strategy:

matrix:

os: [ubuntu-16.04, ubuntu-18.04]

node: [6, 8, 10]

示例中配置了兩種os操作系統(tǒng)和三種 node版本即總共六種情況的構(gòu)建矩陣错忱, ${{matrix.os}} 是一個上下文參數(shù)儡率。

strategy 策略,包括:

(1)matrix: 構(gòu)建矩陣以清。

(2)fail-fast : 默認為true 儿普,即一旦某個矩陣任務(wù)失敗則立即取消所有還在進行中的任務(wù)。

(3)max-paraller : 可同時執(zhí)行的最大并發(fā)數(shù)掷倔,默認情況下 GitHub 會動態(tài)調(diào)整眉孩。

示例:

runs-on: ${{ matrix.os }}

strategy:

matrix:

os: [macos-latest, windows-latest, ubuntu-18.04]

node: [4, 6, 8, 10]

include:

# includes a new variable of npm with a value of 2 for the matrix leg matching the os and version

- os: windows-latest

node: 4

npm: 2

include聲明了 oswindows-latest 時,增加一個 nodenpm分別使用特定的版本的矩陣環(huán)境。

include 相反的就是exclude

runs-on: ${{ matrix.os }}

strategy:

matrix:

os: [macos-latest, windows-latest, ubuntu-18.04]

node: [4, 6, 8, 10]

exclude:

# excludes node 4 on macOS

- os: macos-latest

node: 4

exclude 用來刪除特定的配置項浪汪,比如這里當osmacos-latest巴柿,將 node為 4 的版本從構(gòu)建矩陣中移除。

steps

steps 的通用格式類似于:

steps:

- name: <step_name>

uses: <action>

with:

<parameter_name>: <parameter_value>

id: <step_id>

continue-on-error: true


- name: <step_name>

timeout-minutes:

run: <commands>

每個 step 步驟可以有:

(1)id : 每個步驟的唯一標識符

(2)name : 步驟的名稱

(3)uses : 使用哪個action

(4)run: 執(zhí)行哪些指令

(5)with: 指定某個action 可能需要輸入的參數(shù)

(6)continue-on-error : 設(shè)置為 true 允許此步驟失敗job 仍然通過

(7)timeout-minutes : step 的超時時間

action

action 動作通常是可以通用的死遭,這意味著你可以直接使用別人定義好的action广恢。

checkout action

checkout action 是一個標準動作,當以下情況時必須且需要率先使用:

(1)workflow 需要項目庫的代碼副本呀潭,比如構(gòu)建钉迷、測試、或持續(xù)集成這些操作钠署。

(2)workflow 中至少有一個 action是在同一個項目庫下定義的篷牌。

使用示例:

- users:action/checkout@v1

如果你只想淺克隆你的庫,或者只復(fù)制最新的版本踏幻,你可以在 with中使用fetch-depth聲明,例如:

- user:action/checkout@v1
  with:
    fetch-depth:1

引用 action

(1)官方action標準庫: github.com/actions

(2)社區(qū)庫:marketplace

引用公有庫中的 action

引用 action 的格式是{owner}/{repo}@{ref}{owner}/{repo}/{path}@{ref}戳杀,例如上例的中actions/checkout@v1该面,你還可以使用標準庫中的其它 action,如設(shè)置 node 版本:

jobs:

my_first_job:

name: My Job Name

steps:

- uses: actions/setup-node@v1

with:

node-version: 10.x

引用同一個庫中的 action

引用格式:{owner}/{repo}@{ref}./path/to/dir信卡。

例如項目文件結(jié)構(gòu)為:

-- hello-world (repository)

 |__ .github

 └── workflows

 └── my-first-workflow.yml

 └── actions

 |__ hello-world-action

 └── action.yml

當你想要在workflow 中引用自己的action 時可以:

jobs:

build:

runs-on: ubuntu-latest

steps:

# This step checks out a copy of your repository.

- uses: actions/checkout@v1

# This step references the directory that contains the action.

- uses: ./.github/actions/hello-world-action

引用 Docker Hub 上的 container

如果某個 action 定義在了一個docker container image 中且推送到了Docker Hub 上隔缀,你也可以引入它,格式是docker://{image}:{tag} 傍菇,示例:

jobs:

my_first_job:

steps:

- name: My first step

uses: docker://alpine:3.8

更多信息參考:Docker-image.yml workflowCreating a Docker container ``action猾瘸。

構(gòu)建 actions

請參考:building-actions

env

環(huán)境變量可以配置在以下地方:

(1)env

(2)jobs.<job_id>.env

(3)jobs.<job_id>.steps.env

示例:

env:

NODE_ENV: dev


jobs:

job1:

env:

NODE_ENV: test


steps:

- name:

env:

NODE_ENV: prod

如果重復(fù),優(yōu)先使用最近的那個丢习。

if & context

你可以在 jobstep中使用if條件語句牵触,只有滿足條件時才執(zhí)行具體的jobstep :

(1)jobs.<job_id>.if

(2)jobs.<job_id>.steps.if

任務(wù)狀態(tài)檢查函數(shù):

(1)success() : 當上一步執(zhí)行成功時返回 true

(2)always() : 總是返回 true

(3)cancelled() : 當 workflow被取消時返回 true

(4)failure() : 當上一步執(zhí)行失敗時返回 true

例如:

steps:

- name: step1

if: always()


- name: step2

if: success()


- name: step3

if: failure()

意思就是 step1總是執(zhí)行,step2 需要上一步執(zhí)行成功才執(zhí)行咐低,step3 只有當上一步執(zhí)行失敗才執(zhí)行揽思。

${{<expression>}}

上下文和表達式: ${{<expression>}} 。

有時候我們需要與第三方平臺進行交互见擦,這時候通常需要配置一個token钉汗,但是顯然這個 token 不可能明文使用,這種個情況下我們要做的就是:

(1)在具體 repositorySettingsSecrets 中添加一個密鑰鲤屡,如 SOMEONE_TOKEN

(2)然后在workflow中就可以通過 ${{secrets.SOMEONE_TOKEN}}token安全地傳遞給環(huán)境變量损痰。

steps:

- name: My first action

env:

SOMEONE_TOKEN: ${{ secrets.SOMEONE_TOKEN }}

這里的secrets 就是一個上下文,除此之外還有很多酒来,比如:

(1)github.event_name : 觸發(fā)workflow的事件名稱

(2)job.status : 當前job 的狀態(tài)卢未,如 success, failure, or cancelled

(3)steps.<step id>.outputs : 某個 action 的輸出

(4)runner.os : runner的操作系統(tǒng)如 Linux, Windows, or macOS

這里只列舉了少數(shù)幾個。

另外在if 中使用時不需要 ${{}} 符號堰汉,比如:

steps:

- name: My first step

if: github.event_name == 'pull_request' && github.event.action == 'unassigned'

run: echo This event is a pull request that had an assignee removed.

上下文和表達式詳細信息請參考:contexts-and-expression

結(jié)語

最后給個自己寫的示例尝丐,僅供參考:

name: GitHub Actions CI


on: [push]


jobs:

build-test-deploy:

runs-on: ubuntu-latest

strategy:

matrix:

node-version: [8.x, 10.x, 12.x]


steps:

- uses: actions/checkout@v1


- name: install linux packages

run: sudo apt-get install -y --no-install-recommends libevent-dev


- name: install memcached

if: success()

run: |

wget -O memcached.tar.gz http://memcached.org/files/memcached-1.5.20.tar.gz

tar -zxvf memcached.tar.gz

cd memcached-1.5.20

./configure && make && sudo make install

memcached -d


- name: Use Node.js ${{ matrix.node-version }}

uses: actions/setup-node@v1

if: success()

with:

node-version: ${{ matrix.node-version }}


- name: npm install, build, and test

env:

CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

if: success()

run: |

npm ci

npm test

npm run report-coverage

以上就是小編今天帶來的內(nèi)容显拜,小編本身就是一名python開發(fā)工程師,我自己花了三天時間整理了一套python學習教程爹袁,從最基礎(chǔ)的python腳本到web開發(fā)远荠,爬蟲,數(shù)據(jù)分析失息,數(shù)據(jù)可視化譬淳,機器學習,等盹兢,這些資料有想要的小伙伴點擊下方鏈接即可領(lǐng)取
https://docs.qq.com/doc/DTGpFa2lVeE9jUkRv

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邻梆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绎秒,更是在濱河造成了極大的恐慌浦妄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件见芹,死亡現(xiàn)場離奇詭異剂娄,居然都是意外死亡,警方通過查閱死者的電腦和手機玄呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門阅懦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徘铝,你說我怎么就攤上這事耳胎。” “怎么了惕它?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵怕午,是天一觀的道長。 經(jīng)常有香客問我淹魄,道長诗轻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任揭北,我火速辦了婚禮扳炬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搔体。我一直安慰自己恨樟,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布疚俱。 她就那樣靜靜地躺著劝术,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上养晋,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天衬吆,我揣著相機與錄音,去河邊找鬼绳泉。 笑死逊抡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的零酪。 我是一名探鬼主播冒嫡,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼四苇!你這毒婦竟也來了孝凌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤月腋,失蹤者是張志新(化名)和其女友劉穎蟀架,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榆骚,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡片拍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寨躁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡牙勘,死狀恐怖职恳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情方面,我是刑警寧澤放钦,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站恭金,受9級特大地震影響操禀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜横腿,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一颓屑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耿焊,春花似錦揪惦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春纫塌,著一層夾襖步出監(jiān)牢的瞬間诊县,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工措左, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留依痊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓媳荒,卻偏偏與公主長得像抗悍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钳枕,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348