Android 기능 표시기 디렉토리와 LaunchDarkly를 비교하여 비효율적인 표시기 정리
중급
이것은DevOps, Multimodal AI분야의자동화 워크플로우로, 11개의 노드를 포함합니다.주로 If, Code, Jira, Slack, Gitlab 등의 노드를 사용하며. GitLab, LaunchDarkly, Jira, Slack을 사용하여 사용되지 않는 Android 기능 플래그를 검출
사전 요구사항
- •Slack Bot Token 또는 Webhook URL
- •GitLab Personal Access Token
- •대상 API의 인증 정보가 필요할 수 있음
- •Google Sheets API 인증 정보
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "Ozg0c8uxCru2a79p",
"meta": {
"instanceId": "14e4c77104722ab186539dfea5182e419aecc83d85963fe13f6de862c875ebfa"
},
"name": "Catalog Android (Kotlin/Java) feature flags and sweep dead flags vs LaunchDarkly (weekly) → Sheets + Jira + PR + Slack",
"tags": [],
"nodes": [
{
"id": "edcaa1e6-4fd2-4b06-93b5-b9219bbba407",
"name": "무효 플래그 확인",
"type": "n8n-nodes-base.if",
"position": [
40,
1680
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{$json.deadFlag !== undefined}}",
"operation": "notEqual"
}
]
}
},
"typeVersion": 1
},
{
"id": "e603fbcb-275a-4356-acbf-d70a219f975c",
"name": "예약 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-420,
1360
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.2
},
{
"id": "70dfcf7f-3d82-44d6-9ea2-ef550b5496f4",
"name": "GitLab",
"type": "n8n-nodes-base.gitlab",
"position": [
-200,
1360
],
"parameters": {
"owner": "",
"resource": "",
"operation": "",
"repository": "",
"authentication": ""
},
"credentials": {
"gitlabOAuth2Api": {
"id": "",
"name": ""
}
},
"typeVersion": 1
},
{
"id": "13799fe3-a8d0-4dc2-924f-a5c53c17dea5",
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
-180,
1680
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "",
"name": ""
}
},
"typeVersion": 4.6
},
{
"id": "958b3c35-f1ea-4ef4-8c7c-3a69869e4eb1",
"name": "Slack",
"type": "n8n-nodes-base.slack",
"position": [
260,
1760
],
"webhookId": "070511aa-315a-4533-9c71-c820cef4b633",
"parameters": {
"otherOptions": {}
},
"typeVersion": 2.3
},
{
"id": "ecc1b21c-e3b0-40ae-9e21-9b09f69db3cf",
"name": "Jira Software",
"type": "n8n-nodes-base.jira",
"position": [
260,
1600
],
"parameters": {
"project": {
"__rl": true,
"mode": "list",
"value": ""
},
"summary": "=Dead feature flag: {{$json.deadFlag}}",
"issueType": {
"__rl": true,
"mode": "list",
"value": ""
},
"additionalFields": {}
},
"typeVersion": 1
},
{
"id": "566e7571-2423-4e4b-9edf-dea23b9e8fae",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
240,
1360
],
"parameters": {
"url": "https://app.launchdarkly.com/api/v2/flags/default",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "",
"value": ""
}
]
}
},
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"id": "afb07c42-6687-423b-9ccb-739768aa0c4f",
"name": "무효 플래그 찾기",
"type": "n8n-nodes-base.code",
"position": [
-420,
1680
],
"parameters": {
"jsCode": "// 1. Extract LaunchDarkly flags array from input\nconst ldItems = $input.all()[0]?.json?.items || [];\n\n// 2. Extract code flags from another input node named 'Code Flags'\nconst codeFlags = $('Detect flags').all().map(item => item.json.flag);\n\n// 3. Filter dead flags from LD\nconst deadFlags = ldItems.filter(ldFlag => {\n const isUsedInCode = codeFlags.includes(ldFlag.key);\n\n if (isUsedInCode) return false;\n\n const prod = ldFlag.environments?.production || {};\n const test = ldFlag.environments?.test || {};\n\n const archivedEverywhere = prod.archived && test.archived;\n const offInProd = prod.on === false;\n\n return archivedEverywhere || offInProd;\n});\n\n// 4. Return as array\nreturn deadFlags.map(flag => ({\n json: {\n deadFlag: flag.key,\n reason: flag.environments?.production?.archived\n ? 'Archived'\n : 'Off in Production'\n }\n}));\n"
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "75abe5e7-051f-4b87-8329-d10d87ce2b93",
"name": "플래그 탐지",
"type": "n8n-nodes-base.code",
"position": [
20,
1360
],
"parameters": {
"jsCode": "const pattern = /(ENABLE_[A-Z0-9_]+)/g;\nconst flags = new Set();\n\nfor (const item of $input.all()) {\n const content = item.json.content || ''; // Assumes content was previously fetched\n let match;\n while ((match = pattern.exec(content)) !== null) {\n flags.add(match[1]);\n }\n}\n\nreturn Array.from(flags).map(flag => ({ json: { flag } }));"
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "82ee43c2-85c4-4e36-b0ca-0c848266c6de",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1020,
1240
],
"parameters": {
"width": 500,
"height": 700,
"content": "**Purpose:**\nAutomatically find unused (“dead”) feature flags in an Android Kotlin/Java codebase and notify the team.\n\n**Core Logic:**\n\n1. **Weekly trigger** runs the check.\n2. **GitLab** → fetch code & extract used flags.\n3. **LaunchDarkly API** → fetch all flags & statuses.\n4. Compare lists → identify flags not in code and either archived or off in production.\n5. Save results to **Google Sheets**.\n6. If dead flags found → create **Jira tickets** + send **Slack alerts**.\n\n\n**Outcome:**\nKeeps feature flags clean, reduces technical debt, and informs the team automatically.\n"
},
"typeVersion": 1
},
{
"id": "ce6edc27-0f97-45a9-b36d-ad294963cfac",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-500,
1240
],
"parameters": {
"color": 4,
"width": 960,
"height": 700,
"content": "## Catalog Android (Kotlin/Java) feature flags and sweep dead flags vs LaunchDarkly (weekly) → Sheets + Jira + PR + Slack"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "97e8bc6b-a717-4a64-a148-620c2991a8fc",
"connections": {
"70dfcf7f-3d82-44d6-9ea2-ef550b5496f4": {
"main": [
[
{
"node": "75abe5e7-051f-4b87-8329-d10d87ce2b93",
"type": "main",
"index": 0
}
]
]
},
"75abe5e7-051f-4b87-8329-d10d87ce2b93": {
"main": [
[
{
"node": "566e7571-2423-4e4b-9edf-dea23b9e8fae",
"type": "main",
"index": 0
}
]
]
},
"566e7571-2423-4e4b-9edf-dea23b9e8fae": {
"main": [
[
{
"node": "afb07c42-6687-423b-9ccb-739768aa0c4f",
"type": "main",
"index": 0
}
]
]
},
"13799fe3-a8d0-4dc2-924f-a5c53c17dea5": {
"main": [
[
{
"node": "edcaa1e6-4fd2-4b06-93b5-b9219bbba407",
"type": "main",
"index": 0
}
]
]
},
"afb07c42-6687-423b-9ccb-739768aa0c4f": {
"main": [
[
{
"node": "13799fe3-a8d0-4dc2-924f-a5c53c17dea5",
"type": "main",
"index": 0
}
]
]
},
"edcaa1e6-4fd2-4b06-93b5-b9219bbba407": {
"main": [
[
{
"node": "ecc1b21c-e3b0-40ae-9e21-9b09f69db3cf",
"type": "main",
"index": 0
}
],
[
{
"node": "958b3c35-f1ea-4ef4-8c7c-3a69869e4eb1",
"type": "main",
"index": 0
}
]
]
},
"e603fbcb-275a-4356-acbf-d70a219f975c": {
"main": [
[
{
"node": "70dfcf7f-3d82-44d6-9ea2-ef550b5496f4",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 데브옵스, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
HTTP Last-Modified 확인을 사용하여 Google Sheets에서 채용 공고 만료 및 새로고침 알림 가져오기
Google Sheets, HTTP 확인 및 Gmail을 통한 채용 공고 만료 알림 자동화
If
Set
Code
+
If
Set
Code
19 노드WeblineIndia
인사
Google Sheets에서 Slack으로 면접 후 피드백 알림 전송(이메일 대체方案 포함)
Google Sheets, Slack 및 Gmail을 사용한 면접 후 피드백 알림 자동화
If
Gmail
Slack
+
If
Gmail
Slack
9 노드WeblineIndia
인사
지능형 워크플로우 유지보수 시스템
지능형 AI 필터링과 Google Workspace 통합을 지원하는 지능형 워크플로우 유지보수 시스템
If
N8n
Code
+
If
N8n
Code
42 노드Jimmy Gay
데브옵스
Groq, Gemini, Slack 승인 시스템을 사용한 RSS에서 Medium 자동 게시
Groq, Gemini 및 Slack 승인 시스템을 통한 RSS에서 Medium 발행 자동화 워크플로
If
Set
Code
+
If
Set
Code
41 노드ObisDev
콘텐츠 제작
DocuSign 및 Trello를 사용한 자동화 후보자 관리 및 피드백 시스템
Slack, DocuSign, Trello 및 Gmail 알림을 사용한 자동화된 채용 프로세스
If
Code
Wait
+
If
Code
Wait
29 노드Marth
인사
매일 생일 축하 (코드 노드 최종 버전)
基于NASA图片、GPT-4、Gmail및Slack의자동화太空主题生日이메일
If
Code
Gmail
+
If
Code
Gmail
17 노드Yanagi Chinatsu
개인 생산성
워크플로우 정보
난이도
중급
노드 수11
카테고리2
노드 유형9
저자
WeblineIndia
@weblineindiaA Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유