GitHub Actions 是 GitHub 於2018年10月推出的持續集成服務。
那麼何謂持續集成呢?
持續集成持續集成(Continuous integration),也就是我們經常說的CI。它是一種軟體開發實踐,可以讓團隊在持續的基礎上收到反饋並進行改進,不必等到開發後期才尋找和修復缺陷,常運用於軟體的敏捷開發中。Jenkins就是我們常用的持續集成平臺工具。
理解了持續集成的概念之後,下面我簡單講一下使用持續集成的好處:
提高效率,減少了重複性工作:一些重複性的工作寫成腳本交給持續集成服務執行。減少了人工帶來的錯誤:機器通過預先寫好的腳本執行犯錯的機率比人工低很多。減少等待的時間:一套完備的持續集成服務涵蓋了開發、集成、測試、部署等各個環節。提高產品質量:很多大公司在代碼提交後都會有一套代碼檢視腳本(俗稱門禁)來檢查代碼的提交是否符合規範,從而從源頭遏制問題的產生。Actions相比較持續集成這個大概念,GitHub推出的 Actions 就顯得非常輕量和巧妙了。Actions就相當於持續集成中的某個特定功能的腳本,通過多個actions的自由組合,便可實現自己特定功能的持續集成服務。
同時,Github為了方便大家使用 Actions,還專門做了一個 Actions市場, 真的是非常方便!
GitHub Actions 有一些自己的術語:
1.workflow(工作流程):持續集成一次運行的過程,就是一個workflow。2.job(任務):一個workflow由一個或多個jobs構成,含義是一次持續集成的運行,可以完成多個任務。3.step(步驟):每個job由多個step構成,一步步完成。4.action(動作):每個step可以依次執行一個或多個命令(action)。workflow文件GitHub Actions 的配置文件叫做workflow文件,存放在代碼倉庫的.github/workflows目錄, 如下圖所示:
workflow文件採用YAML格式,文件名可以任意取,但是後綴名統一為.yml,比如上圖的package.yml。
workflow文件的配置欄位非常多,詳見官方文檔 。下面是一些基本欄位:
1.name: workflow的名稱。如果省略該欄位,默認為當前workflow的文件名。2.on: 觸發workflow的條件,通常是某些事件,例如:release、push、pull_request等。詳細內容可以參照 官方文檔 。3.jobs: workflow文件的主體內容,表示要執行的一項或多項任務。jobs.<job_id>.name: job_id是任務的id,name是任務的描述。jobs.<job_id>.runs-on: runs-on運行所需要的虛擬機環境,它是必填欄位。jobs.<job_id>.needs: needs指定當前任務的依賴關係,即運行順序。jobs.<job_id>.steps: steps指定每個任務的運行步驟,可以包含一個或多個步驟。Actions的應用如何使用Action發布flutter插件之前我寫過一篇《Flutter Plugin插件開發填坑指南》 ,講的就是如何開發一個flutter插件並進行發布。但由於我們發布插件到 flutter插件平臺 需要訪問外網,而且還需要給命令終端設置代理,所以每次的發布都非常的麻煩。
一個偶然的機會,我就在Action市場中發現了一個publish-dart-flutter-package插件,可以一鍵把自己的插件發布到 flutter插件平臺 ,腳本如下:
name: Pub Publish plugin
on: workflow_dispatch
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Publish
uses: sakebook/actions-flutter-pub-publisher@v1.3.0
with:
credential: ${{ secrets.CREDENTIAL_JSON }}
flutter_package: true
skip_test: true
dry_run: false當然你也可以參考我的flutter_xupdate ,它就是利用這個Action進行發布的。
這裡我們可以看到,我們定義的觸發條件是workflow_dispatch,也就是手動觸發任務執行:需要我們點擊 Run workflow => 選擇 master 分支 => 點擊 Run workflow,如下圖所示:
這裡我們注意到定義了一個secrets.CREDENTIAL_JSON常量,也就是我們的google帳號認證證書,這裡需要我們在項目的Settings => 選擇 Secrets => 點擊 New repository secret來創建一個屬性名為CREDENTIAL_JSON的常量。對應的值你可以到你的用戶Home目錄下的.pub-cache文件夾下找到credentials.json文件。
下圖是我執行了一次發布action的結果,只需2分鐘,無需科學上網工具和給命令終端配置代理,即可完成flutter插件的發布,真的是非常方便!
如何使用Action打包apk作為一名Android開發,你有沒有想過每次提交代碼或者發布版本的時候,github能夠對應幫你自動打包出一個apk?
這樣你既可以省去打包apk的時間,還免去了應用包的管理,豈不美哉?
那麼我們應該怎麼做呢?下面就是我實現的一個workflow腳本,主要的功能就是:在提交代碼或者發布版本的時候,自動構建腳本打包出apk,同時直接上傳至Artifacts存儲。
name: Android CI
on:
release:
types: [published]
push:
branches:
- master
tags:
- '2.*'
pull_request:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: release apk sign
run: |
echo "給apk增加籤名"
cp $GITHUB_WORKSPACE/.github/workflows/android.keystore $GITHUB_WORKSPACE/app/android.keystore
sed '$a\RELEASE_STORE_FILE=./android.keystore' $GITHUB_WORKSPACE/gradle.properties -i
- name: build with gradle
run: |
echo "開始進行release構建"
chmod +x gradlew
./gradlew app:assembleRelease
- name : upload apk
uses: actions/upload-artifact@master
if: always()
with:
name: xupdate_apk
path: ${{ github.workspace }}/app/build/outputs/apk/release詳細配置可以參考我的XUpdate 中的配置。
這裡我們可以看到,我們定義的觸發條件是release,push和pull_request,觸發的分支是master,tags是2.*開頭的。
整個任務主要分為4個步驟:
1.set up JDK 1.8:構建java1.8的環境。2.release apk sign:配置應用的籤名。這裡需要注意的是,這個地方的籤名配置還是需要結合著build.gradle 文件的配置來編寫的。3.build with gradle:編譯構建apk。運行assembleRelease命令打release包。4.upload apk:上傳apk至Artifacts。最後執行的效果如下:
如何使用Action來反擊白嫖黨我在做開源項目的時候,經常能夠碰到一些個無名小號(白嫖黨),項目看都不看就提一些沒有任何價值的issues,然後你好心好意地回復了,他卻消失不見了...真的是讓人恨得牙痒痒的!
是的,你沒有看錯,Action居然還可以用來反擊白嫖黨!這也是之前我在逛掘金的時候偶然看到一篇文章《❌ 對白嫖怪 SAY NO !!! —— 如何在 GitHub 上阻止無恥白嫖》 發現的。
那麼他是怎麼做的呢?其實也很簡單,就是設置觸發的條件是issues的創建,在創建的時候去查詢一下issues的創建者是否star或者fork了該倉庫,如果滿足條件則不做處理,否則將自動鎖住並關閉issues。
當然,這位作者也是把這個非常騷的Action做成了一個插件,插件的地址是:https://github.com/marketplace/actions/no-free-usage-action ,使用起來非常簡單。
以下是我簡單使用的腳本案例:
name: No Free usage issue checker
on:
issues:
types: [opened, reopened]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Check issue actor
uses: fluttercandies/no-free-usage-action@v1.0.1
with:
token: ${{ secrets.GITHUB_TOKEN }} # 由GitHub提供的臨時Token,必須在此處進行傳遞,且必須為這個值。
forked: '--no-forked'
words: To support our project, please file the issue after you starred the repo. Thanks! 🙂這裡,我設置的觸發條件是issues的打開和重新打開事件,設置不強制fork,但是需要star。當一隻野生的白嫖黨出沒並在你的項目上提issues的時候,就會觸發下圖的效果:
看到上圖的效果,是不是感到很驚喜,很刺激?你以為你做白嫖黨我就沒有辦法治你?哈哈,給我老實點!
最後都看到這兒了,還不趕緊三連支持一下,難道你也想做白嫖黨嗎?
更多資訊內容,歡迎搜索我的微信公眾號:【我的Android開源之旅】