티스토리 뷰

깃허브 프로필(README.md)이 이미 존재한다는 가정하게 글을 작성하였습니다.

📝 준비물

  1. 깃허브 프로필 (본인의 깃허브 닉네임과 동일한 이름의 저장소)
  2. 블로그 RSS Feed
  3. go  v1.21.0

🐱‍👤 전체 코드

 

GitHub - piatoss3612/piatoss3612

Contribute to piatoss3612/piatoss3612 development by creating an account on GitHub.

github.com


🔧 초기 설정

 일단 본인의 깃허브 닉네임과 동일한 이름의 저장소를 git pull 또는 git clone 명령어를 사용하여 내려받습니다. 내려받은 디렉터리로 이동하여 초기 설정을 시작합니다.

$ ls
README.md

 초기 상태는 아마 README.md 파일만 존재하는 상태일 것입니다. 현재 디렉토리에서 다음 명령어를 실행하여 go 모듈을 초기화하고 main.go 파일을 생성합니다. 모듈 이름은 자유롭게 지정하셔도 좋습니다.

$ go mod init [go module 이름]
$ touch main.go

 그리고나서 다음 명령어로 필요한 패키지를 설치합니다.

$ go get github.com/mmcdole/gofeed

  마지막으로 README.md 파일을 복사하여 README.backup.md 파일을 생성합니다. README.backup.md 파일에는 최신 블로그 글이 들어갈 위치에 {{RECENT_POSTS}}를 추가해 줍니다.

...

{{RECENT_POSTS}}​

 최종적으로 디렉터리 내부에는 다음과 같은 파일들이 존재합니다.

$ ls
README.backup.md  README.md  go.mod  go.sum  main.go

💻 Go 코드 작성하기

package main

import (
	"context"
	"fmt"
	"io"
	"log"
	"os"
	"strings"
	"time"

	"github.com/mmcdole/gofeed"
)

const MAX_COUNT = 5 // 최근 포스트의 최대 개수

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	fp := gofeed.NewParser()                                                        // RSS Feed를 파싱하는 객체 생성
	feed, err := fp.ParseURLWithContext("[파싱할 RSS Feed의 링크]", ctx) // RSS Feed를 파싱
	if err != nil {
		log.Fatal(err)
	}

	items := feed.Items // Feed의 Item들을 가져옴

	builder := strings.Builder{} // 문자열을 빌드하기 위한 객체 생성

	builder.WriteString("## ☕ My recent posts\n\n") // 소제목 추가

	// Feed의 Item들을 순회하며 문자열을 빌드
	for i, item := range items {
		content := fmt.Sprintf("%d. [%s](%s) %s",
			i+1, item.Title, item.Link, item.PublishedParsed.Format("2006-01-02"), // item 번호, item 제목, item 링크, item 작성일
		)
		builder.WriteString(content)

		// MAX_COUNT만큼만 빌드 후 종료
		if i == MAX_COUNT-1 {
			break
		}

		builder.WriteString("\n") // 줄바꿈
	}

	f, err := os.Open("README.backup.md") // README.backup.md 파일을 읽기 전용으로 열기
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	f2, err := os.Create("README.md") // README.md 파일을 생성
	if err != nil {
		log.Fatal(err)
	}
	defer f2.Close()

	b, err := io.ReadAll(f) // README.backup.md 파일의 내용을 읽어옴
	if err != nil {
		log.Fatal(err)
	}

	s := strings.Replace(string(b), "{{RECENT_POSTS}}", builder.String(), 1) // README.backup.md 파일의 내용 중 {{RECENT_POSTS}}를 빌드한 문자열로 치환

	_, err = f2.WriteString(s) // README.md 파일에 문자열 쓰기
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("README.md updated")
}

 코드를 작성하고 아래와 같이 실행해 보시면 README.md 파일이 업데이트되는 것을 확인할 수 있습니다.

$ go run main.go 
README.md updated

🐱‍👤 깃허브 액션 워크플로우 설정하기

 매번 직접 실행하고 직접 깃허브 저장소로 올리는 것은 자동화가 아니죠. 여기서 깃허브 액션을 사용할 것입니다. 깃허브 액션은 깃허브에서 자체적으로 제공하는 CI/CD 도구로, 정의된 워크플로우가 클라우드 서버에서 실행되어 별다른 설정없이도 사용할 수 있으므로 처음 사용하는 사용자에게도 굉장히 간편합니다.

 

 워크플로우를 정의하는 파일은 다음 경로에 생성합니다. 파일 이름은 자유롭게 지정하시면 됩니다.

$ mkdir .github/workflows
$ touch .github/workflows/[파일 이름].yml

 워크플로우 파일은 다음과 같습니다. 

name: Go RSS Feed Crawler

on:
    push:
        branches: ["main"] # main 브랜치에 푸시되면 동작하도록 설정
    schedule:
        - cron: '0 0 * * *' # 매일 00:00 UTC에 동작하도록 설정

jobs:
    update_readme:
        runs-on: ubuntu-latest # 우분투에서 동작하도록 설정
        steps:
        - uses: actions/checkout@v3 # 깃허브 액션에서 제공하는 checkout 액션 사용

        - name: Set up Go
          uses: actions/setup-go@v4 # 깃허브 액션에서 제공하는 Go 설정 액션 사용
          with:
            go-version: '1.21' # Go 1.21 버전 사용
        
        - name: Get dependencies
          run: go get -v -t -d ./... # Go 모듈 다운로드
        
        - name: Run Go
          run: go run main.go # Go 코드 실행

        - name: Push README.md
          run: | # README.md 파일을 커밋하고 푸시하는 과정
            git config --local user.name 'Lee Hyohwak'
            git config --global user.email 'crewe1746@naver.com'
            git add README.md
            git commit -m "Update README.md"
            git push

 워크플로우를 작성하셨다면, 깃허브 봇이 저장소를 업데이트할 수 있게 저장소에서 일부 설정을 변경해 줘야 합니다.

 여기서 하단으로 내리시면 다음 설정이 있습니다.

 깃허브 봇이 저장소를 업데이트하기 위해서는 쓰기 권한이 필요합니다. 따라서 위쪽의 라디오버튼을 선택해 주시고 저장을 눌러주세요.

 

 설정을 변경하셨다면 로컬 환경으로 돌아와 작업하던 것들을 깃허브 저장소로 올려주시면 됩니다.

$ git add .
$ git commit -m "커밋 메시지"
$ git push origin main

👓 결과 확인하기

 깃허브 저장소에 작업한 코드를 올리고 나면 main 브랜치에서 push 이벤트가 발생했기 때문에 워크플로우가 실행됩니다.

 잠시 뒤에 워크플로우가 완료가 되고 초록불이 들어오게 되면 README.md 파일이 자동으로 업데이트된 것을 확인할 수 있습니다. 

최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday
글 보관함