10 個你該瞭解的 GitHub Actions 進階技巧

若是你已經在使用 GitHub Actions ,那麼閱讀本文你將得到更多有趣而有用的打開方式。閱讀完,我又給倉庫新增了幾個 workflow 。html

1. workflow 執行時,傳入參數

在執行 workflow 時, 容許在 GitHub Actions 頁面輸入參數,控制執行邏輯。咱們能夠將人工處理的邏輯,在 GitHub Actions 參數化執行,適用於持續部署場景。node

on: 
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'     
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'  
jobs:
  printInputs:
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "Log level: ${{ github.event.inputs.logLevel }}"
        echo "Tags: ${{ github.event.inputs.tags }}" 
複製代碼

上面的 workflow 執行時,會彈出以下對話框。linux

2. Job 編排控制執行順序

一個 workflow 由不少個 job 組成,藉助於 needs 參數,咱們能夠管理這些 job 之間的依賴,控制其執行流程。git

on: push
jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - run: echo "job1"
  job2:
    runs-on: ubuntu-latest
    steps:
      - run: sleep 5
    needs: job1
  job3:
    runs-on: ubuntu-latest
    steps:
      - run: sleep 10
    needs: job1
  job4:
    runs-on: ubuntu-latest
    steps:
      - run: echo "job4"
    needs: [job2, job3]
複製代碼

上面的 workflows 執行時,job2 和 job3 會等 job1 執行成功時才執行,job4 會等 job2 和 job3 執行成功時才執行。github

3. 用於項目管理

Kubernetes 基於 ChatOps 使用 Prow 協調社區有序協做。但並非每一個團隊,都願意搭建並維護一套 Prow 機器人系統。ChatOps 實現的核心是事件驅動,這在 GitHub 中使用 Actions 也能實現。web

下面是幾個項目管理相關的 actiondocker

  • 根據修改的目錄添加標籤
- uses: actions/labeler@main
  with:
    repo-token: "${{ secrets.GITHUB_TOKEN }}"
複製代碼

在配置文件 .github/workflows/labeler.yml 中添加規則,給對 docs 目錄進行修改的 Pull Requests(如下簡稱 PR) 自動添加 docs_label 標籤:typescript

docs_label:
  - ./docs/*
複製代碼
  • 根據標籤添加 Issues 到 Projects

使用 srggrs/assign-one-project-github-action , 咱們能夠將新增的 Issues 或者 PR 添加到指定的 Projects 中。shell

- name: Assign NEW issues and NEW pull requests to project 2
  uses: srggrs/assign-one-project-github-action@1.2.0
  if: github.event.action == 'opened'
  with:
    project: 'https://github.com/srggrs/assign-one-project-github-action/projects/2'
複製代碼

也能夠將包含指定標籤的 Issues 或 PR 添加到指定 Project 的指定 Column 中。json

- name: Assign issues and pull requests with `bug` label to project 3
  uses: srggrs/assign-one-project-github-action@1.2.0
  if: | contains(github.event.issue.labels.*.name, 'bug') || contains(github.event.pull_request.labels.*.name, 'bug')   with:
    project: 'https://github.com/srggrs/assign-one-project-github-action/projects/3'
    column_name: 'Labeled'
複製代碼
  • 清理長時間無人跟進的 Issues

若是一個 Issue 長達 30 天沒有更新,那麼下面的 workflow 將會再等 5 天,而後將其關閉。

name: 'Close stale issues and PRs'
on:
  schedule:
    - cron: '30 1 * * *'

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v3
        with:
          stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
          days-before-stale: 30
          days-before-close: 5
複製代碼

GitHub 上的項目管理,主要是圍繞 Issues、Projects、Labels、Pull Requests 展開,能夠在 GitHub Actions 的 Marketplace 中搜索相關的 Action 使用。

4. 在線調試

在使用 GitHub Actions 的過程當中,若是須要登陸到 Runner 上調試命令,那麼下面這個技巧你必定會感興趣。

- uses: shaowenchen/debugger-action@v2
  name: debugger
  timeout-minutes: 30
  continue-on-error: true
  with:
    ngrok_token: ${{ secrets.NGROK_TOKEN }}
複製代碼

只須要去 Ngrok 官網申請一個 token,就能夠經過 ssh 遠程登陸到 Runner。固然,也能夠暴露 Runner 上的服務,提供外網訪問的連接,最長可達 6 小時。

在執行日誌中,咱們能夠找到 ssh 的登陸連接,使用 root/root 便可登陸 Runner。若是配置了 web 的端口映射,還能夠查看到相關的服務連接。

5. 設置緩存

緩存能有效地加快構建速度,減小網絡請求,複用中間碼。這對於 Java、Nodejs、Python 等項目,很是有用。

- name: Get yarn cache directory path
  id: yarn-cache-dir-path
  run: echo "::set-output name=dir::$(yarn cache dir)"

- uses: actions/cache@v2
  id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
  with:
    path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
    key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
    restore-keys: | ${{ runner.os }}-yarn- 複製代碼

6. 檢測項目中的問題連接

項目維護時間長了以後,最使人頭疼的就是文檔。研發、測試跟進的是代碼、功能,而文檔卻時常無人更新。缺乏維護的文檔,會讓潛在參與者流失。下面這個 Action 能檢測文檔中的 Broken 連接。

name: Check Markdown links

on: push

jobs:
  markdown-link-check:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - uses: gaurav-nelson/github-action-markdown-link-check@v1
      with:
        use-quiet-mode: 'yes'
        config-file: '.github/workflows/checklink_config.json'
        max-depth: 3
複製代碼

gaurav-nelson/github-action-markdown-link-check 支持自定義配置,很是靈活易用,堪稱必備 Action。

下面是一個 .github/workflows/checklink_config.json 的示例:

{
  "replacementPatterns": [
    {
      "pattern": "^/",
      "replacement": "/github/workspace/"
    }
  ],
  "aliveStatusCodes": [
    429,
    200
  ]
}
複製代碼

最後在 GitHub Actions 日誌頁面,會輸出這樣的檢測結果:

=========================> MARKDOWN LINK CHECK <=========================

FILE: ./docs/governance.md

4 links checked.

FILE: ./docs/configuration/cri.md
[✖] https://build.opensuse.org/project/show/devel:kubic:libcontainers:stable

7 links checked.

ERROR: 1 dead links found!
[✖] https://build.opensuse.org/project/show/devel:kubic:libcontainers:stable → Status: 404

FILE: ./docs/configuration/kubeedge.md

21 links checked.

=========================================================================
複製代碼

7. Job 批量執行,參數排列組合執行任務

數據驅動測試的場景下,能夠經過輸入的參數控制測試的流程。在 GitHub Actions 中,咱們也能夠經過參數化的方式,批量地執行或編排流程。

GitHub Actions 會將 matrix 中的每一個參數排列組合,產生一個新的運行實例。

on: push
jobs:
  node:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-16.04, ubuntu-18.04]
        node: [6, 8, 10]
    steps:
      - uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node }}
      - run: node --version
複製代碼

上面的 workflow 執行時, 會執行 6 個 job。

不管是用來測試兼容性, 仍是批量執行 Job, 都是很是好的。

8. 拷貝 Action 的 Badge 狀態顯示在文檔中

一般,咱們使用 GitHub Actions 對項目進行代碼分析、執行測試、編譯、打包、構建、推送鏡像等。這些行爲對於保證項目的穩定,相當重要。

但並非每一個人都會關注 Actions 的執行細節。咱們能夠在顯眼的地方,給出這些過程的最終實時狀態,以提醒用戶和開發者。若是 main 分支構建失敗了,能提醒用戶謹慎使用,能提醒研發儘快修復問題。

在 GitHub Actions 頁面中, 點擊 Create status badge

將彈框中的 URL 連接,增長在 Readme 文檔中,便可實時快速地查看到 workflow 的執行結果。

9. 精準 hook GitHub 上的行爲

workflow 經過 on 關鍵字定義觸發條件。 主要有三類觸發事件:

  • 人工觸發
on: workflow_dispatch
複製代碼
  • 定時觸發

每隔 15 分鐘觸發一次 workflows。

on:
  schedule:
    - cron:  '*/15 * * * *'
複製代碼
  • Webhook 觸發

咱們在 GitHub 上的操做,好比建立 Issues、新增 Deployment 等,都可以經過 API 獲取到相關的事件。經過這些事件,咱們能夠精準地定製 workflow 的行爲。一般咱們都是基於 push 或者 pull requests 觸發,下面列舉幾個不常見的示例:

當有人 fork 倉庫時觸發

on:
  fork
複製代碼

當有人 star 倉庫時觸發

on:
  watch:
    types: [started]
複製代碼

當有新建的 Issue 時觸發

on:
  issues:
    types: [opened]
複製代碼

10. 開發一個 Action 很簡單

若是在 Marketplace 找不到合適的 Action,那麼本身開發 Action 也是一個不錯的選擇。

其實,開發一個 Action 沒有想象中那麼難。一個 Action 就是一個處理邏輯,接收輸入參數,執行必定的邏輯,而後輸出參數。有三種類型的 Action:

  • Docker container, 適用 Linux 系統

經過 Docker 容器,提供 Action 的執行邏輯處理。好比下面這個例子:

Dockerfile

FROM appleboy/drone-scp:1.6.2-linux-amd64

ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
複製代碼

entrypoint.sh

#!/bin/sh

set -eu

[ -n "$INPUT_STRIP_COMPONENTS" ] && export INPUT_STRIP_COMPONENTS=$((INPUT_STRIP_COMPONENTS + 0))

sh -c "/bin/drone-scp $*"
複製代碼

經過 dron-scp 鏡像,快速開發了一個提供 scp 文件拷貝的 Action。

  • JavaScript, 適用 Linux、macOS、Windows 系統

經過執行 JavaScript 處理 Action 邏輯。官方提供了 JavaScript 和 TypeScript 的 Action 模板。在建立項目時,使用模板建立,而後編寫處理邏輯,發佈本身的 Action 便可。

GitHub Actions 提供了工具包,以支持這種方式的擴展,例如執行命令、操做 GitHub 等,均可以經過引用包,直接調用相關函數實現。下面是其中幾個工具包:

@actions/exec, 執行命令
@actions/core, 輸入、輸出、日誌、祕鑰相關
@actions/io, 操做文件
複製代碼
  • Composite run steps, 適用 Linux, macOS, Windows 系統

這種類型,容許將一連串的 Shell 操做做爲一個 Action 使用。

name: 'Hello World'
description: 'Greet someone'
inputs:
  who-to-greet:  # id of input
    description: 'Who to greet'
    required: true
    default: 'World'
outputs:
  random-number:
    description: "Random number"
    value: ${{ steps.random-number-generator.outputs.random-id }}
runs:
  using: "composite"
  steps:
    - run: echo Hello ${{ inputs.who-to-greet }}.
      shell: bash
    - id: random-number-generator
      run: echo "::set-output name=random-id::$(echo $RANDOM)"
      shell: bash
    - run: ${{ github.action_path }}/goodbye.sh
      shell: bash
複製代碼

11. 參考

原文連接 www.chenshaowen.com/blog/10-tip…

更多精彩內容請關注公衆號。

相關文章
相關標籤/搜索