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
文件夹。
当发生变化后,处理流程如下:
1. CI Job 发送 slack 消息通知 Dev/SRE 发现变更。
2. CI Job 会在极狐GitLab 项目中创建 Issue 记录变更,例如 #1245 。
3. Feature Flag 会影响产品的行为,但我们只需要关注影响极狐运营策略的 Feature Flag,比如 影响免费用户创建 projects 的数量
,如果有不确定极狐的运营策略,可以找SRE或者产品确认。其他的 Feature Flag 变动只要同步就好。
4. Dev 需要在 issue 里把变动的 Feature Flag 简单描述下内容,把相关 MR 或者 issue 列出来,可以参考这个 https://jihulab.com/gitlab-cn/gitlab/-/issues/1301。
5. 如果 Dev 对变动的 Feature Flag 在 jihulab.com 的开关状态不明确,可以联系 SRE 同学查询。
代码如下:
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