PostgreSQL 사용하기

PostgreSQL 사용하기

많은 애플리케이션이 데이터베이스로 PostgreSQL에 의존하기 때문에, 테스트를 실행하려면 PostgreSQL을 써야 할 때가 많아요. 이 페이지에서는 Docker executor와 Shell executor에서 PostgreSQL을 서비스로 사용하는 방법을 다뤄요.

출처: 문서

본문

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

Docker executor로 PostgreSQL 사용하기

GitLab UI에서 설정한 변수를 서비스 컨테이너로 전달하려면 변수를 정의해야 해요. 변수는 Group이나 Project로 정의하고, 아래 워크어라운드처럼 잡에서 호출해야 해요.

Postgres 15.4 이상 버전은 확장 스크립트에 따옴표("), 백슬래시(\), 달러 기호($)가 포함된 경우 스키마나 소유자 이름을 치환하지 않아요. CI 변수가 설정되어 있지 않으면 값 대신 환경 변수 이름을 문자열로 사용해요. 예를 들어 POSTGRES_USER: $USERPOSTGRES_USER 변수가 '$USER'로 설정되게 하고, 이로 인해 Postgres가 다음 오류를 보여줘요.

Fatal: invalid character in extension

이를 우회하려면 GitLab CI/CD 변수로 변수를 설정하거나 변수를 문자열 형태로 설정하면 돼요.

  1. GitLab에서 Postgres 변수를 설정해요. GitLab UI에서 설정한 변수는 서비스 컨테이너로 전달되지 않아요.
  2. .gitlab-ci.yml 파일에서 Postgres 이미지를 지정해요.
default:
   services:
     - postgres
  1. .gitlab-ci.yml 파일에서 정의한 변수를 추가해요. Hostpostgres를 사용하는 방법에 대한 자세한 내용은 서비스가 잡과 어떻게 연결되는지를 참고해요.
variables:
  POSTGRES_DB: $POSTGRES_DB
  POSTGRES_USER: $POSTGRES_USER
  POSTGRES_PASSWORD: $POSTGRES_PASSWORD
  POSTGRES_HOST_AUTH_METHOD: trust
  1. 애플리케이션이 데이터베이스를 사용하도록 설정해요. 예를 들어 이렇게요.
Host: postgres
User: $POSTGRES_USER
Password: $POSTGRES_PASSWORD
Database: $POSTGRES_DB

또는 .gitlab-ci.yml 파일에서 변수를 문자열로 설정할 수도 있어요.

variables:
  POSTGRES_DB: DB_name
  POSTGRES_USER: username
  POSTGRES_PASSWORD: password
  POSTGRES_HOST_AUTH_METHOD: trust

Docker Hub에서 사용할 수 있는 다른 Docker 이미지도 쓸 수 있어요. 예를 들어 PostgreSQL 16.10을 쓰려면 서비스가 postgres:16.10이 돼요.

postgres 이미지는 일부 환경 변수를 받을 수 있어요. 자세한 내용은 Docker Hub의 문서를 참고해요.

Shell executor로 PostgreSQL 사용하기

Shell executor를 쓰는 GitLab Runner가 있는 수동 설정 서버에서도 PostgreSQL을 사용할 수 있어요.

먼저 PostgreSQL 서버를 설치해요.

sudo apt-get install -y postgresql postgresql-client libpq-dev

다음 단계는 사용자를 만드는 것이니 PostgreSQL에 로그인해요.

sudo -u postgres psql -d template1

그다음 애플리케이션이 사용할 사용자(여기서는 runner)를 만들어요. 다음 명령의 $password를 강력한 비밀번호로 바꿔요.

다음 명령에 template1=#는 PostgreSQL 프롬프트의 일부이므로 입력하지 않도록 주의해요.

template1=# CREATE USER runner WITH PASSWORD '$password' CREATEDB;

만들어진 사용자는 데이터베이스를 만들 수 있는 권한(CREATEDB)을 가져요. 다음 단계는 그 사용자를 위해 데이터베이스를 명시적으로 만드는 방법이에요. 이 권한 덕분에 테스트 프레임워크가 필요에 따라 데이터베이스를 만들고 삭제할 수 있어요.

데이터베이스를 만들고 runner 사용자에게 모든 권한을 부여해요.

template1=# CREATE DATABASE nice_marmot OWNER runner;

모든 게 잘 됐다면 데이터베이스 세션을 종료할 수 있어요.

template1=# \q

이제 runner 사용자로 새로 만든 데이터베이스에 연결해서 모든 게 제자리에 있는지 확인해요.

psql -U runner -h localhost -d nice_marmot -W

이 명령은 psql이 md5 인증을 쓰도록 localhost로 연결하라고 명시적으로 지시해요. 이 단계를 생략하면 접근이 거부돼요.

마지막으로 애플리케이션이 데이터베이스를 사용하도록 설정해요. 예를 들어 이렇게요.

Host: localhost
User: runner
Password: $password
Database: nice_marmot

예시 프로젝트

편의를 위해 GitLab.com에서 공개적으로 사용 가능한 인스턴스 러너로 돌아가는 예시 PostgreSQL 프로젝트를 준비해 두었어요. 직접 해보고 싶다면 포크해서 커밋하고 변경을 푸시해요. 잠시 후 공개 러너가 변경을 받아 잡이 시작돼요.

더 알아보기

PostgreSQL 서비스를 붙이는 전체 개념은 서비스 문서를 참고해요. MySQL이나 Redis 서비스 설정과 비교해 보면 프로젝트의 데이터 계층에 맞는 구성을 고를 수 있어요.