본문 바로가기

개발 프로젝트

[PyQt5] 자동 배포 프로그램

728x90

Preview

저희 회사에서는 망분리 정책으로 인해 Github action이나 GitLab 등의 오픈소스 배포 프로그램을 사용하고 있지 않습니다.
그렇기 때문에 수동으로 빌드된 파일을 배포 서버에 옮겨야 하는 번거로움이 있는데요

번거로움과 함께 인간이기에 하는 실수들이 발생하곤 합니다.
잘못된 파일을 업로드한다던지, 잘못된 경로에 업로드하는 경우들이 종종 있어 파일 배포 시에는 두세 번 정도 파일위치와 이름 등을 확인하곤 합니다.

물론 운영 서버에 배포시에는 이 정도의 검수가 필요하긴 하지만,
개발 서버에 배포 시에는 사실 잘못된 파일이 올라가거나 잘못된 경로에 배포한다고 해도 지우면 그만이고 다시 올리면 그만입니다.

현재 사용중인 프레임워크 특성과 저희 회사의 서비스 규모 상 현재 프로젝트 내에 있는 소스파일(assets 포함)은 수천개에 달합니다. 이런 많은 파일 중에서 내가 수정한 파일을 찾아 배포 서버에 옮기는 작업은 번거로울 뿐 아니라 시간도 적지 않게 소요됩니다.

그래서 간단하지만 많은 시간을 단축시켜 줄 수 있는 프로그램을 개발했습니다.

 

Methodology

프로세스 구성도

 

이 프로그램은 위 도식표에서 보이는 빨간색 화살표 의 과정을 처리할 수 있습니다.
개발 소스에서 수정된 파일이 있다면 프로젝트를 빌드한 후에 빌드된 해당 파일을 개발 혹은 테스트 서버에 배포를 하고, 테스트를 마쳤다면 운영 형상관리 소스 쪽에 빌드 전의 파일을 붙여 넣습니다. 형상관리 이후 운영 파일을 빌드에 운영 서버에 배포를 하면 마무리됩니다. 이 일련의 과정들을 다 수작업으로 했지만 이제 이 프로그램을 사용해서 간단히 처리할 수 있습니다.

사용 방법은 간단합니다. 개발 프로젝트가 있는 경로를 좌측 상단에 입력하고 운영 프로젝트 경로와 빌드된 파일만 올라가 있는(운영 빌드) 경로를 입력합니다. 좌측 중앙에 있는 곳엔 수정된 파일의 경로를 복사해 붙여넣은 다음 상황에 맞게 라디오 버튼을 클릭 후 전송 버튼을 누르면 됩니다.

좌측 하단에 있는 윈도우 디렉터리 컴포넌트는 QTreeView를 사용했습니다.
QTreeView

 

QTreeView Class | Qt Widgets 6.6.3

 

doc.qt.io

self.sourceDirectoryModel = QFileSystemModel() #트리 모델을 선언
self.sourceDirectoryModel.setRootPath('')
self.sourceDirectoryTree = QTreeView()
self.sourceDirectoryTree.setModel(self.sourceDirectoryModel) #트리 컴포넌트에 모델을 할당
self.sourceDirectoryTree.setSortingEnabled(True) #정렬가능 옵션

#파일 경로 입력 후 해당 디렉토리 구조를 보여줘야 하므로
def sourcePathEntered(self):
 self.sourceDirectoryModel.setRootPath(self.sourcePath.text())
 self.sourceDirectoryTree.setRootIndex(self.sourceDirectoryModel.index(self.sourcePath.text()))

원격 VM에 존재하는 배포 서버에 접근하기 위해선 paramiko 라는 패키지를 사용해 프로그램 실행 시 바로 접속할 수 있지만 윈도 자격증명으로 파일서버가 등록되어 있어 외부 패키지를 사용하지 않았습니다.
paramiko

 

Installing — Paramiko documentation

On Linux, or on other platforms with older versions of pip: you’ll need a C build toolchain, plus development headers for Python, OpenSSL and libffi. Again, see Cryptography’s install docs; these requirements may occasionally change. Warning If you go

www.paramiko.org

배포 서버에 파일을 업로드 하기 위해선 빌드된 파일을 찾아야 합니다. 자사에서 사용 중인 프레임워크 특성상 원본 파일은 확장자가 .cls 혹은 .lay이지만 빌드 후엔 .js, .html로 변환됩니다. 입력받은 파일 경로에서 확장자를 변환해줘야 합니다.

#원본 파일을 기준으로 빌드된 파일의 경로를 반환합니다.
def convertFilesToBuildedFiles(self, pathArr):
    newArr = []
    for path in pathArr:
        path = path.split(self.devRoot, 1)
        if len(path)>1:
            path = path[1]
        else :
            path = '/'+path[0]
        path = path.replace('.cls', '.js')
        path = path.replace('.lay', '.html')
        newArr.append(path)
    return newArr

빌드 이후 생성된 경로에서 빌드된 파일을 배포서버로 업로드 해야합니다.

for path in pathArr:
    source_path = sourceDirectoryRootPath +'/bin'+path
    destination_path = self.devDirectory + path
    self.copyToDestination(source_path, destination_path)

def copyToDestination(self, source, destination):
    try:
        shutil.copy(source, destination)
    except Exception as e:
        print(f"Error copying file : {e}")

파일 복사 붙여 넣기에는 shutil이라는 내장 라이브러리를 사용했습니다.

The End


마치며.. 비록 매우 간단한 "복사 - 붙여 넣기" 과정을 자동화한 프로그램이지만 실제 개발하면서 사용해 본 결과 정말 절반에 가까운 소요시간을 줄여주었습니다. 왜냐하면, 수천 개가 되는 파일 중에서 내가 수정한 파일을 찾기란 꽤나 시간이 걸리는 작업이기 때문입니다. 평소에 하던 잔실수도 안 하게 되고요.

이렇게 프로그램을 만들어 팀원들이 유용하게 사용하면 뿌듯하고 보람찹니다.