본문 바로가기
프로그램 (PHP,Python)

Atlassian API 활용한 Confluence WIKI 문서 작업 자동화

by 날으는물고기 2024. 9. 9.

Atlassian API 활용한 Confluence WIKI 문서 작업 자동화

Open API Documentation for Confluence

Confluence WIKI에 있는 표 형태의 내용 중 특정 필드의 값을 업데이트하는 작업을 n8n을 통해 자동화하려면 다음 단계를 따라야 합니다. 여기서는 Confluence API를 사용하여 표 데이터를 가져오고 업데이트하는 방법에 대한 설명입니다.

사전 준비

  1. Confluence API Token 생성
  2. n8n 설치 및 설정
    • n8n을 설치하고 실행합니다. (자세한 설치 방법은 n8n 공식 문서를 참고하세요.)

n8n Workflow 작성

  1. HTTP Request Node 추가 (Confluence에서 페이지 데이터 가져오기)
    • HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: GET
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}?expand=body.storage
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Response Format: JSON
  2. Data Transformation Node 추가 (표 데이터 분석)
    • HTTP Request 노드의 출력을 받아 표 데이터를 분석하고 필요한 필드를 업데이트합니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const data = items[0].json.body.storage.value; // HTML 데이터 가져오기
      // 표 데이터 파싱 및 특정 필드 업데이트 로직 작성
      // 예: table row 및 cell 업데이트
      return [{ json: { updatedTable: modifiedHtmlTable } }];
  3. HTTP Request Node 추가 (Confluence 페이지 업데이트)
    • 변환된 데이터를 Confluence 페이지에 업데이트하기 위해 HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: PUT
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Body: JSON
        {
          "version": {
            "number": newVersionNumber
          },
          "title": "Page Title",
          "type": "page",
          "body": {
            "storage": {
              "value": updatedTable, // 업데이트된 HTML 테이블
              "representation": "storage"
            }
          }
        }

이 워크플로우는 Confluence 페이지에서 데이터를 가져와 특정 필드를 업데이트하고 다시 Confluence에 업데이트된 데이터를 저장합니다. 각 노드의 설정을 실제 Confluence 계정과 페이지 ID에 맞게 조정하면 됩니다. Confluence WIKI 콘텐츠를 HTML로 가져오면 작업이 어려울 수 있으므로, 마크다운(Markup)으로 변환 후 업데이트하는 방법을 사용하는 것이 더 효과적일 수 있습니다. 이를 위해 Confluence API와 n8n을 활용하여 다음과 같이 자동화할 수 있습니다.

  1. HTTP Request Node 추가 (Confluence에서 페이지 데이터 가져오기)
    • HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: GET
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}?expand=body.storage
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Response Format: JSON
  2. Function Node 추가 (HTML을 마크다운으로 변환)
    • HTML 데이터를 가져온 후 마크다운으로 변환합니다. 이를 위해 turndown 라이브러리를 사용할 수 있습니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const TurndownService = require('turndown');
      const turndownService = new TurndownService();
      const htmlContent = items[0].json.body.storage.value;
      const markdownContent = turndownService.turndown(htmlContent);
      return [{ json: { markdownContent } }];
  3. Function Node 추가 (마크다운 데이터 변환 및 업데이트)
    • 마크다운 데이터를 변환하여 필요한 필드를 업데이트합니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const markdownContent = items[0].json.markdownContent; // 예: 특정 필드를 업데이트하는 로직 작성
      const updatedMarkdownContent = markdownContent.replace(/oldValue/g, 'newValue');
      return [{ json: { updatedMarkdownContent } }];
  4. Function Node 추가 (마크다운을 HTML로 다시 변환)
    • 업데이트된 마크다운 데이터를 HTML로 변환합니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const markdown = require('markdown-it')();
      const updatedMarkdownContent = items[0].json.updatedMarkdownContent;
      const updatedHtmlContent = markdown.render(updatedMarkdownContent);
      return [{ json: { updatedHtmlContent } }];
  5. HTTP Request Node 추가 (Confluence 페이지 업데이트)
    • 변환된 데이터를 Confluence 페이지에 업데이트하기 위해 HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: PUT
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Body: JSON
        {
          "version": {
            "number": newVersionNumber
          },
          "title": "Page Title",
          "type": "page",
          "body": {
            "storage": {
              "value": updatedHtmlContent, // 업데이트된 HTML 콘텐츠
              "representation": "storage"
            }
          }
        }

Workflow 예제

[
  {
    "nodes": [
      {
        "parameters": {
          "requestMethod": "GET",
          "url": "https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}?expand=body.storage",
          "responseFormat": "json",
          "headerParametersUi": {
            "parameter": [
              {
                "name": "Authorization",
                "value": "Bearer <API_Token>"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          },
          "options": {}
        },
        "name": "Get Page Data",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          250,
          300
        ]
      },
      {
        "parameters": {
          "functionCode": "const TurndownService = require('turndown');\nconst turndownService = new TurndownService();\n\nconst htmlContent = items[0].json.body.storage.value;\nconst markdownContent = turndownService.turndown(htmlContent);\n\nreturn [{ json: { markdownContent } }];"
        },
        "name": "Convert HTML to Markdown",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          450,
          300
        ]
      },
      {
        "parameters": {
          "functionCode": "const markdownContent = items[0].json.markdownContent;\n\n// 예: 특정 필드를 업데이트하는 로직 작성\nconst updatedMarkdownContent = markdownContent.replace(/oldValue/g, 'newValue');\n\nreturn [{ json: { updatedMarkdownContent } }];"
        },
        "name": "Update Markdown Content",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          650,
          300
        ]
      },
      {
        "parameters": {
          "functionCode": "const markdown = require('markdown-it')();\nconst updatedMarkdownContent = items[0].json.updatedMarkdownContent;\nconst updatedHtmlContent = markdown.render(updatedMarkdownContent);\n\nreturn [{ json: { updatedHtmlContent } }];"
        },
        "name": "Convert Markdown to HTML",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          850,
          300
        ]
      },
      {
        "parameters": {
          "requestMethod": "PUT",
          "url": "https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}",
          "responseFormat": "json",
          "headerParametersUi": {
            "parameter": [
              {
                "name": "Authorization",
                "value": "Bearer <API_Token>"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          },
          "options": {},
          "bodyParametersUi": {
            "parameter": [
              {
                "name": "version",
                "value": {
                  "number": newVersionNumber
                }
              },
              {
                "name": "title",
                "value": "Page Title"
              },
              {
                "name": "type",
                "value": "page"
              },
              {
                "name": "body",
                "value": {
                  "storage": {
                    "value": updatedHtmlContent,
                    "representation": "storage"
                  }
                }
              }
            ]
          }
        },
        "name": "Update Page Data",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          1050,
          300
        ]
      }
    ],
    "connections": {
      "Get Page Data": {
        "main": [
          [
            {
              "node": "Convert HTML to Markdown",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Convert HTML to Markdown": {
        "main": [
          [
            {
              "node": "Update Markdown Content",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Update Markdown Content": {
        "main": [
          [
            {
              "node": "Convert Markdown to HTML",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Convert Markdown to HTML": {
        "main": [
          [
            {
              "node": "Update Page Data",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    }
  }
]

이 워크플로우는 Confluence 페이지에서 데이터를 가져와 마크다운으로 변환한 후, 특정 필드를 업데이트하고 다시 HTML로 변환하여 Confluence에 저장합니다. 각 노드의 설정을 실제 Confluence 계정과 페이지 ID에 맞게 조정하면 됩니다.

 

Confluence API를 통해 검색을 수행하려면 cql 쿼리를 사용하여 검색할 수 있습니다. 아래는 n8n HTTP Request 노드에서 Confluence API를 통해 특정 스페이스에서 특정 키워드를 검색하여 페이지 목록을 가져오는 설정 방법입니다.

단계 1: Confluence API 설정

  1. API 인증 정보 준비
    • Confluence의 REST API를 사용하기 위해 API Token 또는 사용자 이름과 비밀번호가 필요합니다.
    • Confluence Cloud에서는 이메일과 API Token을 사용합니다.
  2. API URL 구성
    • 기본 URL은 다음과 같습니다.
      • https://<your-domain>.atlassian.net/wiki/rest/api/content/search
    • 특정 스페이스에서 키워드로 검색하려면 다음과 같은 cql 쿼리 파라미터를 사용합니다.
      • ?cql=space=<space-key> AND (title~"<keyword>" OR text~"<keyword>")

단계 2: n8n에서 HTTP Request 노드 설정

  1. HTTP Request 노드 추가
    • n8n에서 새 워크플로우를 생성하고 HTTP Request 노드를 추가합니다.
  2. 노드 구성
    • Method: GET
    • URL: https://<your-domain>.atlassian.net/wiki/rest/api/content/search?cql=space="<space-key>" AND (title~"<keyword>" OR text~"<keyword>")
    • Authentication: Basic Auth
      • Username: your-email
      • Password: your-api-token
    • Headers:
      • Content-Type: application/json
      • Accept: application/json
  3. Example
    {
      "nodes": [
        {
          "parameters": {
            "authentication": "basicAuth",
            "requestMethod": "GET",
            "url": "https://<your-domain>.atlassian.net/wiki/rest/api/content/search?cql=space=\"<space-key>\" AND (title~\"<keyword>\" OR text~\"<keyword>\")",
            "jsonParameters": true,
            "responseFormat": "json",
            "headerParametersJson": {
              "Content-Type": "application/json",
              "Accept": "application/json"
            },
            "queryParametersJson": {},
            "sendBinaryData": false
          },
          "name": "Confluence Search",
          "type": "n8n-nodes-base.httpRequest",
          "typeVersion": 1,
          "position": [
            450,
            250
          ],
          "credentials": {
            "httpBasicAuth": {
              "id": "1",
              "name": "Confluence Basic Auth"
            }
          }
        }
      ],
      "connections": {}
    }

단계 3: 워크플로우 테스트 및 실행

  1. 워크플로우 테스트
    • 설정이 완료되면 워크플로우를 실행하여 결과를 확인합니다.
    • HTTP Request 노드의 출력에서 Confluence 페이지 목록을 확인할 수 있습니다.
  2. 후속 작업 설정
    • 필요에 따라 추가 노드를 연결하여 검색된 페이지 목록을 처리하거나 다른 작업을 수행할 수 있습니다.

이 설정을 통해 n8n을 사용하여 Confluence API에서 특정 스페이스와 키워드로 페이지를 검색하는 HTTP Request 노드를 구성할 수 있습니다.

728x90

댓글