我們一起Github Action 入門
本文轉(zhuǎn)載自微信公眾號「老王Plus」,作者老王Plus的老王。轉(zhuǎn)載本文請聯(lián)系老王Plus公眾號。
Github Action,是 Github 推出的一個持續(xù)集成服務。
這個持續(xù)集成,有很多操作,例如:抓取代碼、運行測試、登錄遠程服務器,發(fā)布到第三方服務等等。就我自己而言,用的最多的是自動生成 Nuget 包并自動發(fā)布到 Nuget。這樣,我可以只關心代碼本身,代碼完成后,Push 到倉庫,后面就由 Action 去自動完成了。
這篇文章,我會從零開始,介紹一下 Action 的創(chuàng)建和使用。
一、在 Dotnet 工程中加入一個 Github Action
我們在 Github 上創(chuàng)建一個簡單的 Dotnet 應用??匆幌履夸浗Y(jié)構(gòu):
- % tree -a .
- .
- ├── .gitignore
- ├── GithubActionSample.sln
- ├── README.md
- ├── src
- │ ├── GithubActionSample.csproj
- │ └── Program.cs
- └── tests
初始基本就是這么個樣子。通常我會加入幾個文件:README.md,用來寫個說明;.gitignore,這個是提交時,定義跳過某些文件的定義,比方 bin、obj 下面的文件,是不需要提交上去的;tests 目錄,里面是測試代碼。當然,這兒我就省了。
Github Action 需要放在一個固定位置 - 在 Git 倉庫的根目錄中。
我們創(chuàng)建一個 .github 的目錄,并在里面創(chuàng)建一個 workflows 的子目錄。這就是我們要創(chuàng)建 Action 的目錄了。注意,這個目錄名稱和結(jié)構(gòu)不能改變。Github 會在這個位置查找工作流配置。
下面,我們在這個位置創(chuàng)建一個 Action 的定義。Action 要求是 YAML 文件。關于這個文件的格式,后面會講到。
這個目錄下,可以創(chuàng)建多個 YAML 文件,對應多個工作流的配置,每個工作流配置,對應不同的自動化需求。
我們先創(chuàng)建一個 Action,用來自動編譯代碼,文件名叫 Build.yml。完成后,看一下目錄結(jié)構(gòu):
- % tree -a .
- .
- ├── .github
- │ └── workflows
- │ └── Build.yml
- ├── .gitignore
- ├── GithubActionSample.sln
- ├── README.md
- ├── src
- │ ├── GithubActionSample.csproj
- │ └── Program.cs
- └── tests
這就是一個 Action 了。
下面,我們來一步步完成這個 Action 的配置。
二、完成 Action 配置
完成 Action 配置,其實就是完成上面這個 Build.yml 文件的內(nèi)容。
1. 指定 Action 名稱
先說明一下,按照 Github 的說明,這個名稱不是必須的。不過通常來說,我會習慣加個名稱。根據(jù)文件名判斷作用,不是個好習慣。
格式很簡單:
- name: Sample build
2. 配置觸發(fā)器
觸發(fā)器,是用來定義這個 Action 在什么情況下被運行。
通常來說,會有幾種選擇:
- 單個事件,比方提交代碼 Push 的時候,寫法是:
- on: push
- 多個事件,比方 Push 和 Pull Request 的時候,寫法是:
- on: [push, pull_request]
有時候,我們還需要增加更多的條件,比方 Push 和 Pull Request 到主分支的時候:
- on:
- push:
- branches:
- - main
- pull_request:
- branches:
- - main
還有一個非常有用的觸發(fā)器,就是定時器。比方我們要在特定的時間,或特定的周期下運行這個 Action,就可以用定時器。
定時器的寫法是:
- on:
- schedule:
- - cron: '5 * * * *'
這個定時器,采用的是 Linux 下 Cron 的定時器寫法。具體的寫法和含義,可以去查一下 Cron 的規(guī)則。
除此之外,還有一些更高級的用法,例如根據(jù)一個 Action 的結(jié)果,來觸發(fā)另一個 Action 的執(zhí)行。類似于這樣的,可以去 Github 的文檔中詳細了解,這里是傳送門。上面介紹的三種方式,在大多數(shù)情況下夠用了。
在我們今天的例子中,我們希望在提交后觸發(fā)編譯。所以,我們采用第一種:
- on:
- push:
- branches:
- - main
觸發(fā)器定義完了,下面該定義做什么了。在 Action 中,稱為任務 Jobs。
3. 定義任務 Jobs
在規(guī)則中,一個觸發(fā)器,可能對應多個任務,每個任務都需要有一個ID,和一個名稱。
- jobs:
- first_job:
- name: First job
- second_job:
- name: Second job
上面的例子,first_job 是ID,要求是一個詞,可以使用下劃線。而下面 First job 是名稱。跟 Action 的名稱一樣,可以省略不寫。
對于一個任務,下面又需要配置運行環(huán)境和步驟。
運行環(huán)境,指得是 Action 需要運行的外部操作系統(tǒng),說白了,是 Github 給提供的虛擬機。當然,我們自己建立 VM 來運行也是可以的,不過通常就使用 Github 托管的VM了。有三種選擇:Windows、Ubuntu Linux、macOS。
運行環(huán)境,用 runs-on 來標出:
- jobs:
- first_job:
- name: First job
- runs-on: windows
步驟,是定義做這件事需要幾個步驟。每個步驟需要單獨列出。Action 執(zhí)行時,會按這個步驟一行一行執(zhí)行。
直接看例子:
- steps:
- - uses: actions/checkout@v2
- - name: Setup .NET SDK
- uses: actions/setup-dotnet@v1
- with:
- dotnet-version: 5.0.x
- - name: Restore
- run: dotnet restore
- - name: Build
- run: dotnet build --configuration Release --no-restore
這是一個簡單的步驟例子。
第一步,用了 actions/checkout@v2,這是 GitHub Action 的公共操作,用來簽出代碼。
第二步,創(chuàng)建編譯環(huán)境。在 runs-on 給出的 VM 是空的,需要我們自己建立環(huán)境。不過不需要像重新安裝一個環(huán)境那樣做。Github 給出了固定的環(huán)境創(chuàng)建方法。在這里,我們使用了 actions/setup-dotnet@v1 在環(huán)境里配置 Dotnet SDK,并定義了 SDK 的版本是 5.0 。
后面兩個步驟,需要在環(huán)境中運行命令,所以使用了 run 關鍵字。這兩個步驟,其實就是我們在命令行下生成并編譯代碼的兩個命令。
最后,看一下完整的 Build.yml:
- name: Sample Build
- on:
- push:
- branches:
- - main
- jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Setup .NET SDK
- uses: actions/setup-dotnet@v1
- with:
- dotnet-version: 5.0.x
- - name: Restore
- run: dotnet restore
- - name: Build
- run: dotnet build --configuration Release --no-restore
三、運行 Action
配置完成,下面就是運行了。
運行是在 Github 上面,當然先要提交代碼了。提交到 Github,Action 就會按照我們設定的方式運行了。
本文的代碼在:https://github.com/humornif/GithubActionSample