Github Actions 入門指南及實(shí)踐
自從 github 提供了 github actions 后,個(gè)人或者依賴于 github 的公司可以考慮把持續(xù)集成方案遷到 github actions。
github 會(huì)提供一個(gè)以下配置的服務(wù)器做為 runner,可以說相當(dāng)良心了。
- 2-core CPU
- 7 GB of RAM memory
- 14 GB of SSD disk space
另外如果你有網(wǎng)絡(luò)時(shí)延的需求,(比如推送及拉取鏡像時(shí)產(chǎn)生的網(wǎng)絡(luò)時(shí)延),你也可以自建 runner。
本文將介紹 github actions 的用法,以及如何使用它自動(dòng)部署個(gè)人博客或者前端應(yīng)用
快速開始
在 github 上進(jìn)入個(gè)人倉(cāng)庫(kù),找到 Actions 的標(biāo)簽頁
Actions
如果你是一個(gè)前端項(xiàng)目,可以使用 Node.js 的模板,點(diǎn)擊 Set up this workflow
Actions Setup
此時(shí)生成了一個(gè)文件 .github/workflows/nodejs.yaml,修改內(nèi)容如下
- name: Git Action Test
- on: [push]
- jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v1
- - name: Use Node.js 10.x
- uses: actions/setup-node@v1
- with:
- node-version: 10.x
- - name: npm install, build
- run: |
- npm install
- npm run build --if-present
- env:
- CI: true
執(zhí)行 git push 操作,此時(shí)可以在 github 的 Actions 標(biāo)簽頁看到執(zhí)行結(jié)果
Actions Start
術(shù)語
runner: github 分配的用來執(zhí)行 CI/CD 的構(gòu)建服務(wù)器 (也可以自建 runner)
workflow: CI/CD 的工作流
job: 任務(wù),比如構(gòu)建,測(cè)試和部署。每個(gè) workflow 由多個(gè) job 組成
step: 每個(gè) job 由多個(gè) step 組成
配置
參考官方文檔: Workflow syntax for GitHub Actions[1]
以下是常用到的配置
on
該 CI/CD 觸發(fā)時(shí)的事件。如果需要上傳代碼自動(dòng)部署的功能時(shí),應(yīng)該選擇 on: push
- on: push
更多事件可以參考官方文檔 Events that trigger workflows[2]
另外,我們可以利用 issues 事件做很多事情,如郵件通知之類
如果是 Issue 類博客,則可以通過監(jiān)聽 issues.opened 事件,調(diào)用 github api,自動(dòng)生成網(wǎng)址博客
- on:
- issues:
- types: [opened, edited, milestoned]
jobs
一個(gè) CI/CD 的工作流有許多 jobs 組成,比如最典型的 job 是 lint,test,build 或者 deploy。
- jobs:
- test:
- build:
- deploy:
所有的 job 都是并行的,但往往會(huì)有依賴關(guān)系:「你總得通過測(cè)試了,才能再去部署吧」
jobs.<job_id>.needs
needs 確定 job 的依賴關(guān)系
- jobs:
- test:
- deploy:
- needs: test
jobs.<job_id>.runs-on
當(dāng)你使用 github actions 時(shí),github 會(huì)十分大方的給你分配一個(gè)配置還不錯(cuò)的服務(wù)器作為構(gòu)建服務(wù)器,用來跑你的 workflow
- 2-core CPU
- 7 GB of RAM memory
- 14 GB of SSD disk space
恩,比我自己的服務(wù)器要強(qiáng)
使用 runs-on 指定服務(wù)器系統(tǒng),用的最多的應(yīng)該就是 ubuntu-latest 了
- runs-on: ubuntu-latest
- runs-on: windows-latest
jobs.<job_id>.steps
即某個(gè)任務(wù)的一系列動(dòng)作,如部署一個(gè)前端需要安裝依賴,編譯代碼等等
jobs.<job_id>.steps.name
為 step 指定一個(gè)名稱,將會(huì)在 github action 的控制臺(tái)中顯示
jobs.<job_id>.steps.run
該 step 需要在 shell 中執(zhí)行的命令
- # 單行
- - name: Install Dependencies
- run: npm install
- # 多行
- - name: Install and Build
- run: |
- npm install
- npm run build
jobs.<job_id>.steps.uses
選擇一個(gè) action,可以理解為若干 steps.run,有利于代碼復(fù)用。這也是 github action 最主要的功能。
如果你想找一個(gè)好用的 github action,可以在 github marketplace 瀏覽并檢索
這是一個(gè)在當(dāng)前操作系統(tǒng)中安裝 node:10 的 action 示例
- - name: use Node.js 10.x
- uses: actions/setup-node@v1
- with:
- node-version: 10.x
當(dāng)然,這里怎么能少得了 docker 的身影呢,在 actions 中也可以使用 docker。如果對(duì) docker 不太了解,可以看我的文章: docker 簡(jiǎn)易入門[3]
以下是 npm install 的一個(gè)示例
- jobs:
- build:
- steps:
- - name: Install
- uses: docker://node:alpine
- with:
- args: npm install
secret and context
如何在 github action 上訪問敏感數(shù)據(jù)?如使用 ssh 登錄時(shí)如何維護(hù)密碼。
我們可以在 github repo 上依次點(diǎn)擊 Settings -> Secrets 設(shè)置 secret
Actions Secrect
- - name: setup aliyun oss
- uses: manyuanrong/setup-ossutil@master
- with:
- endpoint: oss-cn-beijing.aliyuncs.com
- access-key-id: ${{ secrets.OSS_KEY_ID }}
- access-key-secret: ${{ secrets.OSS_KEY_SECRET }}
這里的 secret 就是一種 context,描述 CI/CD 一個(gè) workflow 中的上下文信息,使用 ${{ expression }} 語法表示。除了 secret,還有
- github: workflow 的信息,如 github.sha 可以獲取當(dāng)前的 commit SHA,我們可以利用它為 sentry 或者 docker image 打入版本號(hào)
- env: 環(huán)境變量
- job: 當(dāng)前執(zhí)行 job 的信息,如 job.status 表示當(dāng)前 job 的執(zhí)行狀態(tài)
- matrix: 描述一些構(gòu)建信息,如 node 以及 os 版本號(hào)
更多 context 信息可以參考官方文檔 Contexts and expression syntax for GitHub Actions[4]
實(shí)踐一:博客自動(dòng)部署
我的博客目前托管在阿里云 OSS 上,以下 action.yaml 描述了自動(dòng)部署的流程。可以參考我的配置 shfshanyue/blog[5]
「關(guān)于托管在阿里云 OSS 的細(xì)節(jié),可以參考 在阿里云 OSS 托管你的前端應(yīng)用[6]」
- name: deploy to aliyun oss
- on: [push]
- jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- # 切代碼到 runner
- - uses: actions/checkout@v1
- with:
- submodules: true
- # 下載 git submodule
- - uses: srt32/git-actions@v0.0.3
- with:
- args: git submodule update --init --recursive
- # 使用 node:10
- - name: use Node.js 10.x
- uses: actions/setup-node@v1
- with:
- node-version: 10.x
- # npm install
- - name: npm install and build
- run: |
- npm install
- npm run build
- env:
- CI: true
- # 設(shè)置阿里云OSS的 id/secret,存儲(chǔ)到 github 的 secrets 中
- - name: setup aliyun oss
- uses: manyuanrong/setup-ossutil@master
- with:
- endpoint: oss-cn-beijing.aliyuncs.com
- access-key-id: ${{ secrets.OSS_KEY_ID }}
- access-key-secret: ${{ secrets.OSS_KEY_SECRET }}
- - name: cp files to aliyun
- run: ossutil cp -rf .vuepress/dist oss://shanyue-blog/
部署成功
部署成功
實(shí)踐二:Github Readme 自動(dòng)生成
2020 年 8 月份,就是我裸辭的那個(gè)月,Github 上線了個(gè)人主頁功能,即創(chuàng)建 Github 用戶名的同名 Repo,其中的 Readme.md 就是自己的個(gè)人主頁。例如我,創(chuàng)建一個(gè) shfshanyue/shfshanyue 的倉(cāng)庫(kù),既可以通過 Readme.md 來創(chuàng)建個(gè)人主頁
此時(shí)涌現(xiàn)了各種各樣的 Github Actions 來自定義個(gè)人主頁,大致思路如下:
- Github API 獲取自身 Github 動(dòng)態(tài),寫入指定格式的 Readme
- Github Actions 自動(dòng)提交代碼
優(yōu)秀 Github 個(gè)人主頁的 Actions[7]
其中一個(gè) waka-readme-stats[8],可制作以下漂亮的個(gè)人主頁
- 📅 I'm Most Productive on Sundays
- Monday 50 commits ███░░░░░░░░░░░░░░░░░░░░░░ 13.19%
- Tuesday 85 commits █████░░░░░░░░░░░░░░░░░░░░ 22.43%
- Wednesday 56 commits ███░░░░░░░░░░░░░░░░░░░░░░ 14.78%
- Thursday 44 commits ███░░░░░░░░░░░░░░░░░░░░░░ 11.61%
- Friday 28 commits █░░░░░░░░░░░░░░░░░░░░░░░░ 7.39%
- Saturday 30 commits ██░░░░░░░░░░░░░░░░░░░░░░░ 7.92%
- Sunday 86 commits █████░░░░░░░░░░░░░░░░░░░░ 22.69%
實(shí)踐三:定時(shí)任務(wù)的腳本服務(wù)器
「這簡(jiǎn)直是在薅羊毛啊!」
先獻(xiàn)上一個(gè)使用了 Github Actions 的工具:B 站自動(dòng)簽到工具[9]。
❝
通過 GitHub Actions 實(shí)現(xiàn)每日線上自動(dòng)運(yùn)行任務(wù):每日自動(dòng)登錄、觀看、分享、投幣視頻,獲取每日任務(wù)的滿額經(jīng)驗(yàn),輕松升級(jí) Level 6,實(shí)現(xiàn)自動(dòng)領(lǐng)取大會(huì)員權(quán)益、月底自動(dòng)為自己充電等功能。
❞關(guān)于其它有趣的可薅羊毛的定時(shí)任務(wù),就需要充分發(fā)揮你的想象力了!
Reference
[1]Workflow syntax for GitHub Actions:
https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions[2]Events that trigger workflows:
https://help.github.com/en/actions/automating-your-workflow-with-github-actions/events-that-trigger-workflows#about-workflow-events[3]docker 簡(jiǎn)易入門:
https://github.com/shfshanyue/op-note/blob/master/docker.md[4]Contexts and expression syntax for GitHub Actions:
https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#job-context[5]shfshanyue/blog:
https://github.com/shfshanyue/blog/blob/master/.github/workflows/nodejs.yml[6]在阿里云OSS托管你的前端應(yīng)用:
./deploy-fe-with-alioss.md[7]優(yōu)秀 Github 個(gè)人主頁的 Actions:
https://github.com/abhisheknaiidu/awesome-github-profile-readme#github-actions-[8]waka-readme-stats:
https://github.com/anmol098/waka-readme-stats[9]B站自動(dòng)簽到工具:
https://github.com/RayWangQvQ/BiliBiliTool
本文轉(zhuǎn)載自微信公眾號(hào)「 全棧成長(zhǎng)之路」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 全棧成長(zhǎng)之路公眾號(hào)。




































