본문으로 바로가기

Github Actions와 Psycopg2 삽질기

category Coding/DevOps 2019. 10. 30. 22:33
반응형

오늘 Github Actions를 처음 접해봤다. 굳이 타 CI를 사용할필요 없이 깃허브 하나로 통합하여 관리하기 위해 기존 소스들을 이전하는 작업을 진행중이었는데, 이 작업과 병행하여 MySQL을 사용하던 소스를 PostgreSQL로 이전하는 작업도 겸하였다. 여기서 문제가 발생했는데, 바로 psycopg2 라이브러리 설치가 정상적으로 동작하지 않는 것이었다.


현재 나는 OSX를 사용하고 있었기에 인터넷에서 찾아보니 다음과 같은 방법으로 해결이 가능하다는 것을 발견했다.


env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install psycopg2


아마 Mojave로 버전이 올라오면서 경로등의 변경으로 인해 발생한 문제로 보인다. 로컬에서는 이렇게 해결을 했는데, CI쪽에서는 어떻게 해결을 해야 할까. 먼저 나는 로컬에서 디펜던시 관리를 위해 pipenv를 사용하고 있었고, CI등에서는 pipenv install --system 명령어를 통해 가상환경에 진입하지 않고 전역적으로 라이브러리를 설치하는 방법을 취하고 있었다. 그렇다면 Pipfile에서 psycopg2를 지우면 되지 않을까?


1. Pipfile에서 psycopg2 제거

Github actions yml파일에 아래와 같은 라인을 추가함으로써 psycopg2를 제거했다.


sed -i 's/psycopg2 = \"\*\"//g' Pipfile


당연하게도 동작하지 않았다. Pipfile에서는 정상적으로 해당 구문이 삭제되지만, 실제로 설치할때는 Pipfile.lock을 참조하여 설치하기 때문이다. lock파일의 내용을 정규식으로 긁어서 삭제하는건 리소스를 낭비하는 일이라고 판단하여 다른 방법을 찾기로 했다.


2. requirements.txt 만들고 해당 파일로 설치

pip freeze > requirements.txt

위 명령어를 통해 requirements.txt를 만들고, 만들어진 파일에서 psycopg2를 제거한다음, pipenv install -r requirements.txt 명령어를 통해 라이브러리 설치를 시도했다. 일단 동작하지 않았다. 자세한 오류 메시지는 다른 아이디어가 떠올라서 바로 시도했기에, 기억이 나지 않는다.


3. Pipfile에서 지우고 psycopg2-binary로 대체 설치

pipenv uninstall psycopg2 를 통해 기존 lock파일에 설치된 라이브러리를 삭제해주고 pipenv install --system 으로 기존 라이브러리들을 모두 설치해준 후 pip3 install psycopg2-binary 를 통해 Standalone 형태로 제공되는 라이브러리를 설치해줬다. 결과적으로 말하자면, 아무런 문제없이 동작했다. 최종으로 작성된 나의 Github actions yml파일은 아래와 같다.


name: HFive

on:
push:
branches:
- master
- develop

jobs:
build:
name: CI
runs-on: ubuntu-latest

services:
postgres:
image: postgres:11.3
env:
POSTGRES_USER: hfive
POSTGRES_PASSWORD: hfive
POSTGRES_DB: test
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 3s --health-timeout 5s --health-retries 5

steps:
- uses: actions/checkout@v1

- name: Setup Python 3.7.4
uses: actions/setup-python@v1
with:
python-version: 3.7.4

- name: Install pipenv and Uninstall psycopg2
run: |
pip3 install pipenv
pipenv uninstall psycopg2

- name: Install Dependencies
run: |
pipenv install --system
pip3 install psycopg2-binary

- name: Testing
env:
env: testing
unexpired_token: ${{ secrets.unexpired_token }}
unexpired_refresh_token: ${{ secrets.unexpired_refresh_token }}
run: pytest


반응형