CI Job: 监控 Upstream Feature Flag 的变动
极狐GitLab 是基于 Upstream GitLab 的扩展,在 Upstream GitLab 中有大量的 Feature Flag 来控制软件的行为。在某些时候,Upstream 会对 Feature Flag 进行修改,比如设置为默认打开,或者默认关闭,一定程度上就会改变极狐GitLab 的行为,所以极狐GitLab 需要监控 Upstream Feature Flag 的变化。
在极狐GitLab 的 Pipeline 中使用 watch-upstream-feature-flags
job, 在每次 code sync 时,通过 git diff
判定 upstream 是否改动了 config/feature_flags
文件夹。
Upstream Feature Flag 变动 Review
- CI Job 发送 slack 消息通知 Dev/SRE 发现变更。
- CI Job 会在极狐GitLab 项目中创建 Issue 记录变更,例如 #1245 。
- 上游 Feature Flag 的变动很多,我们的目标是尽可能关注其中可能会对我们产生影响的几种变动,根据讨论当下我们需要重点关注以下情况:
- 上游 Feature Flag 移除,我们 SaaS 对应的 Feature Flag 是打开的。
- 上游 Feature Flag 变更默认值为 true。
- 上游涉及 Feature Flag 变更的文件,在 /jh 目录下有过覆盖。
- Feature Flag 变更涉及 SaaS 运营策略,如
影响免费用户创建 projects 的数量
。
- 当上游 Feature Flag 变更属于上面的几种情况,Dev 需要在 issue 里把变动的 Feature Flag 简单描述下内容,把相关 MR 或者 issue 列出来,可以参考这个 issue,并在 issue 中 cc @shreychen @lpeng1991 @daveliu @prajnamas,具体做法可以参考下面的 Issue 处理流程。
- 如果 Dev 对变动的 Feature Flag 在 jihulab.com 的开关状态不明确,可以联系 SRE 同学查询。
Issue 处理流程
- 找出 upstream sync commit 的 feature flag 对应的全部 yaml 文件
- 对每个 feature flag,找到它的 MR/Rollout URL
- 查看对应 MR diff,Review 每个改动文件,确认是否对 JH 有影响
- 记录结果。如判断会影响到 JH,需要 @ 相关人员(Leader/SRE)检查确认
-
Comment 可参照如下写法:
- 无影响
## 新增功能 FF: `optimize_group_template_query` - introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129399 - rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/422390 @daveliu 这是个性能优化,为了改善 https://gitlab.com/projects/new#create_from_template 页面 query 性能。后端文件改动都是新增代码,对 JH 无破坏性影响。
- 有影响
## 删除 FF:`npm_package_registry_fix_group_path_validation` - introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127164 - rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/420160 @daveliu 这是个对 NPM package 命名约定的改动,原 MR 涉及文件没有 JH 覆盖处理。现在删除掉 FF,请 SRE @vincent_stchu 看下对 JH 有没有影响。
代码如下:
watch-upstream-feature-flags:
stage: test
allow_failure: true
extends:
- .minimal-job
rules:
- if: $GITLAB_USER_NAME == "JH_SYNC_TOKEN" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
script:
- latest_commit=`git rev-parse --short HEAD`
- echo "latest commit is $latest_commit"
- latest_changes=`git diff $latest_commit^ $latest_commit --name-only`
- echo "latest_changes is $latest_changes"
- |-
if [[ $latest_changes == *"config/feature_flags"* ]];
then
echo "Upstream feature flags changed! Change commit is $latest_commit"
feature_flag_changes=$(git diff $latest_commit^ $latest_commit -- config/feature_flags)
echo "feature_flag_changes is $feature_flag_changes"
title="Feature flag changes detected"
datetime=`TZ=UTC-8 date '+%F %T'`
curl -X POST --header 'Content-Type:application/json' --header "PRIVATE-TOKEN:$JIHU_REPORTER_TOKEN" --data "{\"confidential\":\"true\",\"title\":\"$title $datetime\",\"description\":\"New Change in commit $latest_commit \n see detail here, $CI_JOB_URL\n\",\"labels\":\"featureflag::changed\"}" https://jihulab.com/api/v4/projects/13953/issues
curl -X POST \
-H 'Content-type:application/json' \
--data "{\"blocks\":[{\"type\":\"header\",\"text\":{\"type\":\"plain_text\",\"text\":\"$title\"}},{\"type\":\"section\",\"fields\":[{\"type\":\"mrkdwn\",\"text\":\"*Job:* <$CI_JOB_URL|#$CI_JOB_ID>\"},{\"type\":\"mrkdwn\",\"text\":\"*Issue:* <https://jihulab.com/gitlab-cn/gitlab/-/issues/?sort=created_date&state=opened&label_name%5B%5D=featureflag%3A%3Achanged|link>\"}]}]}" \
--url $FEATURE_FLAG_CHANNEL_URL
else
echo "Upstream feature flag not changed"
curl -X POST -H "Content-Type:application/json" --data "{\"text\":\"Upstream feature flag not changed, $CI_JOB_URL\"}" \
--url $FEATURE_FLAG_CHANNEL_URL
fi