📜  github labeler 示例 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:30:57.920000             🧑  作者: Mango

Github Labeler 示例 - Shell-Bash

Github Labeler 是 Github 上一个自动化工具,用来帮助开发者通过使用标签(labels)来管理问题(issues)和合并请求(pull requests)。它可以简单地根据问题或合并请求标题、描述等内容来自动添加或删除标签。下面是使用 Shell-Bash 语言编写的一个 Github Labeler 示例。

使用前提

在开始使用 Github Labeler 之前,您需要确保您的 Github 账号已经有了一个用于访问 Github API 的 token。

代码示例
#!/bin/bash

# 设置 Github 账户信息与 Token
# ******** 以下信息将你的github账户信息部分替换,尤其是Token *************
USERNAME="your_username"
REPO="your_repo"
TOKEN="your_token"
# *************************************************************

# 设置 API 路径
API="https://api.github.com/repos/$USERNAME/$REPO/issues"

# 设置标签列表
BUGS_LABELS=( "bug" "urgent" "critical" )
FEATURE_LABELS=( "enhancement" "feature" "nice-to-have" )

# 获取 Github 上所有 Issue
ISSUES=$(curl -s -X GET $API -H "Authorization: token $TOKEN" -H "Accept: application/vnd.github.v3+json" )

# 遍历每一个 Issue
echo "$ISSUES" | jq -c '.[]' | while read i; do

  # 抽取 Issue 的 ID 和标题
  ID=$(echo "$i" | jq -r '.number')
  TITLE=$(echo "$i" | jq -r '.title')

  # 定义变量用于存储新的标签
  NEW_LABELS=""

  # 包含 "bug" 或 "error" 的 Issue 添加标签:bug, urgent, critical
  if echo "$TITLE" | grep -iqE "(bug|error|defect)"; then
    for l in "${BUGS_LABELS[@]}"; do
      NEW_LABELS="$NEW_LABELS\"$l\", "
    done
  fi

  # 包含 "feature" 或 "enhancement" 定义的 Issue 添加标签:enhancement, feature, nice-to-have
  if echo "$TITLE" | grep -iqE "(feature|enhancement)"; then
    for l in "${FEATURE_LABELS[@]}"; do
      NEW_LABELS="$NEW_LABELS\"$l\", "
    done
  fi

  # 去掉标签列表中的最后一个逗号和空格
  NEW_LABELS=$(echo "$NEW_LABELS" | sed 's/..$//')

  # 如果新的标签列表不为空,则更新 Issue 的标签
  if [ ! -z "$NEW_LABELS" ]; then
    curl -s -X PATCH "$API/$ID" \
    -H "Authorization: token $TOKEN" \
    -H "Content-Type: application/json" \
    -H "Accept: application/vnd.github.symmetra-preview+json" \
    -d "{\"labels\": [$NEW_LABELS]}"
  fi

done
代码解释
设置 Github 账户信息与 Token
USERNAME="your_username"
REPO="your_repo"
TOKEN="your_token"

在此部分中,我们需要将代码中的用户名、仓库和 Github API 访问 Token 更换为自己的信息。这里的 Token 可以在个人 Github 设置中的 Developer Settings > Personal access tokens 中获得。修改代码后,务必注意不要将 Token 公开,可以将其加密或是通过命令行参数传入以确保安全。

设置标签列表
BUGS_LABELS=( "bug" "urgent" "critical" )
FEATURE_LABELS=( "enhancement" "feature" "nice-to-have" )

这里定义了两个标签列表。第一个列表包含了在 Issue 中包含 "bug" 或 "error" 的情况下需要添加的标签。第二个列表则包含了在 Issue 标题中包含 "feature" 或 "enhancement" 的情况下需要添加的标签。您可以根据自己的需求更改这些列表。

获取 Github 上所有 Issue
ISSUES=$(curl -s -X GET $API -H "Authorization: token $TOKEN" -H "Accept: application/vnd.github.v3+json" )

这里使用 curl 来获取 Github 上的所有 Issue。其中 -s 表示静默模式,-X GET 表示请求 Method 为 GET,-H 表示设置 Header,这里设置了 Authorization 和 Accept 的 Header,-d 表示设置 Body(如果存在的话)。

遍历每一个 Issue
echo "$ISSUES" | jq -c '.[]' | while read i; do

这里使用了 jq 命令来解析从 Github API 获取到的 JSON 数据。jq -c '.[]' 表示选取 JSON 数组中的所有元素,while read i; do 表示逐行读取遍历到的每个元素。

抽取 Issue 的 ID 和标题
ID=$(echo "$i" | jq -r '.number')
TITLE=$(echo "$i" | jq -r '.title')

这里使用了两个 jq 命令来从 Issue 对象中抽取 ID 和标题信息。-r 表示使用原始文本输出,以便于后面的正则表达式匹配。

定义变量用于存储新的标签
NEW_LABELS=""

这里定义了一个空字符串,用于存储后面需要添加的标签。

包含 "bug" 或 "error" 的 Issue 添加标签:bug, urgent, critical
if echo "$TITLE" | grep -iqE "(bug|error|defect)"; then
  for l in "${BUGS_LABELS[@]}"; do
    NEW_LABELS="$NEW_LABELS\"$l\", "
  done
fi

这里使用 Shell 的正则表达式匹配功能来判断 Issue 标题中是否包含 "bug"、"error" 或 "defect"。如果匹配到了,则将前面定义的 BUGS_LABELS 列表中的所有标签都添加到 NEW_LABELS 中。

包含 "feature" 或 "enhancement" 的 Issue 添加标签:enhancement, feature, nice-to-have
if echo "$TITLE" | grep -iqE "(feature|enhancement)"; then
  for l in "${FEATURE_LABELS[@]}"; do
    NEW_LABELS="$NEW_LABELS\"$l\", "
  done
fi

这里同样使用正则表达式匹配来判断是否需要添加 FEATURE_LABELS 列表中的标签。

去掉标签列表中的最后一个逗号和空格
NEW_LABELS=$(echo "$NEW_LABELS" | sed 's/..$//')

由于上面将所有需要添加的标签都添加到了 NEW_LABELS 中并用逗号隔开,这里需要将最后一个逗号和空格去掉,以便于后面的 curl 命令组装需要的 JSON 格式数据。

如果新的标签列表不为空,则更新 Issue 的标签
if [ ! -z "$NEW_LABELS" ]; then
  curl -s -X PATCH "$API/$ID" \
  -H "Authorization: token $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/vnd.github.symmetra-preview+json" \
  -d "{\"labels\": [$NEW_LABELS]}"
fi

这里使用了 curl 命令来更新 Issue 的标签。其中 -X PATCH 表示请求 Method 为 PATCH,-H 表示设置 Header,这里设置了 Authorization、Content-Type 和 Accept 的 Header,-d 表示设置 Body,这里使用 JSON 格式来表示需要更新的标签列表。

总结

通过上面的代码示例,我们可以看到 Github Labeler 的具体实现过程。虽然这里提供的只是一个简单的示例,但是您可以根据自己的需求来更改代码,将其应用到实际场景中去。