手把手教你如何巧用Github的Action功能

概念

GitHub ActionsGitHub 于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), 真的是非常方便!

image

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目錄, 如下圖所示:

image

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环鲤,入下圖所示:

image

這里我們注意到定義了一個(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文件吵冒。

image

下圖是我執(zhí)行了一次發(fā)布action的結(jié)果,只需2分鐘西剥,無(wú)需科學(xué)上網(wǎng)工具和給命令終端配置代理痹栖,即可完成flutter插件的發(fā)布,真的是非常方便瞭空!

image

如何使用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ā)條件是releasepushpull_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í)行的效果如下:

image

如何使用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ā)下圖的效果:

image

看到上圖的效果湘纵,是不是感到很驚喜,很刺激滤淳?你以為你做白嫖黨我就沒(méi)有辦法治你梧喷?哈哈,給我老實(shí)點(diǎn)!

最后

都看到這兒了铺敌,還不趕緊三連支持一下汇歹,難道你也想做白嫖黨嗎?

更多資訊內(nèi)容适刀,歡迎搜索我的微信公眾號(hào):【我的Android開(kāi)源之旅】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秤朗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笔喉,更是在濱河造成了極大的恐慌取视,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件常挚,死亡現(xiàn)場(chǎng)離奇詭異作谭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)奄毡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)折欠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吼过,你說(shuō)我怎么就攤上這事锐秦。” “怎么了盗忱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵酱床,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我趟佃,道長(zhǎng)扇谣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任闲昭,我火速辦了婚禮罐寨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘序矩。我一直安慰自己鸯绿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布贮泞。 她就那樣靜靜地躺著楞慈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啃擦。 梳的紋絲不亂的頭發(fā)上囊蓝,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音令蛉,去河邊找鬼聚霜。 笑死狡恬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝎宇。 我是一名探鬼主播弟劲,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姥芥!你這毒婦竟也來(lái)了兔乞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凉唐,失蹤者是張志新(化名)和其女友劉穎庸追,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體台囱,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淡溯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了簿训。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咱娶。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖强品,靈堂內(nèi)的尸體忽然破棺而出膘侮,到底是詐尸還是另有隱情,我是刑警寧澤的榛,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布喻喳,位于F島的核電站,受9級(jí)特大地震影響困曙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谦去,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一慷丽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳄哭,春花似錦要糊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至勺拣,卻和暖如春奶赠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背药有。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工毅戈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苹丸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓苇经,卻偏偏與公主長(zhǎng)得像赘理,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扇单,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容