[Github] Notion API์™€ Github Actions๋ฅผ ์ด์šฉํ•ด Github์— ์˜ฌ๋ฆฌ๊ธฐ

2025. 2. 15. 23:14ยทETC

๋‚˜๋Š” ์ฃผ๋กœ ๋ญ”๊ฐ€๋ฅผ ์ •๋ฆฌํ•  ๋•Œ๋Š” ๋…ธ์…˜์„ ์ด์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑธ ๋งค๋ฒˆ ์ผ์ผํžˆ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋‹ค์šด๋ฐ›์•„์„œ Github์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‹ค์šด๋ฐ›์„ ๋•Œ ํŒŒ์ผ๋ช…์ด ๊นจ์ ธ์„œ ๋ฐ›์•„์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๊ฑธ ๋˜ ์ผ์ผํžˆ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š”๋ฐ..
๋‚˜๋Š” ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ธ ๊ฒƒ์„ ์‹ซ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์˜ค๋Š˜์€ Github Acitons๋ฅผ ์ด์šฉํ•ด์„œ Github์— ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.
1. Notion API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Integration ์ƒ์„ฑ.
https://developers.notion.com/

 

Notion API

 

developers.notion.com

๋จผ์ €, Notion API ํŽ˜์ด์ง€์—์„œ ์ƒˆ Integration์„ ์ƒ์„ฑํ•œ๋‹ค. ๋‚˜๋Š” ํ”„๋ผ์ด๋น—์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค. ์ €์žฅํ•˜๋ฉด ํ† ํฐ์ด ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ํ† ํฐ์€ ์ถ”ํ›„์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‹ˆ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด๋‘”๋‹ค.
2. ๊ณต์œ ํ•˜๊ณ ์ž ํ•˜๋Š” ํŽ˜์ด์ง€์— Integration ์ถ”๊ฐ€

์ ๋ฐ•์ด ์„ธ๊ฐœ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์—ฐ๊ฒฐ์ด๋ผ๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ์œ„์—์„œ ๋งŒ๋“  Notion API๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค.
3. ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ
Notion ๋ฐ์ดํ„ฐ๋ฅผ Markdown์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋‚˜๋Š” Notion-to-md๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด JavaScript๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค.
https://www.npmjs.com/package/notion-to-md/v/1.0.1

 

notion-to-md

convert notion pages, block and list of blocks to markdown (supports nesting). Latest version: 3.1.5, last published: 4 days ago. Start using notion-to-md in your project by running `npm i notion-to-md`. There are 67 other projects in the npm registry usin

www.npmjs.com

import { Client } from '@notionhq/client';
import { NotionToMarkdown } from 'notion-to-md';
import { existsSync } from 'node:fs';
import { mkdirSync } from 'node:fs';
import { writeFileSync } from 'node:fs';
import dotenv from 'dotenv';

dotenv.config();
const notion = new Client({auth : process.env.NOTION_API_KEY});
const n2m = new NotionToMarkdown({ 
    notionClient: notion,
    config: {
        seperateChildPage: true,
    }
});
const databaseId = process.env.DATABASE_ID;
  
(async () => {
    try {
        const response = await notion.databases.query({
        database_id: databaseId,
        sorts: [
            {
                property: 'Name',
                direction: 'ascending',
            },
        ],
      });

      const saveDirectory = './summary';

      if (!existsSync(saveDirectory)){
        mkdirSync(saveDirectory);
      }

    const pages = response.results.map(page => {
        const pageId = page.id;
        const name = page.properties?.Name?.title?.[0]?.text?.content;
      
        return {
          pageId: pageId,
          name: name
        };
      });

      for (let page of pages){
        const mdblocks = await n2m.pageToMarkdown(page.pageId);
        const mdString = n2m.toMarkdownString(mdblocks);
        const name = page.name;
        let parts = name.split(":");
        const filePath = `${saveDirectory}/${parts[0]}-${parts[1]}.md`;
        const mdHead = `# ${page.name}\n`
        const mdContent = mdHead+ mdString.parent;
        
        writeFileSync(filePath, mdContent, "utf8");
      }
    } catch (error){
        console.error("๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:", error);
    }
})();

n2m.toMarkdownString(mdblocks)๋กœ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋•Œ, ๋””๋ ‰ํ† ๋ฆฌ ๊ฐ์ฒด์ด๋ฏ€๋กœ mdString.parent๋กœ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค.
custom์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. 
4. package.json ์ž‘์„ฑํ•˜๊ธฐ
ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด package.json์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

{
  "name": "ํŒจํ‚ค์ง€๋ช…",
  "version": "1.0.0",
  "description": "ํŒจํ‚ค์ง€ ์„ค๋ช…",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
  	"@notionhq/client": "^2.2.15",
    "dotenv": "^16.4.7",
    "notion-to-md": "^3.1.5"
  },
  "type": "module"
}

5. Github Action yaml ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

name: Convert Notion to Markdown

on:
  push:
    branches:
      - main
  schedule:
    - cron: "0 */4 * * *" # 4์‹œ๊ฐ„๋งˆ๋‹ค ์‹คํ–‰.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 22

      - name: Install dependencies
        run: |
          npm ci
          npm install notion-to-md

      - name: Convert Notion page to Markdown
        env:
          DATABASE_ID: ${{ secrets.DATABASE_ID }}
          NOTION_API_KEY: ${{ secrets.NOTION_API_KEY }}
          NOTION_PAGE_ID: ${{ secrets.NOTION_PAGE_ID }}
        run: |
          node convert.js
        
      - name: Check if there are any changes
        id: verify_diff
        run: |
          git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT

      - name: Commit and push the markdown file
        if: steps.verify_diff.outputs.changed =='true'
        run: |
          git config --global user.name '5a6io'
          git config --global user.email '${{ secrets.EMAIL }}'
          git add .
          git commit -m "Update Notion page to markdown"
          git push origin main

npm init -y๋Š” package.json์„ ์ •์˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  notion-to-md๋ฅผ ํ•„์ˆ˜๋กœ ์„ค์น˜ํ•œ๋‹ค. ๋‚œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— dotenv๋„ ์„ค์น˜ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  verify_diff์—์„œ changed๊ฐ€ true๋ผ๋ฉด ๋‚ด์šฉ์ด ๋ณ€ํ•œ ๊ฒƒ์ด ์žˆ์„ ๋•Œ๋งŒ commit ๋ฐ push๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค๋งŒ ์ฒ˜์Œ์— ํ‘ธ์‹œ๋ฅผ ํ•˜๋ฉด ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

ํ•ด๋‹น ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ Settings โžก๏ธ Actions โžก๏ธ General ํ•˜๋‹จ์— ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ๋ณด์ด๋Š” ๊ณณ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ฒ˜์Œ์—๋Š” Read repository contents adn packages permissions๋กœ ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์“ฐ๊ธฐ๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ Read and write permissions๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.
6. ๊ฒฐ๊ณผ

๊ทธ๋Ÿฌ๋ฉด ์œ„์™€ ๊ฐ™์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ ๋ถ€๋ถ„์€ indent์—์„œ ์ €๋ ‡๊ฒŒ ๋ถ‰์€ ๊ฒŒ ์ƒ๊ธฐ๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋‚˜๋ฆ„ ๋งŒ์กฑํ•œ๋‹ค.


https://github.com/5a6io/CKA

 

GitHub - 5a6io/CKA: CKA ์‹œํ—˜ ๋Œ€๋น„ ๋‚ด์šฉ ์ •๋ฆฌ

CKA ์‹œํ—˜ ๋Œ€๋น„ ๋‚ด์šฉ ์ •๋ฆฌ. Contribute to 5a6io/CKA development by creating an account on GitHub.

github.com

ํ•ด๋‹น repository๋Š” ์œ„ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์„œ ๋…ธ์…˜์„ ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ ธ๋‹ค. ๋‚˜๋Š” ์œ„ ํŒจํ‚ค์ง€๋ฅผ ํ™œ์šฉํ•ด README.md๋„ Github Actions๋ฅผ ์ด์šฉํ•ด์„œ ์ ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค ์กฐ๊ธˆ ๋ถˆ์™„์ „ํ•˜๋‹ค. README.md๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜์–ด์•ผ์ง€ verify_diff ๋ถ€๋ถ„์—์„œ diff๋ฅผ ์ธ์‹ํ•ด์„œ ๋ฐ”๋€๋‹ค. ์•„๋‹ˆ๋ฉด ์กฐ๊ฑด์„ ๋นผ์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋Ÿฌ๋ฉด ์ƒˆ๋กœ ๋ฐ”๋€ ๊ฒŒ ์—†์„ ๋•Œ๋Š” ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ 4์‹œ๊ฐ„ ๋งˆ๋‹ค ์ผ์–ด๋‚  ๊ฒƒ์ด๋‹ค. ์–ด์ฐจํ”ผ ๊ฐ•์˜๋ฅผ ๋‹ค ๋“ฃ๊ณ  ๊ธฐ๋กํ•  ์ƒ๊ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ํฌ๊ฒŒ ์ƒ๊ด€์ด ์—†์ง€๋งŒ ์ด ๋ถ€๋ถ„์€ ๋‚˜์ค‘์— ํ•ด๊ฒฐํ•ด๋ณด๊ฒ ๋‹ค.


25.02.16 ์—…๋ฐ์ดํŠธ

๋ถ‰๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ๋…ธ์…˜์—์„œ ํƒญํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ„๊ฒฉ์„ ๋„์šด ๊ฒƒ์ด ์›์ธ์ด์—ˆ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'ETC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 2๊ธ‰ ํ•ฉ๊ฒฉ ํ›„๊ธฐ  (1) 2025.07.07
[์„œํ‰] ๊ธฐ์ดˆ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๋Š” ์ตœ์‹  ์Šคํ† ๋ฆฌ์ง€ ์ž…๋ฌธ  (1) 2024.12.12
JLPT N1 ํ•ฉ๊ฒฉ ํ›„๊ธฐ  (1) 2024.10.15
AWS SAA-C03 ์ž๊ฒฉ์ฆ ํ•ฉ๊ฒฉ ํ›„๊ธฐ  (1) 2024.09.28
'ETC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 2๊ธ‰ ํ•ฉ๊ฒฉ ํ›„๊ธฐ
  • [์„œํ‰] ๊ธฐ์ดˆ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๋Š” ์ตœ์‹  ์Šคํ† ๋ฆฌ์ง€ ์ž…๋ฌธ
  • JLPT N1 ํ•ฉ๊ฒฉ ํ›„๊ธฐ
  • AWS SAA-C03 ์ž๊ฒฉ์ฆ ํ•ฉ๊ฒฉ ํ›„๊ธฐ
The Engineer, Lucy
The Engineer, Lucy
  • The Engineer, Lucy
    Growing up for My Future๐Ÿ’•
    The Engineer, Lucy
    • Instagram
    • GitHub
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (173)
      • Linux (26)
      • Infra (9)
      • Cloud (25)
        • AWS (2)
        • GCP (3)
        • Docker (4)
        • Kubernetes (14)
        • IaC (2)
      • NGINX (1)
      • DevOps (3)
      • Computer Science (17)
        • Data Structure (0)
        • Algorithms (1)
        • Operating System (3)
        • Network (11)
        • Database System (2)
      • Coding Test (87)
        • Algorithms (79)
        • SQL (7)
      • ETC (5)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๊ณต์ง€์‚ฌํ•ญ

  • ๋งํฌ

    • Lucy's Instagram
    • Lucy's GitHub
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    Java
    Shell Script
    bfs
    ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ
    ๋„คํŠธ์›Œํฌ
    ์ž๋ฐ”
    ๋„์ปค
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ๋ฐฑ์ค€
    ๋„คํŠธ์›Œํฌ ๊ธฐ์ดˆ ์ง€์‹
    ์˜ค๋ธ”์™„
    ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    K8s
    cs ๊ธฐ์ดˆ ์ง€์‹ ์ •๋ฆฌ
    ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 2๊ธ‰
    dfs
    Kubernetes
    programmers
    Shell
    ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰
    ์‰˜ ์Šคํฌ๋ฆฝํŠธ
    Linux
    network
    ๋ฆฌ๋ˆ…์Šค
    Baekjoon
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ณต๋ถ€
    ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
    ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค
    docker
    ์…ธ ์Šคํฌ๋ฆฝํŠธ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
The Engineer, Lucy
[Github] Notion API์™€ Github Actions๋ฅผ ์ด์šฉํ•ด Github์— ์˜ฌ๋ฆฌ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”