8
n8n 한국어amn8n.com

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)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
중급
노드 수11
카테고리2
노드 유형9
난이도 설명

일정 경험을 가진 사용자를 위한 6-15개 노드의 중간 복잡도 워크플로우

저자
WeblineIndia

WeblineIndia

@weblineindia

A Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34