본문 바로가기
취준 생활/프로젝트

Github Actions와 Issue로 간단하게 메일링 서비스 구현하기 - 'Dev-Event-Subscribe'

by Limm_jk 2021. 2. 17.

예전 이 글을 작성할 때 Actions를 이용해 뭔가 정말 간단하게 서비스를 만들 수 있지 않을까 생각했었다.

하지만 당장 괜찮은 아이디어가 생각나지 않아서 넘겨두었었다.

 

이번에 Dev-Event저장소에서 Actions와 Watch의 메일링 서비스를 이용해서 보다 편리한 서비스를 운영할 수 있으리라 생각이 들었다.

메인테이너 분께 이러한 아이디어에 대하여 건의를 드렸고, 2주간의 의견 공유를 통해 간단히 개발해서 운영을 시도해보는 중이다 :)

 

🥳매주 메일로 받아보는 Dev Event🥳

Dev-Event

Dev-Event는 개발자 컨퍼런스 및 해커톤 등 행사들을 보기 좋게 저장해두는 저장소이다.

항상 이렇게 오픈소스 느낌으로 행사를 공유하는 저장소가 있으면 좋겠다 생각이 들었는데, 이렇게 저장소를 관리해주시는 분이 계셔서 너무나 편하게 사용하고 있다.

개념

Github에는 Watch라는 기능이 있다. 이 저장소를 지속적으로 관찰하기 위한 기능으로, 이 기능이 활성화되면 저장소의 활동들을 메일로 보내준다.

위의 사진처럼 All Activity를 선택하면 모든 활동을, Custom을 통하여 특정 활동만 메일로 받아볼 수 있다.

 

이 기능을 이용해서 Actions를 통해 지정된 시간마다 Issue가 생성되게 설정한다면, Watch를 누른 사용자는 지정 시간마다 Issue의 Body가 담긴 메일을 받아볼 수 있다.

따라하기

이 기능은 Python과 PyGithub를 이용해서 만들어졌다.

1. Access Token

먼저 PyGithub로 동작을 수행하기 위해서 Access Token이 필요하다. 

Settings - Developer Settings - Personal Access Token에서 필요한 권한이 포함된 Access Token을 발급받자.

2. 기본 설정

Issue의 Title과 Body를 임의 설정해주고, token을 입력해주자.

import os

from github import Github

if __name__ == "__main__":
    access_token = os.environ['MY_GITHUB_TOKEN']
    title = "제목을 못 짓는 병에 걸렸어요"
    body = "글 시작을 못하는 병에 걸렸어요"

access_token의 값을 env로 지정을 해주었다. 로컬에서 테스트 할때는, 임시로 토큰 값으로 대체하거나 .env file을 사용해서 넣어준다.

 

3. PyGithub를 이용한 Github 인스턴스 생성 및 저장소 접근

위에서 지정해준 access_token을 이용해서 Github Instance를 생성해준다.

...

if __name__ == "__main__":

	...
    
    g = Github(access_token)
    
    # ID Password로도 가능
    g = Github(id, password)

이렇게 g를 생성했다면, g가 하나의 유저 인스턴스가 되었다고 생각하면 되겠다.

 

이러한 g를 이용해서 다양한 기능을 할 수 있다.

 

그 중, 저장소 접근은 다음과 같은 방식으로 할 수 있다.

...

if __name__ == "__main__":

	...
    
    g = Github(access_token)
    
    # ID Password로도 가능
    g = Github(id, password)
    
    # 개인 저장소 접근
    repo = g.get_user().get_repo(repository_name)
    
    # organization의 저장소 접근
    repo = g.get_organization(organization_name).get_repo(repository_name)

위와 같이 repo가 생성되었다면 지정된 저장소에 access했으며 token의 권한을 가진 객체가 생성되었다고 볼 수 있다.

 

4. Issue 작성

이제 위에서 작업한 repo를 이용해서 접근한 저장소에 issue를 남길 수 있다.

import os

from github import Github

if __name__ == "__main__":
    access_token = os.environ['MY_GITHUB_TOKEN']
    title = "제목을 못 짓는 병에 걸렸어요"
    body = "글 시작을 못하는 병에 걸렸어요"
    
    g = Github(access_token)
    
    repo = g.get_user().get_repo(repository_name)
    
    repo.create_issue(title=title, body=content)

위와 같이 완성된 코드를 실행해준다면 아래와 같이 이슈가 작성된다.

이렇게 남겨진 이슈는 Watch를 활성화한 사용자에게 메일로 전송된다.

5. 그래서 이걸 시간되면 직접 실행해주나요?

그래도 괜찮겠지만, Github Actions라는 좋은 기능을 이용해서 자동화를 시켰다.

 

schedule을 이용해서 일정시간마다 실행이 되도록 만들었다.

이 글에서 간단히 정리해두었으니 관심이 있다면 잠깐 참고해도 좋을 듯 하다.

name: on_time

on:
#   push:
#     branches:
#       - main
  schedule:
    - cron: '0 11 * * 0'
  # 꿀팁 : 한국의 자정은 "0 15 * * *"이다
  # 그럼 '0 11 * * *'은 주말 저녁에 보기 좋은 8시다.  
  # * * * * 0 은 일요일에 실행됨을 의미한다.
  # limm-jk.tistory.com/35

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.7
    
    - name: Install requirements.txt
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    
    - name: Run Crawler & Make Issue
      run: |
        python main.py
      env:
        MY_GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}

on: 이하가 실행조건이고, jobs가 수행할 기능이다.

 

여기서 access_token을 env로 받아준다.

해당 Repository - Settings - Secrets - New Repository secret

이 과정을 통해서 MY_GITHUB_TOKEN 혹은 원하는 이름으로 access token을 저장하고, env 값으로 불러올 수 있다.

 

이 기능까지 완료하면 자동으로 지정 시간마다 이슈를 생성해주는 기능이 만들어졌다. 여기서 원하는 body를 다양한 기능을 이용하여 넣어주면 되겠다.

 

소스코드

후기

누군가가 사용하는 서비스를 만든다는 것은 긴장되는 일인 것 같다. 처음 공개적으로 선보인 지난 주말은 '갑자기 안되면 어떻게 하지...?' 라는 막연한 걱정을 하기도 했었다.

 

그러나, 재미있고 즐거운 개발이었기에  그리고 결과물을 알리고 싶기에 이러한 걱정을 하게 되는 것이라 생각이 든다. 지금까지 누군가 사용한다는 생각을 크게 가지지 않았으며, 내 코드를 누가 보리라 생각하지도 않아서 안이하게 개발을 하게 되는 느낌이 있었는데, 보다 긴장을 하고 개발을 할 수 있는 시간이 되었던 것 같다.

 

🥳DEV_EVENT🥳

🥳매주 메일로 받아보는 Dev Event🥳

구독~ 좋아요~ 알람설정까지~ (?)

 

글마무리를 못하는 병에 걸렸어요...

'취준 생활 > 프로젝트' 카테고리의 다른 글

하루종일 mask on  (0) 2021.02.06
3-1. Career Talk은 대외비라 해서..  (0) 2020.11.19
Hacktoberfest / 끝!  (0) 2020.10.23
2. 첫번째 밋업  (0) 2020.10.22
1. Google Machine Learning Bootcamp 시작!  (0) 2020.10.16

댓글