GitHub Actions 是 GitHub 於2018年10月推出的持續集成服務。之前我使用的是Travis CI,昨天我體驗了一次GitHub Actions,感覺功能更強大,可以玩的地方更多,我就介紹一下我初次使用的感受。
GitHub Actions 是什麼
GitHub Actions 可以參考的同類對象有Jenkins、Azure Pelines、CircleCI、TravisCI等,都是持續集成(Continuous integration,簡稱CI)服務的提供商,持續集成其實說白了就是根據每次提交的變化不停的在設計、開發、測試、發佈這樣滾動:
而持續集成的流程是由很多步奏組成的,例如先構建準備運行環境、從Git指定分支拉取代碼、編譯打包、運行單元測試、登陸遠程服務器、發佈到第三方等等步奏,GitHub把這些動作都稱之為Action,所以由多個Action構成的工作流就被命名為 GitHub Actions。
為了能讓Actions能夠複用,GitHub還提供了官方市場,可以搜索其他人提交的Action腳本,還有其他人收集的Action倉庫:awesome actions。
GitHub Actions 的構成
GitHub Actions 是由下面幾部分組成的:
- workflow (工作流程):持續集成一次運行的過程,就是一個 workflow。
- job (任務):一個 workflow 由一個或多個 jobs 構成,含義是一次持續集成的運行,可以完成多個任務。
- step(步驟):每個 job 由多個 step 構成,一步步完成。
- action (動作):每個 step 可以依次執行一個或多個命令(action)。
GitHub Actions 工作流文件
想要配置 GitHub Actions 的工作流,我們只需要定義一個YAML文件即可,它存放在代碼倉庫的.github/workflows目錄,例如我的工作流文件:https://github.com/renfei-net/WinterEE/blob/513214d5e7288cee65721c9d05aebdff18d60a04/.github/workflows/build.yml,文件的名字可以自己定義,沒有要求。workflow 的語法字段非常多,可以參見官方文檔。下面是我自己寫的工作流文件:
<code>name: build
on: [push, pull_request]
jobs:
build:
name: building
runs-on: ubuntu-latest
services:
mysql:
image: mysql:5.7
ports:
- 3306:3306
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_DATABASE: winteree
MYSQL_ROOT_PASSWORD: root
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
rabbitmq:
image: rabbitmq:3.7.26-management-alpine
ports:
- 15672:15672
- 5672:5672
zipkin:
image: openzipkin/zipkin:2.21.1
ports:
- 9411:9411
redis:
image: redis:6.0.1
ports:
- 6379:6379
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Verify MariaDB Connection and Load Data
env:
PORT: ${{ job.services.mysql.ports[3306] }}
run: |
while ! mysqladmin ping -h"127.0.0.1" -P"$PORT" --silent; do
sleep 1
done
- name: Loading Database
env:
PORT: ${{ job.services.mysql.ports[3306] }}
run: mysql -h 127.0.0.1 -P $PORT -uroot -proot --default-character-set=utf8 winteree < environment/db/winteree.sql
- name: Cache Maven packages
uses: actions/cache@v2
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Build with Maven
run: mvn -B clean package --file pom.xml
- name: Upload Coveralls
shell: bash
run: |
curl -s https://codecov.io/bash
mvn clean test org.jacoco:jacoco-maven-plugin:prepare-agent install org.jacoco:jacoco-maven-plugin:report
mvn org.eluder.coveralls:coveralls-maven-plugin:report -DrepoToken="${{ secrets.coveralls_token }}"/<code>
GitHub Actions 中使用密碼
密碼是不應該公開在代碼倉庫裡的,所以需要先到項目倉庫的 Settings -> Secrets 中添加你的密碼,例如我添加了名為”COVERALLS_TOKEN“的密碼:
然後在workflow流程文件中使用”${{ secrets.coveralls_token }}“這樣的格式來使用。
GitHub Actions 的徽章圖標
以後,每次修改後推送源碼,GitHub Actions 都會自動運行,那怎麼知道運行的結果呢,GitHub Actions 為我們提供了徽標圖標,可以加入到你的項目主頁中,圖標地址語法如下:
<code>https://github.com/<OWNER>/<REPOSITORY>/workflows/<WORKFLOW_NAME>/badge.svg?branch=<branch-name>/<code>
- <OWNER>:所有者的用戶名
- <REPOSITORY>:項目倉庫名稱
- <WORKFLOW_NAME>:工作流名稱
- <branch-name>:分支名稱,如果不寫默認是master分支
所以我的圖標地址就是:https://github.com/renfei-net/WinterEE/workflows/build/badge.svg
我的使用感受
我之前一直使用的是TravisCI,這次使用了GitHub Actions以後感覺速度比TravisCI快很多,而且支持的東西也比TravisCI多,配置起來也不復雜,可玩性非常高,可以實現非常多自動化的東西,以後我主要就使用GitHub Actions來做CI/CD了。
閱讀更多 任霏 的文章