Atlassian API 활용한 Confluence WIKI 문서 작업 자동화
Confluence WIKI에 있는 표 형태의 내용 중 특정 필드의 값을 업데이트하는 작업을 n8n을 통해 자동화하려면 다음 단계를 따라야 합니다. 여기서는 Confluence API를 사용하여 표 데이터를 가져오고 업데이트하는 방법에 대한 설명입니다.
사전 준비
- Confluence API Token 생성
- Confluence 계정으로 로그인하여 API 토큰을 생성합니다. Confluence API Token 생성 링크
- n8n 설치 및 설정
- n8n을 설치하고 실행합니다. (자세한 설치 방법은 n8n 공식 문서를 참고하세요.)
n8n Workflow 작성
- 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
- HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
- Data Transformation Node 추가 (표 데이터 분석)
- HTTP Request 노드의 출력을 받아 표 데이터를 분석하고 필요한 필드를 업데이트합니다.
- Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
const data = items[0].json.body.storage.value; // HTML 데이터 가져오기 // 표 데이터 파싱 및 특정 필드 업데이트 로직 작성 // 예: table row 및 cell 업데이트 return [{ json: { updatedTable: modifiedHtmlTable } }];
- 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 페이지에 업데이트하기 위해 HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
이 워크플로우는 Confluence 페이지에서 데이터를 가져와 특정 필드를 업데이트하고 다시 Confluence에 업데이트된 데이터를 저장합니다. 각 노드의 설정을 실제 Confluence 계정과 페이지 ID에 맞게 조정하면 됩니다. Confluence WIKI 콘텐츠를 HTML로 가져오면 작업이 어려울 수 있으므로, 마크다운(Markup)으로 변환 후 업데이트하는 방법을 사용하는 것이 더 효과적일 수 있습니다. 이를 위해 Confluence API와 n8n을 활용하여 다음과 같이 자동화할 수 있습니다.
- 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
- HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
- 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 } }];
- HTML 데이터를 가져온 후 마크다운으로 변환합니다. 이를 위해
- Function Node 추가 (마크다운 데이터 변환 및 업데이트)
- 마크다운 데이터를 변환하여 필요한 필드를 업데이트합니다.
- Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
const markdownContent = items[0].json.markdownContent; // 예: 특정 필드를 업데이트하는 로직 작성 const updatedMarkdownContent = markdownContent.replace(/oldValue/g, 'newValue'); return [{ json: { updatedMarkdownContent } }];
- 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 } }];
- 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" } } }
- 변환된 데이터를 Confluence 페이지에 업데이트하기 위해 HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
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 설정
- API 인증 정보 준비
- Confluence의 REST API를 사용하기 위해 API Token 또는 사용자 이름과 비밀번호가 필요합니다.
- Confluence Cloud에서는 이메일과 API Token을 사용합니다.
- API URL 구성
- 기본 URL은 다음과 같습니다.
https://<your-domain>.atlassian.net/wiki/rest/api/content/search
- 특정 스페이스에서 키워드로 검색하려면 다음과 같은
cql
쿼리 파라미터를 사용합니다.?cql=space=<space-key> AND (title~"<keyword>" OR text~"<keyword>")
- 기본 URL은 다음과 같습니다.
단계 2: n8n에서 HTTP Request 노드 설정
- HTTP Request 노드 추가
- n8n에서 새 워크플로우를 생성하고 HTTP Request 노드를 추가합니다.
- 노드 구성
- 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
- Username:
- Headers:
Content-Type: application/json
Accept: application/json
- Method:
- 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: 워크플로우 테스트 및 실행
- 워크플로우 테스트
- 설정이 완료되면 워크플로우를 실행하여 결과를 확인합니다.
- HTTP Request 노드의 출력에서 Confluence 페이지 목록을 확인할 수 있습니다.
- 후속 작업 설정
- 필요에 따라 추가 노드를 연결하여 검색된 페이지 목록을 처리하거나 다른 작업을 수행할 수 있습니다.
이 설정을 통해 n8n을 사용하여 Confluence API에서 특정 스페이스와 키워드로 페이지를 검색하는 HTTP Request 노드를 구성할 수 있습니다.