💥 scheduler를 적용해두었기 때문에, 잔디에 반영 여부는 추후에 다시 한 번 확인해봐야할 것 같다.
- 왜
velog에 자동으로 커밋하기
만 글이 잔뜩 있고,
잔디로 반영되지 않는다는 건 왜 안 올라 오는거야..!(물론 나도 따라했었다)
github-actions[bot]
이 github action으로 작업하는 경우, Contribution(잔디)에 반영이 안되는 것을 알게 되었다.. Github Action marketpalce 의
이 글을 전체 읽어보면서 하나하나씩 옵션값들을 대입해서 넣어보았다. 사실 나는 github action이 2번째 사용하는거라 까막눈이라 삽질을 너무 많이 했다..🥺
Workflow, job, steps
로 구성되어 있다는 것--allow-empty
변경된 것이 없어도, 빈 껍데기 커밋을 올릴 수 있다. git branch --set-upstream-to=origin/<remote-branch> <local-branch>
id: create_pr
로 지정해놓고, 다음 step에서${{ steps.create_pr.outputs.pr_number }}
${{ secrets.GITHUB_TOKEN }}
나, PAT(Personal Access Token)
를 사용해보자.$GITHUB_ENV
로 사용할 수 있었다!run: echo "PR_DATE=$(date '+%y%m%d')" >> $GITHUB_ENV
일주일동안 안돼서 github 블로그로도 시도해보고 난리를 부렸었다. 이것도 해결할 .. 해야지..
그래도 앉은 자리에서 물 마시기 외 6시간 앉아서 붙잡고 늘어졌더니 돼서 다행이다. 드디어 편하게 잠에 들 수 있겠다.
name: Update Blog Posts
on:
push:
branches:
- update-blog-posts-branch
schedule:
- cron: '0 */8 * * *'
workflow_dispatch:
inputs:
pullRequestNumber:
description: Pull request number to auto-approve
required: false
pull_request:
branches:
- main
permissions:
contents: write
pull-requests: write
jobs:
update_blog:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
pip install feedparser gitpython
- name: Configure Git
run: |
git config --global user.name 'bsjin1122'
git config --global user.email 'kitty7579@hanmail.net'
- name: Run script
run: python scripts/update_velog.py
- name: Check for Changes # Git 상태 확인
run: |
git status
git diff
id: check_changes
# Current branch is: refs/heads/update-blog-posts-branch
- name: Display Current Branch
run: |
echo "Current branch is: $GITHUB_REF"
- name: Set Date Format for PR Title
run: echo "PR_DATE=$(date '+%y%m%d')" >> $GITHUB_ENV
- name: Create Pull Request (peter-evans)
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.VELOG_TOKEN }}
author: bsjin1122 <kitty7579@hanmail.net>
body: |
:satisfied: [Velog 새 게시글 확인하기](https://velog.io/@greendev/posts)
labels: velog
title: "[${{ env.PR_DATE }}] Velog 게시글 업로드"
branch: main
base: update-blog-posts-branch
assignees: bsjin1122
id: create_pr
- name: Display PR Number # 날짜 형식
run: |
echo "Pull Request Number: ${{ steps.create_pr.outputs.pull-request-number }}"
- name: PR Auto Merge
# PR이 있는 경우에만 실행
if: steps.create_pr.outputs.pull-request-number != ''
uses: peter-evans/enable-pull-request-automerge@v3
with:
token: ${{ secrets.VELOG_TOKEN }}
pull-request-number: ${{ steps.create_pr.outputs.pull-request-number }}
# merge-method:
########### 시도 했던 방법들 -- 사용 가능한 스크립트들입니다.
# 방법1. PR 자동 승인
# - name: PR auto approval
# uses: tgymnich/fork-sync@v2.0
# with:
# token: ${{ secrets.GITHUB_TOKEN }}
# owner: bsjin1122
# base: main
# head: update-blog-posts-branch
# pr_message: "velog 작성 - PR approve 완료"
# 방법2. PR 자동 승인 -- 본인이 생성한 pr은 본인이 승인 못하게 막아둠
# - name: PR 자동 승인
# uses: hmarr/auto-approve-action@v4
# with:
# github-token: ${{ secrets.GITHUB_TOKEN }}
# pull-request-number: ${{ steps.create_pr.outputs.pr_number }}
# review-message: "Auto approved automated PR Test"
# 방법3. PR 자동 생성
# - name: Create Pull Request
# uses: peter-evans/create-pull-request@v3
# with:
# token: ${{ secrets.GITHUB_TOKEN }}
# commit-message: "Velog posts 업데이트"
# branch: update-blog-posts-branch # PR 생성 시 사용될 브랜치 이름
# title: "PR 자동 생성"
# base: main
# 변경사항이 있는 경우에만 실행
# - name: Create Pull Request
# uses: diillson/auto-pull-request@v1.0.1
# with:
# destination_branch: "main"
# github_token: ${{ secrets.VELOG_TOKEN }}
# pr_label: "velog"
# pr_title: "[${{ env.PR_DATE }}] Velog 게시글 업로드"
# pr_allow_empty: false
# pr_body: |
# :satisfied: [Velog 새 게시글 확인하기](https://velog.io/@greendev/posts)
# id: create_pr
import feedparser
import git
import os
import re
from datetime import datetime
# 벨로그 RSS 피드 URL
rss_url = 'https://api.velog.io/rss/@greendev'
# 깃허브 레포지토리 경로
repo_path = '.'
# 'C:/study/velog' # 실제 Git 저장소 경로
# 'velog-posts' 폴더 경로
posts_dir = os.path.join(repo_path, 'velog-posts')
# 'velog-posts' 폴더가 없다면 생성
os.makedirs(posts_dir, exist_ok=True)
# 레포지토리 로드
repo = git.Repo(repo_path)
# RSS 피드 파싱
feed = feedparser.parse(rss_url)
# 현재 날짜와 요일 가져오기
current_date = datetime.now().strftime("%y%m%d")
current_day = ["월", "화", "수", "목", "금", "토", "일"][datetime.now().weekday()]
date_prefix = f"{current_date}{current_day}"
# D-Day 계산 (2024년 9월 9일 기준)
base_date = datetime(2024, 9, 9)
dday_diff = (datetime.now() - base_date).days
dday_prefix = f"D+{dday_diff}" if dday_diff >= 0 else f"D{dday_diff}"
# 각 글을 파일로 저장하고 커밋
for entry in feed.entries:
file_name = entry.title.replace('/', '-').replace('\\', '-')
# 게시글 내용 확인
post_content = entry.description.strip() if entry.description else None
if not post_content:
# print(f"Skipping post '{entry.title}' as it has no content.")
continue
# 파일 이름에서 주제(subject) 추출
match = re.search(r'\[(.*?)\]', file_name)
subject = match.group(1).upper() if match else None # 대문자 설정
print(subject)
# 디렉토리 설정: subject가 있는 경우 해당 디렉토리, 없는 경우 'velog-posts'
if subject:
subject_dir = os.path.join(posts_dir, subject)
os.makedirs(subject_dir, exist_ok=True) # 해당 subject 디렉토리 생성
else:
subject_dir = posts_dir
# Oracle 관련 글인 경우 ORACLE 폴더로 변경
if subject and subject.startswith('ORACLE'):
subject_dir = os.path.join(posts_dir, 'ORACLE')
os.makedirs(subject_dir, exist_ok=True)
# 파일 경로 설정
file_path = os.path.join(subject_dir, file_name + '.md')
# 이미 파일이 존재하면 작업을 건너뛰기
if os.path.exists(file_path):
continue
# 파일 생성 및 내용 작성
with open(file_path, 'w', encoding='utf-8') as file:
file.write(post_content)
# 깃허브 커밋
commit_message = f"[{dday_prefix} | {date_prefix}] {entry.title}"
repo.git.add(file_path)
repo.git.commit('-m', commit_message)
# 커밋 여부 확인 후 변경 사항을 푸시
if repo.is_dirty(untracked_files=True):
branch_name = 'update-blog-posts-branch'
# origin/main과 현재 로컬 브랜치의 차이 확인
main_branch = 'origin/main'
# 'origin/main'과 현재 상태의 diff 확인
diff_main = repo.git.diff(main_branch)
if diff_main: # 변경 사항이 있을 경우에만 push
print(f"origin/main과 변경된 사항이 있습니다. '{branch_name}'에 push를 진행합니다.")
repo.git.fetch('origin')
repo.git.checkout(branch_name)
repo.git.pull('origin', branch_name, '--rebase')
repo.git.push('origin', branch_name)
else:
print("origin/main과 변경사항이 없으므로 push하지 않습니다.")
else:
print("Push할 변경사항이 없습니다.")
# 추후 .yml파일에서 환경변수로 사용할 예정 (예시 코드)
# with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
# f.write(f"commit_message={commit_message}\n")
# f.write(f"branch_name={branch_name}\n")
# f.write(f"file_name={file_name}\n")
[주제명]
에서 대괄호를 따로 추출해서(subject라는 변수로),