배경
나는 집에 nas와 개인 맥북 서버를 가지고 있을 정도로 개발 환경에 매우 호기심이 많다. 요즘에는 obsidian 노트를 중점적으로 내 모든 워크플로우를 가져가려고 노력중이다.
회사에서도 AI를 이용한 코딩이나 작업에 상당 부분 관심을 가지고 있었고, 나도 Claude code를 지르고(!!) 내가 사용하는 많은 부분을 자동화 해보면 좋겠다는 생각이 들었다.
그러던 와중에 최근 블로그 독후감을 많이 안올린 것이 생각이 나서 이걸 내 노트앱과 연동할 수 없을까라는 생각을 하게 된 것이다. 독후감이라고 해봐야 엄청 특별한 내용도 아니고, 마크다운 문법까지만 지원 되어도 괜찮을 것 같았다.
작업 준비
일단은 requirements.md에 내가 원하는 것을 세부적으로 작성했다. 내가 준비되어있는 서버 인스턴스와 원하는 것이 뭔지, sonnet 을 사용하면서 같이 동기화 로직과 요구사항을 구체화해 나갔다.
일단은 한판이 짜여졌고 내가 생각한대로 n8n에서 돌릴 수 있도록 했다.
obsidian -> gitlab -> n8n -> wordpress 로 해보자
내 서버에 n8n도 깔려있으니까 문제없겠지? 라는 생각으로 n8n mcp 노드를 이용하여 클로드를 이용하여 연동 시켜보려 했지만..
클로드 코드가 계속 n8n 서버 노드에 워크플로우 생성을 실패했다. 워크플로우 자체 json 문법은 학습이 덜 되어서 그런가.. 테스트도 결국 내가 해야 하고 이대로면 오늘 안에 끝내지 못할 것도 같았다.
obsidian -> gitlab -> runner (python 스크립트) -> wordpress 로 해보자
연동이 잘 되지 않아서 결국에는 n8n 을 버리고 gitlab 의 ci/cd 기능으로 변경해서 동기화 파이썬 스크립트를 runner에서 돌아갈 수 있도록 했다. 이걸 굳이 코드로..? 파이썬 스크립트로 작성해서 잘 될지 조금 반신반의였는데
뭐.. 생각보다 너무 잘되었다. 처음 테스트부터 버그나는 부분 없이 딱딱 잘되는 부분이 조금 충격적이기도 하다.
원래는 독후감만 했던 것을 카테고리 기능까지 사용하게 해서 전체 블로그 포스트를 관리 할 수 있도록 하고 다만 wordpress에서만 관리되는 포스트는 건드리지 않는 방향으로 전체 스크립트를 완료 할 수있었다.
거기다가 visual link 기능도 만들었고 개발 코드 문법 하이라이트까지 들어가 있었다. 기능이 아예 안들어간 줄 알았더니, 이미 반영되어 있었고 css 설정만 추가로 해주니까 끝났다.
이건 진짜 뭐지..? 싶을 정도로 너무나도 연동이 잘되어서 어이가 없었다.
결론
- claude code는 생각보다도 더 잘했다.. 한방에 모두 해결해주지는 않아도 문서를 기반으로 작업하니까, 문제를 해결함에 있어 훨씬 정확히 하는 것 같다.
- n8n은 완전 개발자보다는 비개발자-개발자 중간 어딘가의 자동화에 더 적합한 것 같다.
- 이제 블로그 더 열심히 해보자
requirements.md
# GitLab CI/CD 블로그 자동화
### 준비되있는 것
- n8n (mcp 서버)
- gitlab 서버
- wordpress (n8n에 연결)
### 사용자 시나리오
사용자는 obsidian을 이용하여 gitlab서버의 {{ 특정 repo }} 으로 노트들을 동기화하여 사용중이다.
매번 obsidian 동기화 올라오는 main 브랜치의 커밋을 listening 하고
{{ 특정 경로 }} 하위 경로(재귀 포함)에 존재하는 마크다운 파일 노트들을 frontmatter를 사용하여 아래와 유사한 형태로 사용하려 한다
### 마크다운 / 문서 포맷
```md
---
title: 메롱
publish: "false"
---
```
이미지는 {{ 특정 }} 폴더 하위에서 찾아 html base64 임베딩으로 변환한다.
위키링크는 노트에서 사용하지 않는다. 만일 발견 될 경우에 일반 텍스트로 변환한다.
Markdown을 HTML 형식으로 미리 변환한 후 WordPress에 전송한다.
### 로직
해당 경로 하위 파일이 수정된 커밋이 발행될 때마다 n8n 워크플로우를 돈다.
publish가 true로 되어있는 것을 실제로 글을 발행하고, false로 되어있는 것은 draft 상태를 사용한다. 변경시에도 적용한다.
파일이름이 아닌 title 프론트매터를 이용하여 post를 등록한다.
만일 post_id가 없을 경우에만 post를 등록하고나서 다시 gitlab의 main 브랜치에 해당 내용을 추가해서 커밋 한다.
파일이 추가/수정된 이벤트를 받았을 때에 포스트가 존재하는지 체크하고 발행/수정/발행취소/제목수정등이 모두 가능해야 한다.
파일 삭제를 했을 경우에도 마찬가지로 글을 삭제한다.
wordPress에서 직접수정한 내용은 무시하고 overwrite해도 상관 없다.
gitlab을 단일 진실 공급원(ssot)로 사용한다. 단, gitlab에서 등록되거나 관리된적 없는 wordpress 포스트들은 건드리거나 삭제하지 않는다.
커밋 메시지에 skip-ci으로 넣는 것은 무시한다. post_id를 등록할때 해당 skip-ci 문구를 사용하여 커밋해야 한다.