Directorio de banderas de características de Android y limpieza de banderas no válidas mediante comparación con LaunchDarkly

Intermedio

Este es unDevOps, Multimodal AIflujo de automatización del dominio deautomatización que contiene 11 nodos.Utiliza principalmente nodos como If, Code, Jira, Slack, Gitlab. Detectar funciones de Android no utilizadas con GitLab, LaunchDarkly, Jira y Slack

Requisitos previos
  • Bot Token de Slack o URL de Webhook
  • Personal Access Token de GitLab
  • Pueden requerirse credenciales de autenticación para la API de destino
  • Credenciales de API de Google Sheets
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "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": "Verificar Flags Inactivos",
      "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": "Activador Programado",
      "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": "Hojas de Google",
      "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": "Solicitud HTTP",
      "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": "Encontrar flags inactivos",
      "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": "Detectar flags",
      "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": "Nota Adhesiva",
      "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": "Nota Adhesiva1",
      "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": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "afb07c42-6687-423b-9ccb-739768aa0c4f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets": {
      "main": [
        [
          {
            "node": "edcaa1e6-4fd2-4b06-93b5-b9219bbba407",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "afb07c42-6687-423b-9ccb-739768aa0c4f": {
      "main": [
        [
          {
            "node": "Google Sheets",
            "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
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Intermedio - DevOps, IA Multimodal

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Flujos de trabajo relacionados recomendados

Verificación de vencimiento y recordatorios de actualización para publicaciones de empleos desde Google Sheets usando HTTP Last-Modified
Automatización de recordatorios de publicación de empleos vencidos con Google Sheets, verificaciones HTTP y Gmail
If
Set
Code
+
If
Set
Code
19 NodosWeblineIndia
Recursos Humanos
Envío de recordatorios de retroalimentación post-entrevista a Slack desde Google Sheets (con respaldo por correo)
Automatizar los recordatorios de comentarios post-entrevista con Google Sheets, Slack y Gmail
If
Gmail
Slack
+
If
Gmail
Slack
9 NodosWeblineIndia
Recursos Humanos
Sistema inteligente de mantenimiento de flujos de trabajo
Sistema de mantenimiento de flujos de trabajo inteligentes con filtrado de IA e integración de Google Workspace
If
N8n
Code
+
If
N8n
Code
42 NodosJimmy Gay
DevOps
Automatizar la publicación de RSS a Medium con Groq, Gemini y sistema de aprobación de Slack
Automatizar el flujo de publicación de RSS a Medium con Groq, Gemini y sistema de aprobación de Slack
If
Set
Code
+
If
Set
Code
41 NodosObisDev
Creación de contenido
Sistema automatizado de gestión de candidatos y retroalimentación con DocuSign y Trello
Proceso de contratación automatizado con Slack, DocuSign, Trello y notificaciones de Gmail
If
Code
Wait
+
If
Code
Wait
29 NodosMarth
Recursos Humanos
Celebración de cumpleaños diario (versión final del nodo de código)
Email de cumpleaños espacial automatizado basado en imágenes de NASA, GPT-4, Gmail y Slack
If
Code
Gmail
+
If
Code
Gmail
17 NodosYanagi Chinatsu
Productividad personal
Información del flujo de trabajo
Nivel de dificultad
Intermedio
Número de nodos11
Categoría2
Tipos de nodos9
Descripción de la dificultad

Adecuado para usuarios con experiencia intermedia, flujos de trabajo de complejidad media con 6-15 nodos

Autor
WeblineIndia

WeblineIndia

@weblineindia

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

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34