概念
GitHub Actions 是 GitHub 于2018年10月推出的持續(xù)集成服務(wù)藏研。
那么何謂持續(xù)集成呢?
持續(xù)集成
持續(xù)集成(Continuous integration)概行,也就是我們經(jīng)常說(shuō)的CI蠢挡。它是一種軟件開(kāi)發(fā)實(shí)踐,可以讓團(tuán)隊(duì)在持續(xù)的基礎(chǔ)上收到反饋并進(jìn)行改進(jìn)凳忙,不必等到開(kāi)發(fā)后期才尋找和修復(fù)缺陷业踏,常運(yùn)用于軟件的敏捷開(kāi)發(fā)中。Jenkins就是我們常用的持續(xù)集成平臺(tái)工具涧卵。
理解了持續(xù)集成的概念之后勤家,下面我簡(jiǎn)單講一下使用持續(xù)集成的好處:
- 提高效率,減少了重復(fù)性工作:一些重復(fù)性的工作寫(xiě)成腳本交給持續(xù)集成服務(wù)執(zhí)行柳恐。
- 減少了人工帶來(lái)的錯(cuò)誤:機(jī)器通過(guò)預(yù)先寫(xiě)好的腳本執(zhí)行犯錯(cuò)的幾率比人工低很多伐脖。
- 減少等待的時(shí)間:一套完備的持續(xù)集成服務(wù)涵蓋了開(kāi)發(fā)、集成乐设、測(cè)試讼庇、部署等各個(gè)環(huán)節(jié)。
- 提高產(chǎn)品質(zhì)量:很多大公司在代碼提交后都會(huì)有一套代碼檢視腳本(俗稱(chēng)門(mén)禁)來(lái)檢查代碼的提交是否符合規(guī)范近尚,從而從源頭遏制問(wèn)題的產(chǎn)生蠕啄。
Actions
相比較持續(xù)集成這個(gè)大概念,GitHub推出的 Actions 就顯得非常輕量和巧妙了。Actions就相當(dāng)于持續(xù)集成中的某個(gè)特定功能的腳本歼跟,通過(guò)多個(gè)actions的自由組合和媳,便可實(shí)現(xiàn)自己特定功能的持續(xù)集成服務(wù)。
同時(shí)哈街,Github為了方便大家使用 Actions留瞳,還專(zhuān)門(mén)做了一個(gè) Actions市場(chǎng), 真的是非常方便!
GitHub Actions 有一些自己的術(shù)語(yǔ):
- 1.
workflow(工作流程)
:持續(xù)集成一次運(yùn)行的過(guò)程叹卷,就是一個(gè)workflow
撼港。 - 2.
job(任務(wù))
:一個(gè)workflow
由一個(gè)或多個(gè)jobs
構(gòu)成,含義是一次持續(xù)集成的運(yùn)行骤竹,可以完成多個(gè)任務(wù)。 - 3.
step(步驟)
:每個(gè)job
由多個(gè)step
構(gòu)成往毡,一步步完成蒙揣。 - 4.
action(動(dòng)作)
:每個(gè)step
可以依次執(zhí)行一個(gè)或多個(gè)命令(action)。
workflow文件
GitHub Actions 的配置文件叫做workflow
文件开瞭,存放在代碼倉(cāng)庫(kù)的.github/workflows
目錄, 如下圖所示:
workflow
文件采用YAML
格式懒震,文件名可以任意取,但是后綴名統(tǒng)一為.yml
嗤详,比如上圖的package.yml
个扰。
workflow
文件的配置字段非常多,詳見(jiàn)官方文檔 葱色。下面是一些基本字段:
- 1.
name
: workflow的名稱(chēng)递宅。如果省略該字段,默認(rèn)為當(dāng)前workflow的文件名苍狰。 - 2.
on
: 觸發(fā)workflow的條件办龄,通常是某些事件,例如:release
淋昭、push
俐填、pull_request
等。詳細(xì)內(nèi)容可以參照 官方文檔 翔忽。 - 3.
jobs
: workflow文件的主體內(nèi)容英融,表示要執(zhí)行的一項(xiàng)或多項(xiàng)任務(wù)。-
jobs.<job_id>.name
:job_id
是任務(wù)的id歇式,name
是任務(wù)的描述驶悟。 -
jobs.<job_id>.runs-on
:runs-on
運(yùn)行所需要的虛擬機(jī)環(huán)境,它是必填字段。 -
jobs.<job_id>.needs
:needs
指定當(dāng)前任務(wù)的依賴(lài)關(guān)系贬丛,即運(yùn)行順序撩银。 -
jobs.<job_id>.steps
:steps
指定每個(gè)任務(wù)的運(yùn)行步驟,可以包含一個(gè)或多個(gè)步驟豺憔。
-
Actions的應(yīng)用
如何使用Action發(fā)布flutter插件
之前我寫(xiě)過(guò)一篇《Flutter Plugin插件開(kāi)發(fā)填坑指南》 额获,講的就是如何開(kāi)發(fā)一個(gè)flutter插件并進(jìn)行發(fā)布够庙。但由于我們發(fā)布插件到 flutter插件平臺(tái) 需要訪問(wèn)外網(wǎng),而且還需要給命令終端設(shè)置代理抄邀,所以每次的發(fā)布都非常的麻煩耘眨。
一個(gè)偶然的機(jī)會(huì),我就在Action市場(chǎng)中發(fā)現(xiàn)了一個(gè)publish-dart-flutter-package
插件境肾,可以一鍵把自己的插件發(fā)布到 flutter插件平臺(tái) 剔难,腳本如下:
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
當(dāng)然你也可以參考我的flutter_xupdate ,它就是利用這個(gè)Action進(jìn)行發(fā)布的奥喻。
這里我們可以看到偶宫,我們定義的觸發(fā)條件是workflow_dispatch
,也就是手動(dòng)觸發(fā)任務(wù)執(zhí)行:需要我們點(diǎn)擊 Run workflow
=> 選擇 master
分支 => 點(diǎn)擊 Run workflow
环鲤,入下圖所示:
這里我們注意到定義了一個(gè)secrets.CREDENTIAL_JSON
常量纯趋,也就是我們的google賬號(hào)認(rèn)證證書(shū),這里需要我們?cè)陧?xiàng)目的Settings
=> 選擇 Secrets
=> 點(diǎn)擊 New repository secret
來(lái)創(chuàng)建一個(gè)屬性名為CREDENTIAL_JSON
的常量冷离。對(duì)應(yīng)的值你可以到你的用戶(hù)Home目錄下的.pub-cache
文件夾下找到credentials.json
文件吵冒。
下圖是我執(zhí)行了一次發(fā)布action的結(jié)果,只需2分鐘西剥,無(wú)需科學(xué)上網(wǎng)工具和給命令終端配置代理痹栖,即可完成flutter插件的發(fā)布,真的是非常方便瞭空!
如何使用Action打包apk
作為一名Android開(kāi)發(fā)揪阿,你有沒(méi)有想過(guò)每次提交代碼或者發(fā)布版本的時(shí)候,github能夠?qū)?yīng)幫你自動(dòng)打包出一個(gè)apk匙铡?
這樣你既可以省去打包apk的時(shí)間图甜,還免去了應(yīng)用包的管理,豈不美哉鳖眼?
那么我們應(yīng)該怎么做呢黑毅?下面就是我實(shí)現(xiàn)的一個(gè)workflow
腳本,主要的功能就是:在提交代碼或者發(fā)布版本的時(shí)候钦讳,自動(dòng)構(gòu)建腳本打包出apk矿瘦,同時(shí)直接上傳至Artifacts
存儲(chǔ)。
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 "開(kāi)始進(jìn)行release構(gòu)建"
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
詳細(xì)配置可以參考我的XUpdate 中的配置愿卒。
這里我們可以看到缚去,我們定義的觸發(fā)條件是release
,push
和pull_request
琼开,觸發(fā)的分支是master
易结,tags是2.*
開(kāi)頭的。
整個(gè)任務(wù)主要分為4個(gè)步驟:
- 1.
set up JDK 1.8
: 構(gòu)建java1.8的環(huán)境。 - 2.
release apk sign
:配置應(yīng)用的簽名搞动。這里需要注意的是躏精,這個(gè)地方的簽名配置還是需要結(jié)合著build.gradle 文件的配置來(lái)編寫(xiě)的。 - 3.
build with gradle
:編譯構(gòu)建apk鹦肿。運(yùn)行assembleRelease
命令打release包矗烛。 - 4.
upload apk
:上傳apk至Artifacts
。
最后執(zhí)行的效果如下:
如何使用Action來(lái)反擊白嫖黨
我在做開(kāi)源項(xiàng)目的時(shí)候箩溃,經(jīng)常能夠碰到一些個(gè)無(wú)名小號(hào)(白嫖黨)瞭吃,項(xiàng)目看都不看就提一些沒(méi)有任何價(jià)值的
issues
,然后你好心好意地回復(fù)了涣旨,他卻消失不見(jiàn)了...真的是讓人恨得牙癢癢的歪架!
是的,你沒(méi)有看錯(cuò)开泽,Action居然還可以用來(lái)反擊白嫖黨牡拇!這也是之前我在逛掘金的時(shí)候偶然看到一篇文章《? 對(duì)白嫖怪 SAY NO !!! —— 如何在 GitHub 上阻止無(wú)恥白嫖》 發(fā)現(xiàn)的。
那么他是怎么做的呢穆律?其實(shí)也很簡(jiǎn)單,就是設(shè)置觸發(fā)的條件是issues
的創(chuàng)建导俘,在創(chuàng)建的時(shí)候去查詢(xún)一下issues
的創(chuàng)建者是否star
或者fork
了該倉(cāng)庫(kù)峦耘,如果滿(mǎn)足條件則不做處理,否則將自動(dòng)鎖住并關(guān)閉issues
旅薄。
當(dāng)然辅髓,這位作者也是把這個(gè)非常騷的Action做成了一個(gè)插件,插件的地址是:https://github.com/marketplace/actions/no-free-usage-action 少梁,使用起來(lái)非常簡(jiǎn)單洛口。
以下是我簡(jiǎn)單使用的腳本案例:
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提供的臨時(shí)Token,必須在此處進(jìn)行傳遞凯沪,且必須為這個(gè)值第焰。
forked: '--no-forked'
words: To support our project, please file the issue after you starred the repo. Thanks! ??
這里,我設(shè)置的觸發(fā)條件是issues
的打開(kāi)和重新打開(kāi)事件妨马,設(shè)置不強(qiáng)制fork
挺举,但是需要star
。當(dāng)一只野生的白嫖黨出沒(méi)并在你的項(xiàng)目上提issues
的時(shí)候烘跺,就會(huì)觸發(fā)下圖的效果:
看到上圖的效果湘纵,是不是感到很驚喜,很刺激滤淳?你以為你做白嫖黨我就沒(méi)有辦法治你梧喷?哈哈,給我老實(shí)點(diǎn)!
最后
都看到這兒了铺敌,還不趕緊三連支持一下汇歹,難道你也想做白嫖黨嗎?
更多資訊內(nèi)容适刀,歡迎搜索我的微信公眾號(hào):【我的Android開(kāi)源之旅】