學習資源:
學習 Actions
記錄學習 Github Actions 的筆記。
學習資料:使用 GitHub 操作 自動化工作流程
1 GitHub 操作使用入門
GitHub 操作 可讓您直接在 GitHub 倉庫中創(chuàng)建自定義的軟件開發(fā)生命周期工作流程。GitHub 操作的核心概念:
- Workflow:工作流程是您可以在倉庫中創(chuàng)建的自定義自動化的流程旱函,用于在 GitHub 上構建王污、測試、封裝蔬顾、發(fā)行或部署任何代碼項目宴偿。Workflows 由一個或者多個 jobs 組成 并且可以借由 event 部署和激活。
- Workflow run:workflow 的一個在 pre-configured event 發(fā)生時運行的實例诀豁。您可以看到每個工作流運行的作業(yè)窄刘、操作、日志和狀態(tài)舷胜。
- Workflow file:使用至少一個作業(yè)定義的工作流配置(configuration)的
YAML
文件娩践。此文件位于 GitHub 存儲庫的根目錄中的.github/workflows
位置。 - Job:作業(yè)(或稱為任務)是由 step 組成的 task 定義烹骨。每個作業(yè)均在虛擬環(huán)境的新實例中運行翻伺。您可以定義工作流文件中作業(yè)的運行方式的依賴項規(guī)則。作業(yè)可以并行運行沮焕,也可以依賴于上一個作業(yè)的狀態(tài)吨岭,按順序運行。例如峦树,工作流可以有兩個順序作業(yè): build 和 test辣辫,其中測試作業(yè)取決于生成作業(yè)的狀態(tài)簿废。如果生成作業(yè)失敗,則測試作業(yè)將不會運行络它。
- Step:步驟是作業(yè)執(zhí)行的一組任務族檬。作業(yè)中的每個步驟都在同一虛擬環(huán)境中執(zhí)行,允許該作業(yè)中的操作使用文件系統(tǒng)共享信息化戳。步驟可以通過
commands
或者actions
運行单料。 - Action:操作作為創(chuàng)建作業(yè)的步驟合并的獨立任務。操作是工作流中最小的可移植構建基塊点楼。您可以創(chuàng)建自己的操作扫尖,使用從 GitHub 社區(qū)共享的操作,以及自定義公共操作掠廓。要在工作流中使用操作换怖,必須將其作為步驟包含在內(nèi)。
- Continuous integration (CI):持續(xù)集成通過提供有關代碼更改的即時反饋來更快地檢測和解決 Bug蟀瞧,從而節(jié)省了開發(fā)人員的時間沉颂。
- Continuous deployment (CD):持續(xù)部署基于持續(xù)集成。提交新代碼并通過 CI 測試時悦污,代碼將自動部署到生產(chǎn)中铸屉。使用 GitHub ,您可以創(chuàng)建自定義 CD 工作流切端,以自動將代碼部署到存儲庫中的任何云彻坛、自托管服務或平臺。CD 通過自動化部署過程并更快地向客戶部署經(jīng)過測試踏枣、穩(wěn)定的代碼更改來節(jié)省開發(fā)人員的時間昌屉。
- Virtual environment:GitHub 托管(hosts) Linux、macOS 和 Windows 虛擬環(huán)境以運行工作流茵瀑。
- Runner:在每個虛擬環(huán)境中等待可用作業(yè)的 GitHub 服務间驮,當 Runner 拾取作業(yè)時,它將運行作業(yè)的操作瘾婿,并將進度蜻牢、日志和最終結果報告回 GitHub。Runner 一次運行一個作業(yè)偏陪。
- Event:觸發(fā)(triggers)工作流運行的特定活動抢呆。例如,當有人將提交推送到存儲庫或創(chuàng)建問題或拉取請求時笛谦,活動可能來自 GitHub抱虐。您還可以將工作流配置為在使用存儲庫調(diào)度 Webhook 發(fā)生外部事件時運行。
- Artifact:項目(構件或工件)是生成(build)和測試(test)代碼時創(chuàng)建的文件饥脑。例如恳邀,項目可能包括二進制文件或包文件懦冰、測試結果、屏幕截圖或日志文件谣沸。項目與創(chuàng)建項目的位置的工作流運行相關聯(lián)刷钢,并且可以由其他作業(yè)使用或部署。
2 配置 worflow
如果您對某倉庫具有寫入或管理員權限乳附,您可以創(chuàng)建内地、查看或編輯該倉庫的工作流程。您可以根據(jù)工作流程中包含的操作類型自定義工作流程配置赋除。
您可以在倉庫中創(chuàng)建多個工作流程阱缓,但是必須將工作流程存儲在倉庫根目錄的 .github/workflows
目錄中。
工作流程必須至少有一項作業(yè)举农,并且作業(yè)包含一組用于執(zhí)行個別任務的步驟荆针。 步驟可以運行命令或使用操作。
您可以配置工作流程在 GitHub 事件發(fā)生時開始颁糟,按時間表開始航背,或者由外部事件觸發(fā)。
您需要使用 YAML
語法配置工作流程滚停,并將其在倉庫中存儲為工作流程文件沃粗。 在成功創(chuàng)建 YAML
工作流程文件并觸發(fā)工作流程后,您會看到工作流程每個步驟的創(chuàng)建日志键畴、測試結果、構件和狀態(tài)突雪。
2.1 創(chuàng)建工作流程文件
添加工作流程文件的步驟如下:
- 在倉庫根目錄創(chuàng)建目錄 .
github/workflows
并在此目錄下新建文件.yml
起惕。 例如 .github/workflows/continuous-integration-workflow.yml
。 - 使用“GitHub 操作 的工作流程語法”參考文檔選擇可觸發(fā)操作的事件咏删、添加操作以及自定義工作流程惹想。
- 將您在工作流程文件中的更改提交到您希望其中運行工作流程的分支。
2.1.1 通過事件觸發(fā)工作流程
事件:
- GitHub 上的事件督函,例如有人推送提交到倉庫或者創(chuàng)建議題或拉取請求時嘀粱。
- 安排或計劃的事件。
- 外部事件發(fā)生辰狡。
要在 GitHub 上通過事件觸發(fā)工作流程锋叨,請在工作流程名稱后面添加 on:
(指定觸發(fā) workflow 的條件,通常是某些事件)和事件值(如 push)宛篇。例如娃磺,工作流程在更改推送到倉庫中的任何分支時觸發(fā):
name: descriptive-workflow-name
on: push
on 字段也可以是事件的數(shù)組:
on: [push, pull_request]
要計劃工作流程的運行,可以在工作流程文件中使用 POSIX cron
語法叫倍。 例如偷卧,工作流程每小時觸發(fā)一次:
on:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '0 * * * *'
下面的例子表示設定 workflow 運行的時間為周一至周五的 2:00 UTC 時間:
on:
schedule:
- cron: "0 2 * * 1-5"
要在外部事件發(fā)生后觸發(fā)工作流程豺瘤,您可以回調(diào)“創(chuàng)建倉庫分發(fā)事件”REST API 端點來調(diào)用 repository_dispatch
web 掛鉤事件。 更多信息參閱 "Create a repository dispatch event" in GitHub 開發(fā)者文檔听诸。
更多信息和示例請參閱“觸發(fā)工作流程的事件”坐求。
2.1.2 過濾特定分支
您可以設置工作流程僅在特定分支上運行。
例如晌梨,工作流程限定在 master
分支上發(fā)生推送時運行:
on:
push:
branches:
- master
# file paths to consider in the event. Optional; defaults to all.
paths:
- test/*
有關在工作流程中引用分支的更多信息瞻赶,請參閱“GitHub 操作 的工作流程語法”。
2.1.3 選擇虛擬環(huán)境
您可以在 GitHub 托管的虛擬機上或者 Docker 容器中運行工作流程派任≡已罚可以為工作流程中的每項作業(yè)指定虛擬環(huán)境。
要指定想在其中運行工作流程的虛擬環(huán)境的操作系統(tǒng)掌逛、工具师逸、軟件包和設置,必須在工作流程文件中使用特殊語法豆混。更多信息請參閱“GitHub 操作 的虛擬環(huán)境”篓像。
您可以選擇不同類型和版本的虛擬主機,包括 Ubuntu皿伺、Linux 和 macOS员辩。 工作流程中的每項作業(yè)在同一虛擬環(huán)境中執(zhí)行,讓該作業(yè)中的操作使用文件系統(tǒng)共享信息鸵鸥。
要在全新的虛擬環(huán)境實例上運行作業(yè)奠滑,可以指定虛擬主機運行作業(yè):
runs-on: ubuntu-18.04
有關詳細信息,包括支持的版本妒穴,請參閱“GitHub 操作 的工作流程語法”宋税。
2.1.4 配置構建矩陣
要同時在多個操作系統(tǒng)、平臺和語言版本上測試讼油,可以配置構建矩陣杰赛。構建矩陣提供不同的配置供虛擬環(huán)境測試。 例如矮台,工作流程可為多個支持的語言乏屯、操作系統(tǒng)或工具版本運行作業(yè)。對于每項配置瘦赫,將運行作業(yè)的副本并報告狀態(tài)辰晕。您可以使用矩陣在 strategy:
下列出配置選項,在工作流程文件中指定構建矩陣耸彪。
例如伞芹,構建矩陣將通過不同版本的 Node.js
、Ubuntu
和 Linux
操作系統(tǒng)運行作業(yè):
strategy:
matrix:
node: [6, 8, 10]
os: [ubuntu-14.04, ubuntu-18.04]
2.1.5 使用檢出(checkout)操作
在工作流程中可以使用多個標準操作。檢出操作是標準操作唱较,在以下情況下扎唾,在工作流程中必須位于其他操作前面:
- 工作流程需要倉庫代碼的副本,比如在創(chuàng)建并測試倉庫或使用持續(xù)集成時南缓。
- 工作流程中至少有一項操作在同一倉庫中定義胸遇。 更多信息請參閱“在工作流程中引用操作”。
要使用標準檢出操作而不做進一步的指定汉形,請包含此步驟:
<br />- uses: actions/checkout@v1
此示例中使用 v1
確保您使用檢出操作的穩(wěn)定版本纸镊。
要淺層克隆倉庫,或者只復制倉庫的最新版本概疆,請使用 with
語法設置 fetch-depth
:
- uses: actions/checkout@v1
with:
fetch-depth: 1
更多信息請參閱檢出操作逗威。
2.1.6 選擇用于工作流程的操作類型
您可以根據(jù)項目需求在工作流程中使用不同類型的操作:
- Docker 容器操作
- JavaScript 操作
更多信息請參閱“關于操作”。
選擇要在工作流程中使用的操作類型時岔冀,建議探索公共倉庫中或 Docker Hub 上的現(xiàn)有操作凯旭,并根據(jù)需要為項目自定義這些操作。
您可以在 github.com/actions 組織中找到并使用 GitHub 創(chuàng)建的操作使套。 要訪問 Docker Hub罐呼,請參閱 Docker 網(wǎng)站上的“Docker Hub”。
2.1.7 在工作流程中引用操作
要在工作流程文件中使用正確的語法引用操作侦高,必須考慮定義操作的位置嫉柴。工作流程可以使用以下位置定義的操作:
- 公共倉庫
- 工作流程文件引用操作的同一倉庫
- Docker Hub 上發(fā)布的 Docker 容器圖像
要使用私人倉庫中定義的操作,工作流程文件和操作必須在同一倉庫中奉呛。您的工作流程不能使用在其他私人倉庫中定義的操作计螺,即使該倉庫在同一組織中。為使工作流程在操作有更新時也保持穩(wěn)定侧馅,您可以在工作流程文件中指定 Git 引用或 Docker 標記號以引用所用操作的版本危尿。
從公共倉庫引用操作:如果操作定義在公共倉庫中,必須使用語法 {owner}/{repo}@{ref}
或 {owner}/{repo}/{path}@{ref}
引用操作馁痴。
jobs:
my_first_job:
name: My Job Name
steps:
- uses: actions/setup-node@v1
with:
node-version: 10.x
要查看完整的工作流程示例,請參閱設置節(jié)點模板倉庫肺孤。下面簡單列出一些說明:
jobs.<job_id>.steps.name:步驟名稱罗晕。
jobs.<job_id>.steps.run:該步驟運行的命令或者 action。
jobs.<job_id>.steps.env:該步驟所需的環(huán)境變量赠堵。
再看一個完整的例子:
name: Greet Everyone
# This workflow is triggered on pushes to the repository.
on: [push]
jobs:
build:
# 作業(yè)名稱為 Greeting
name: Greeting
# 此作業(yè)在 Linux 上運行
runs-on: ubuntu-latest
steps:
# 此步驟使用 GitHub 的 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
# 此步驟打印上一步操作的輸出(時間)小渊。
- name: Echo the greeting's time
run: echo 'The time was ${{ steps.hello.outputs.time }}.'
在工作流程文件使用操作的同一倉庫中引用操作:如果操作在工作流程文件使用該操作的同一倉庫中定義,您可以在工作流程文件中通過 ?{owner}/{repo}@{ref}
或 ./path/to/dir
語法引用操作茫叭。
示例倉庫文件結構:
.github
└── workflows
└── my-first-workflow.yml
.
└── hello-world-action
└── action.yml
示例工作流程文件:
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: ./hello-world-action
引用 Docker Hub 上的容器:如果操作在 Docker Hub 上發(fā)布的 Docker 容器的鏡像中定義酬屉,您必須在工作流程文件中通過 docker://{image}:{tag}
語法引用操作。為保護代碼和數(shù)據(jù),強烈建議先驗證 Docker Hub 中 Docker 容器鏡像的完整性后再將其用于工作流程呐萨。
jobs:
my_first_job:
steps:
- name: My first step
uses: docker://alpine:3.8
有關 Docker 操作的部分示例杀饵,請參閱 Docker-image.yml 工作流程或 Docker 操作倉庫。
2.2 創(chuàng)建多個任務的 workflow
workflow 文件的主體是 jobs
字段谬擦,表示要執(zhí)行的一項或多項任務切距。
jobs
字段里面,需要寫出每一項任務的 job_id
惨远,具體名稱自定義谜悟。job_id
里面的 name
字段是任務的說明。比如:
jobs:
first_job:
name: My first job
second_job:
name: My second job
上面代碼的 jobs
字段包含兩項任務北秽,job_id
分別是 first_job 和 second_job葡幸。
有時,我們需要創(chuàng)建有依賴關系的任務贺氓,此時需要借助 needs
字段:
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
上面代碼中蔚叨,job1 必須先于 job2 完成,而 job3 等待 job1 和 job2 的完成才能運行掠归。因此缅叠,這個 workflow 的運行順序依次為:job1、job2虏冻、job3肤粱。
2.3 將工作流程狀態(tài)徽章添加到您的倉庫
狀態(tài)徽章顯示工作流程目前失敗還是通過。 添加狀態(tài)徽章的常見位置是倉庫的 README.md 文件厨相,但也可將其添加到您喜歡的任何網(wǎng)頁领曼。 徽章顯示默認分支(通常是 master)的狀態(tài)。 您也可以在 URL 中使用 branch 和 event 查詢參數(shù)顯示特定分支或事件運行的工作流程狀態(tài)蛮穿。具體的格式:
https://github.com/<OWNER>/<REPOSITORY>/workflows/<WORKFLOW_NAME>/badge.svg
2.4 為操作創(chuàng)建自述文件
如果計劃公開分享您的操作庶骄,建議創(chuàng)建自述文件以幫助人們了解如何使用您的操作。 您可以將此信息包含在 README.md
中:
- 操作的詳細描述
- 必要的輸入和輸出變量
- 可選的輸入和輸出變量
- 操作使用的密碼
- 操作使用的環(huán)境變量
- 如何在工作流程中使用操作的示例
- 配置工作流程
- 管理工作流程運行
- GitHub 操作的工作流程語法
- 觸發(fā)工作流程的事件
- GitHub 操作的虛擬環(huán)境
- Software in virtual environments for GitHub Actions
- Contexts and expression syntax for GitHub Actions