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
可以定義自己的 name
和id
震肮,通過 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 API
向 GitHub
發(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
必須等待 job1
和 job2
依次成功完成。
每個任務(wù)默認超時時間最長為 360
分鐘革为,你可以通過 timeout-minutes
進行配置:
jobs:
job1:
timeout-minutes:
runs-on & strategy
runs-on
指定了任務(wù)的 runner
即執(zhí)行環(huán)境扭粱,runner
分兩種:GitHub-hosted runner
和 self-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-latest
或 ubuntu-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
聲明了 os
為 windows-latest
時,增加一個 node
和npm
分別使用特定的版本的矩陣環(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
用來刪除特定的配置項浪汪,比如這里當os
為 macos-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 workflow
和Creating 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
你可以在 job
和step
中使用if
條件語句牵触,只有滿足條件時才執(zhí)行具體的job
或 step
:
(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)在具體 repository
庫Settings
的 Secrets
中添加一個密鑰鲤屡,如 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