https://elephant-dev.tistory.com/19
1편에 이어서 본격적으로 알림봇 프로그램을 만들어보도록 하겠습니다.
- SVN 커맨드 프로그램 설치
우선 SVN의 경우 command를 사용할 수 있도록 설치를 해주어야하는데요,
https://tortoisesvn.net/downloads.html
위의 링크로 들어가 자신이 사용하고 있는 버전을 다운받고, 실행시킵니다.
위와 같은 순서로 command line client를 설치합니다.
설치가 완료되면 cmd 창을 켜서 svn 커맨드를 실행시켜봅니다.
위 사진과 같이 svn 커맨드를 입력했을 때, Type 'svn help' for usage 라고 출력되면 설치가 완료 된 상태입니다.
여기에서 우리가 사용할 커맨드는 svn log 커맨드 입니다.
svn의 history를 출력하는데, 최근 history를 출력할 수 있는 옵션을 주는겁니다.
여기서 주의할 점은 svn history를 조회하기 위해서는 svn이 check out되어있는 폴더에서 해야한다는 점입니다!
cmd창에서 cd 자신의 svn 레포지토리 명령어를 입력하여 폴더이동을 한 후 svn log 커맨드를 실행시키면 아래와 같이
커밋내역이 쭉 출력됩니다.
svn log 커맨드를 입력하면 너무나도 많은 결과 값이 출력되기 때문에 시간범위 안의 history가 출력할 수 있도록 커맨드에 옵션을 걸어주었습니다.
svn log -r {%Y-%m-%dT%H:%M:%S}:{%Y-%m-%dT%H:%M:%S}
ex) svn log -r {2022-11-16T14:18:52}:{2022-11-16T14:18:56}
아무래도 조회 할 시간의 범위를 설정해야하기 때문에 저는 이렇게 설계를 짰습니다
- 조회 텀 : 3초
- 조회 시간 범위 : {현재시간 -4초}:{현재시간}
-> 오탐이 발생할 가능성을 염두에 두고 조회텀은 3초지만, 시간범위는 4초로 두었습니다
여기서 한가지 문제가 더 발생했었는데, svn log -r {현재시간 -4초}:{현재시간} 해당 커맨드를 실행할 시에 새로운 커밋이 없다면 최근에 커밋됐던 history가 반복적으로 나온다는 점입니다
그래서 이 문제는 감사하게도 SVN 커맨드의 결과값이 일정한 포맷을 가지고 출력되기 때문에,
출력된 결과값을 파싱하여 최근에 발생한 버전값을 갖고 있다가 출력값의 버전이 이전에 이미 메세지를 발송한 버전이라면 메세지를 발송하지 않도록 하였습니다.
-코드 작성
LINE Notify를 통해 알림톡을 보내는 코드는 방법은 다음과 같습니다.
try:
response = requests.post(
TARGET_URL,
headers={
'Authorization': 'Bearer ' + TOKEN(발급받은 토큰)
},
data={
'message': msg(보낼 메세지)
}
)
except Exception as ex:
print(ex)
이 코드를 실행할 때 msg 부근에 받아온 svn commit history를 넣어주면 됩니다!!
총 완성된 코드는 다음과 같습니다.
import requests
import os
from time import time, sleep
import subprocess
from time import localtime
from time import strftime
from datetime import datetime, timedelta
from parse import compile
TARGET_URL = 'https://notify-api.line.me/api/notify'
TOKEN = 'message보낼 notify토큰'
def send_msg(log):
func_name = "send_msg"
split_list=[]
print(log)
split_list = log.split('|') #파이프 기준으로 값 파싱
#파이프 기준으로 파싱한 값을 순서에 맞게 리팩토링
version = split_list[0].split('\n')[1]
date = split_list[2].split('+')[0]
comment=split_list[3].split('\n')[2]
#라인 메세지로 보낼 포맷 작성
msg = '\n'+'Version: '+version+'\n'+'User: '+split_list[1]+'\n'+'Date: '+date+'\n\n'+'Comment:\n'+comment
try:
# 라인 메세지 API
response = requests.post(
TARGET_URL,
headers={
'Authorization': 'Bearer ' + TOKEN
},
data={
'message': msg
}
)
except Exception as ex:
print(ex)
def main():
cmd = "svn log -r " # 기본 커맨드
before_t=''
last_version =[]
last_version_str = ""
while True:
try:
os.chdir('Z:\SVN\Workspace') #내 로컬에 위치한 SVN 워크스페이스 경로
now = datetime.now() #현재시간 구하기
before_4_second=now - timedelta(seconds=4) #4초전 시간 구하기
if before_t == '':
timebuf ="{"+before_4_second.strftime('%Y-%m-%dT%H:%M:%S') +"}:"+"{"+now.strftime('%Y-%m-%dT%H:%M:%S') +"}"
else :
timebuf ="{"+before_t+"}:"+"{"+now.strftime('%Y-%m-%dT%H:%M:%S') +"}"
before_t=now.strftime('%Y-%m-%dT%H:%M:%S')
print(timebuf)
#timebuf = "{2022-11-09T00:00:00}:{2022-11-09T23:59:00}"
log = subprocess.getstatusoutput(cmd+timebuf) #만든 커맨드 실행시키기
log_str = '\n'.join(map(str,log)) #받아온 리스트 문자열로 합치기
#여러줄이 나올 때 자를 문자열 기준
log_parse = log_str.split('------------------------------------------------------------------------')
for i in range(1,len(log_parse)-1):
print("##"+(log_parse[i].split('|',1))[0])
if(last_version_str != ""): #이전 버전을 갖고 있을 시
if last_version_str != log_parse[i].split('|',1)[0]:
last_version_str = log_parse[i].split('|',1)[0] #최근 버전 기억
send_msg(log_parse[i])
else:#처음 실행 시 또는 출력된 버전이 없을 시
last_version_str = log_parse[i].split('|',1)[0] #최근 버전 기억
except Exception as ex:
print(ex)
sleep(3) #3초마다 수행
if __name__=="__main__":
main()
이렇게 코드에 각각 자신의 환경과 토큰에 맞게 수정을 하고 완성되었다면 실행할 수 있도록 완성 된 코드를 실행파일로
빌드해보겠습니다!!!!
- 빌드
완성된 .py 코드를 내 로컬에 파이썬이 설치 된 폴더로 이동한 후 해당 폴더를 엽니다.
(이 위치에 .py소스코드가 존재해야함)
ex ) C:\Users\smpar\AppData\Local\Programs\Python\Python311
이 위치에서 cmd 창을 틀어줍니다.
틀어진 cmd 창에 pyinstaller 소스코드.py를 실행하면 .exe파일로 빌드됩니다.
(만약 pyinstaller가 없는 경우 pyinstaller를 설치한 후 진행해야합니다
cmd 창에서 pip install pyinstaller)
만들어진 .exe 파일을 실행하면 아래와 같이 라인 메세지가 도착합니다!!!!!!!!!!!!!!
이로 써 SVN 커밋 시 LINE으로 알림받기 프로그램이 완성되었습니다!!!!
'Programming > Python' 카테고리의 다른 글
[Python] SVN 커밋 시 라인(LINE)으로 메세지 받는 알림봇 만들기 - 1편 (2) | 2022.11.16 |
---|---|
[Window] Python3.7.7 설치 방법 (0) | 2022.05.10 |