Post

GitHub Action을 활용한 Python 패키지로 크롤링 결과물 저장하기

개요

이번 포스팅에서는 GitHub Action을 이용하여 Python 패키지를 활용하여 웹 크롤링한 결과를 저장하는 방법을 살펴보겠습니다.

아티팩트가 무엇인가

아티팩트는 GitHub Actions 워크플로우에서 생성되거나 사용되는 파일 또는 폴더를 가리키는 용어입니다. 주로 워크플로우 실행 중에 생성된 결과물을 저장하고 공유하는 데 사용됩니다.

아티팩트는 작업의 결과물을 유지하고 보관하는 데 사용되며, GitHub Actions의 강력한 기능 중 하나입니다.

아티팩트를 가져오는 방법들

GitHub Actions를 사용하여 폴더를 아티팩트로 가져오는 방법은 다음과 같이 여러 가지가 있습니다.

  1. 파일 복사 작업: GitHub Actions 워크플로우에서 파일을 특정 폴더에 복사한 다음, 해당 폴더를 아티팩트로 만들어 저장합니다. 이를 위해 actions/upload-artifact 액션을 사용할 수 있습니다. 예를 들어, 다음과 같이 하위 폴더를 아티팩트로 업로드할 수 있습니다:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    - name: Copy Files
    run: |
       mkdir -p artifacts
       cp -r path/to/folder artifacts/
    - name: Upload Artifact
    uses: actions/upload-artifact@v2
    with:
       name: my-artifact
       path: artifacts
    
  2. ZIP 파일 생성: 폴더를 ZIP 파일로 압축한 다음, 이를 아티팩트로 업로드합니다. 이를 위해 actions/upload-artifact 액션을 사용하고, 폴더를 먼저 압축한 다음에 아티팩트로 업로드할 수 있습니다:
    1
    2
    3
    4
    5
    6
    7
    8
    
    - name: Compress Folder
    run: |
       zip -r folder.zip path/to/folder
    - name: Upload Artifact
    uses: actions/upload-artifact@v2
    with:
       name: my-artifact
       path: folder.zip
    
  3. 디렉터리 구조 그대로 업로드: 폴더와 그 내용을 그대로 아티팩트로 업로드합니다. 이를 위해서는 별도의 작업 없이 아티팩트 업로드 액션에 직접 해당 폴더를 지정합니다:
    1
    2
    3
    4
    5
    
    - name: Upload Artifact
    uses: actions/upload-artifact@v2
    with:
       name: my-artifact
       path: path/to/folder
    

이러한 방법 중 하나를 선택하여 GitHub Actions 워크플로우에서 폴더를 아티팩트로 가져올 수 있습니다.

내가 채택한 방식

저는 위 3가지 방법중 3번째인 디렉터리 구조 그대로 업로드 하는 방법을 사용했습니다.

일단 제가 사용한 방법부터 코드를 첨부하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
    - name: Find generated folders
      id: find_folders
      run: |
        folders=$(find . -type d -name "$(date +'%Y-%m-%d')")
        echo "Found folder: $folders"
        echo "FOLDERS=$folders" >> $GITHUB_ENV
    
    - name: Upload artifacts
      uses: actions/upload-artifact@v2
      with:
        name: my_artifact
        path: $

코드를 설명해보면 아래와 같습니다. find_folders 작업에서는 find 명령어를 사용하여 특정 날짜 형식의 폴더를 찾고, 해당 폴더를 환경 변수에 저장합니다. 그 후, Upload artifacts 작업에서는 환경 변수에 저장된 폴더를 바로 아티팩트로 업로드합니다. 제가 선택할 폴더는 현재 날짜로 된 폴더를 만들기 때문에 현재 날짜로 된 폴더를 선택했습니다.

워크플로우 실행 중에 생성된 아티팩트는 해당 실행 동안에만 유효하며, 워크플로우 실행이 완료되면 삭제됩니다. 따라서 아티팩트로 업로드된 파일을 워크플로우가 종료된 후에도 영구적으로 보존하려면 다른 저장소 또는 외부 스토리지 서비스로 이동하거나 다운로드하여 보관해야 합니다.

이를 위해 저희는 깃허브에 저희가 수집한 데이터를 업로드해야 합니다.

GitHub Commit하기

1
2
3
4
5
6
7
8
9
   - name: Commit changes
     run: |
       git add .
       git commit -m "Committing travel chart data"

   - name: Push changes
     uses: ad-m/github-push-action@master
     with: 
       branch: "main"

여기서 저희는 수정된 사항 모두를 업로드하기 위해

1
git add .

이부분으로 모든 수정사항을 선택합니다.

이후 모든 사항을 GitHub에 푸쉬함으로써 저희가 수집한 내용이 있는 아티팩트를 업로드 할 수 있었습니다.

혹시 몰라서 제 워크플로워 코드 전체 밑에 첨부했습니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
name: Python package

on:
  push:
    branches: [ "main" ] 
  pull_request:
    branches: [ "main" ]
  schedule:
    - cron: '30 1 * * *'

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python $
      uses: actions/setup-python@v3
      with:
        python-version: $
        
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip

    - name: Install libraries
      run: |
        pip install requests
        pip install pandas
        pip install beautifulsoup4
        pip install lxml
        pip install selenium
        pip install webdriver_manager
       
    - name: Run Python script
      run: |
        python3 travelrank.py

    - name: Find generated folders
      id: find_folders
      run: |
        folders=$(find . -type d -name "$(date +'%Y-%m-%d')")
        echo "Found folder: $folders"
        echo "FOLDERS=$folders" >> $GITHUB_ENV
    
    - name: Upload artifacts
      uses: actions/upload-artifact@v2
      with:
        name: my_artifact
        path: $

    - name: Configure Git
      run: |
        git config --global user.email "이메일"
        git config --global user.name "깃허브 사용자 이름"

    - name: Commit changes
      run: |
        git add .
        git commit -m "Committing travel chart data"

    - name: Push changes
      uses: ad-m/github-push-action@master
      with: 
        branch: "main"

모르시거나 햇갈리는 사항 있으시면 댓글 부탁드립니다.

항상 부족한 글 읽어 주셔서 감사합니다.

This post is licensed under CC BY 4.0 by the author.