特性標(biāo)記清理:GitHub Actions 來幫忙!
在項目中使用特性標(biāo)記的原因、好處和用例是什么?
特性標(biāo)記是一種強大的軟件開發(fā)技術(shù),它允許在不需要重新部署應(yīng)用程序的情況下,動態(tài)控制功能和其他代碼的開啟或關(guān)閉,而且都是實時的。我們可以"暗暗地"推出新功能,只在必要時且當(dāng)我們完全準(zhǔn)備好時才使其可用。有人可能稱它們?yōu)?功能開關(guān)"(feature toggles),但我更喜歡叫"特性標(biāo)記"(feature flags)。
從基本角度來看,特性標(biāo)記就是代碼中的附加條件。眾所周知,代碼中的條件經(jīng)常會引入復(fù)雜性。有許多設(shè)計模式和工具可以幫助降低代碼復(fù)雜性,使其更易于維護和更可靠。
事實#1:特性標(biāo)記可能會使事情變得更復(fù)雜。
現(xiàn)在,我們探討不同的用例和優(yōu)勢。
首先,特性標(biāo)記對于主干開發(fā)(trunk-based development)來說是必不可少的。你不再需要維護長期存在的功能分支,開啟PR并將其合并到主分支。這幫助我們在開發(fā)中更快地部署和前進。
你還可以采用各種推出方式,比如金絲雀發(fā)布(僅為小比例用戶激活新功能)和A/B測試(為大量用戶群啟用該功能并將他們的行為與"對照"組進行比較),只需簡單點擊幾下即可。
特性標(biāo)記的另一個好處是所謂的目標(biāo)定位。你可以基于規(guī)則配置特性標(biāo)記的值,允許你設(shè)置默認值并為特定用戶或組織指定不同的值。
事實#2:特性標(biāo)記有助于減輕壓力并最小化發(fā)布功能時的風(fēng)險。
特性標(biāo)記不僅對軟件工程師有用。QA工程師、產(chǎn)品經(jīng)理和銷售經(jīng)理也能從中受益。特別是銷售經(jīng)理可以利用特性標(biāo)記向新客戶展示即將推出或早期發(fā)布的功能,從而加強他們在談判中的地位。
到目前為止,我們討論了特性標(biāo)記的比較重要的好處。然而,頻繁使用特性標(biāo)記會產(chǎn)生技術(shù)債。手動管理數(shù)十個特性標(biāo)記還算舒適,但當(dāng)涉及到數(shù)百個時就變成了噩夢。特別是當(dāng)人們開始將特性標(biāo)記管理系統(tǒng)用作配置存儲,或者當(dāng)特性標(biāo)記用于每個小的內(nèi)容更改時。
事實#3:頻繁使用特性標(biāo)記會導(dǎo)致技術(shù)債務(wù)。
我們?nèi)绾斡行У亟鉀Q這個問題?一種解決方案是安排一個特定的日期,每月或每季度進行一次標(biāo)記清理。但是,手動執(zhí)行這項工作需要大量時間。
處理特性標(biāo)記可能會令人沮喪。我工作過的每個項目都使用不同的管理系統(tǒng)。但通常是LaunchDarkly,因此我的用例將基于它。相信它可以與任何其他系統(tǒng)集成,因為方法才是關(guān)鍵。
首先,我們需要確定標(biāo)記是否過時并需要修改。在我的情況下,有兩種可能:
- 標(biāo)記未被使用/從代碼中移除,但在系統(tǒng)中未被歸檔。
- 如果標(biāo)記對所有客戶都啟用,并且沒有任何沖突規(guī)則。
我們應(yīng)該做的第一件事是將我們的代碼與特性標(biāo)記管理系統(tǒng)同步。LaunchDarkly有一個很棒的功能叫做"Code References"。
要激活它,你必須在主分支中執(zhí)行以下操作:
launchDarkly-code-references:
name: Code References
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 11 # 如果find-code-references的lookback配置選項未禁用,則必須設(shè)置此值。
- name: LaunchDarkly Code References
uses: launchdarkly/find-code-references@v2.11.8
with:
accessToken: ${{ secrets.ACCESS_TOKEN }}
projKey: ${{ secrets.PROJECT_KEY }}
目的是在你的代碼中搜索特性標(biāo)記條目,并在LaunchDarkly中的代碼引用中顯示它們。
此外,我嘗試尋找一些可以用作過時特性標(biāo)記報告器的GitHub Action。雖然LaunchDarkly有自己的Slack集成,但它的"準(zhǔn)備刪除"標(biāo)記算法有點奇怪。它有時會返回甚至是永久性的特性標(biāo)記。
這就是為什么決定自己采取行動。很感激LaunchDarkly提供了詳細的REST API文檔,我發(fā)現(xiàn)它非常有用。
這個Action幫助識別符合規(guī)則文件中指定的刪除標(biāo)準(zhǔn)的特性標(biāo)記。它為特性標(biāo)記生成報告,允許用戶輕松地將其分享到指定的渠道(如Slack)或直接在控制臺中查看。此外,該Action提供特性標(biāo)記作為輸出,允許你根據(jù)需要自定義使用方式。
你可能想要指定在LaunchDarkly中定義的維護團隊。使用excluded tags來定義不應(yīng)報告的例外(特殊特性標(biāo)記)。
name: Feature Flags Ready For Removal
on:
schedule:
- cron: "00 11 * * 5"
workflow_dispatch:
jobs:
send-feature-flags-report:
name: Feature Flags
runs-on: ubuntu-latest
steps:
- name: 'Send Report'
uses: rkhaslarov/launchdarkly-outdated-feature-flags-reporter-action@v1.0.0
with:
access-token: ${{ secrets.ACCESS_TOKEN }}
project-key: ${{ secrets.PROJECT_KEY }}
environment-key: ${{ secrets.LD_ENV }}
maintainer-teams: 'team'
threshold: 30
report-type: 'slack'
excluded-tags: 'MANUAL_REVIEW'
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
我們已經(jīng)探索了特性標(biāo)記,理解了它們的使用方式及其復(fù)雜性。然后查看了簡化LaunchDarkly中特性標(biāo)記識別和清理的action。請幫我一個忙,在審查期間謹(jǐn)慎處理特性標(biāo)記,如果其他消費者沒有主動使用它們,請考慮刪除。