참고
GitLab 업그레이드의 경우, 최신 버전으로 한 번에 업그레이드 할 수 없습니다. GitLab 은 동일 버전에서만 데이터 이전이 가능하고, 단계별 특정 버전으로의 업그레이드를 진행해야 합니다. 현재 버전에서 최신 버전까지 단계별 버전 확인을 위해서 GitLab Upgrade Path 를 이용할 수 있습니다.

본 문서는 sameersbn/docker-gitlab (Docker 버전) 기준으로 GitLab 버전 업그레이드 한 과정을 요약하였습니다. 이 배포판에는 gitlab-ce 공식 배포판에 포함되어 있는 gitlab-rake 나 gitlab-ctl 명령이 없어서 일반적인 Omnibus docker 설명을 참고는 할 수 있지만 대체 명령을 사용해야 합니다. 예를 들어, gitlab-rak 는 bundle exec rake 로 rails 콘솔 접속 명령은 rails console 을 사용해야 합니다.

GitLab 업그레이드 과정 요약

  1. 기존 사용 버전과 동일한 GitLab 버전을 준비. (기존 버전의 docker-compose.yml 이용)
  2. 새 GitLab 서비스에 기존 GitLab backup data 를 Import (restore)
  3. 업그레이드 버전 경로를 참고해서 sameersbn/docker-gitlab 소스 저장소의 각 버전(Tag)별 docker-compose.yml redis, postgresql, gitlab image 버전 수정.
    • GitLab Upgrade Path 에서 알려주는 버전과 sameersbn/docker-gitlab Tag 버전이 일치하지 않을 수 있음. 가장 비슷한 Tag 버전을 선택함.
    • gitlab 또는 postgresql image 버전에 따라 docker-compose.yml 환경 변수에 특정 옵션을 추가해야 하는 경우가 있음
  4. GitLab docker instance 실행 후, DB Migration 작업 완료할 때까지 대기.
  5. 서비스 정상 여부 확인: DB Migration 작업 완료 확인(Admin Area), Project 소스 저장소, Commit (또는 Activity) 데이터 일치 여부 확인
  6. (옵션) DB Migration 완료한 data (DB) 폴더 복사 (동일 버전에서 DB migration을 다시 시작할 경우 대비)
  7. 위 3~6 반복

GitLab 업그레이드 주요 작업

1. GitLab 업그레이드 버전 경로 확인

  • Upgrade Path 에서 1차 확인 후, sameersbn/docker-gitlab의 Tag 번호에 따른 Upgrade Path 확인.
참고
sameersbn/docker-gitlab Tag 기준, 11.11.3 부터 16.6.2까지의 업그레이드 경로 제시 예:
11.11.3 → 12.0.0 →12.0.4 →12.1.0 →12.10.4
→13.0.6 →13.11.0 →13.12.4 →13.2.6
→14.0.6 →14.10.5 →14.3.3 →14.4.4 →14.9.3
→15.0.3 →15.11.13 →15.4.6
→16.1.5 →16.3.6 →16.6.1
→16.6.2

2. sameersbn/docker-postgresql 11,12,14 버전의 docker image build.

AD
참고
postgresql DB 업그레이드 하는 과정에서 docker-compose.yml 에서 지정한 버전의 하위 Major 버전을 필요로 한다. 예를 들어, 11버전은 10버전을, 12버전은 11버전의 sameersbn/postgresql 이미지를 필요로 한다. 그런데, postgresql 10~12 버전 apt 배포판은 apt 정식 배포판 저장소(repository)에서 보관 저장소(archive repository) 로 이동되어 있기 때문에 패키지 설치에 실패하고, DB Migration에 실패한다. 이 문제 해결을 위해서는 sameersbn/postgresql image가 apt 패키지 정식 배포판 저장소와 보관 저장소를 모두 포함하도록 한 docker image를 생성해야만 한다. sameersbn/postgresql 소스를 다운 받아서 Dockerfile의 apt 저장소 목록 부분을 수정한 후, postgresql image 를 새롭게 생성하도록 한다.
  • Dockerfile for postgresql 11 예시 (10,12 버전도 동일)
FROM ubuntu:bionic-20200403 AS add-apt-repositories

RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y wget gnupg \
 && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
 && echo 'deb [trusted=yes] https://apt-archive.postgresql.org/pub/repos/apt/ bionic-pgdg-archive main' >> /etc/apt/sources.list \
 && echo 'deb-src [trusted=yes] https://apt-archive.postgresql.org/pub/repos/apt/ bionic-pgdg-archive main' >> /etc/apt/sources.list 
# && apt-get -y upgrade && apt-get install ca-certificates

FROM ubuntu:bionic-20200403
ARG DEBIAN_FRONTEND=noninteractive

LABEL maintainer="sameer@damagehead.com"

ENV PG_APP_HOME="/etc/docker-postgresql" \
    PG_VERSION=11 \
    PG_USER=postgres \
    PG_HOME=/var/lib/postgresql \
    PG_RUNDIR=/run/postgresql \
    PG_LOGDIR=/var/log/postgresql \
    PG_CERTDIR=/etc/postgresql/certs

ENV PG_BINDIR=/usr/lib/postgresql/${PG_VERSION}/bin \
    PG_DATADIR=${PG_HOME}/${PG_VERSION}/main

COPY --from=add-apt-repositories /etc/apt/trusted.gpg /etc/apt/trusted.gpg

COPY --from=add-apt-repositories /etc/apt/sources.list /etc/apt/sources.list

RUN touch /etc/apt/apt.conf.d/99verify-peer.conf \
 && echo >>/etc/apt/apt.conf.d/99verify-peer.conf "Acquire { https::Verify-Peer false }" \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y acl sudo locales  \
      postgresql-${PG_VERSION} postgresql-client-${PG_VERSION} postgresql-contrib-${PG_VERSION} \
 && update-locale LANG=C.UTF-8 LC_MESSAGES=POSIX \
 && locale-gen en_US.UTF-8 \
 && DEBIAN_FRONTEND=noninteractive dpkg-reconfigure locales \
 && ln -sf ${PG_DATADIR}/postgresql.conf /etc/postgresql/${PG_VERSION}/main/postgresql.conf \
 && ln -sf ${PG_DATADIR}/pg_hba.conf /etc/postgresql/${PG_VERSION}/main/pg_hba.conf \
 && ln -sf ${PG_DATADIR}/pg_ident.conf /etc/postgresql/${PG_VERSION}/main/pg_ident.conf \
 && rm -rf ${PG_HOME} \
 && rm -rf /var/lib/apt/lists/*

COPY runtime/ ${PG_APP_HOME}/

COPY entrypoint.sh /sbin/entrypoint.sh

RUN chmod 755 /sbin/entrypoint.sh

EXPOSE 5432/tcp

WORKDIR ${PG_HOME}

ENTRYPOINT ["/sbin/entrypoint.sh"]

Dockerfile 수정 후, 새로운 sameersbn/postgresqlimage를 생성하도록 한다.

$ docker build -t sameersbn/postgresql:11-20200524-boolsee .
$ docker build -t sameersbn/postgresql:12-20200524-boolsee.
$ docker build -t sameersbn/postgresql:14-20230628-boolsee .

3. 새로 준비한 GitLab 서비스에 기존 GitLab 서비스의 backup data를 Import 함.

$ docker-compose up -d
$ docker-compose -f docker-compose.yml exec -T gitlab sudo -HEu git bundle exec rake gitlab:backup:restore BACKUP=1703262218_2023_12_22_11.11.3
참고
# postgresql:12-20200524 이상, docker-compose.yml 환경 변수에 ‘btree_gist’ 추가 옵션 필요
– DB_EXTENSION=btree_gist
# GitLab 16.x 이상에서 백업 옵션 추가 필요
– GITLAB_BACKUP_SKIP=ci_secure_files

GitLab DB migration 실패하는 경우

  • PostgreSQL instance 만 따로 실행한 후, DB 접속하여 psql 명령을 실행하여 작업 수행.
$ docker-compose -f db.yml up -d
$ docker exec -it 1662_postgresql_1 psql -U gitlab -d gitlabhq_production
  • 남아있거나 진행하지 못한 DB migration 작업 목록 확인.
    (참고) GitLab Web UI 로그인 후, Admin Area > Monitoring > Background Migrations에서도 확인 가능.
SELECT
  id, status, job_class_name,
  table_name,
  column_name,
  job_arguments
FROM batched_background_migrations
WHERE status <> 3;

(예시)
id | status |            job_class_name             |     table_name      | column_name |                                   job_arguments                                    
----+--------+---------------------------------------+---------------------+-------------+------------------------------------------------------------------------------------
  4 |      1 | CopyColumnUsingBackgroundMigrationJob | push_event_payloads | event_id    | [["event_id"], ["event_id_convert_to_bigint"]]
  5 |      1 | CopyColumnUsingBackgroundMigrationJob | ci_job_artifacts    | id          | [["id", "job_id"], ["id_convert_to_bigint", "job_id_convert_to_bigint"]]
  8 |      1 | CopyColumnUsingBackgroundMigrationJob | ci_builds           | id          | [["id", "stage_id"], ["id_convert_to_bigint", "stage_id_convert_to_bigint"]]
 11 |      1 | CopyColumnUsingBackgroundMigrationJob | taggings            | id          | [["id", "taggable_id"], ["id_convert_to_bigint", "taggable_id_convert_to_bigint"]]
 14 |      1 | CopyColumnUsingBackgroundMigrationJob | ci_stages           | id          | [["id"], ["id_convert_to_bigint"]]
 15 |      1 | CopyColumnUsingBackgroundMigrationJob | ci_builds_metadata  | id          | [["id"], ["id_convert_to_bigint"]]
  • int => bigint 와 같이 Column 형(Type) 변환을 하는 경우, ‘신규 Column 추가 > 값을 복사 > 기존 Column 삭제’ 과정을 거치는데 신규 Column 추가까지는 문제가 없고, Column 값을 복사할 때 오류가 발생하는 것 같음. 따라서, 복사하지 못한 column들의 값을 복사해 주면 DB migration을 완료할 수도 있음.
    아래 예시는 psql 명령으로 기존 column 값을 신규 column으로 복사해 주는 것임.
update push_event_payloads
set event_id = id
where id != event_id;

(참고) Docker 실행과 동시에 실행되는 자동 DB Migration 성공하면 문제 없음. 단, 작업 완료까지 대기 시간은 DB 크기에 따라서 달라짐.

  • batched_background_migrationsstatus를 ‘3‘ 으로 수정.
update batched_background_migrations set status=3 where status != 3;

(참고) DB 내용 수정 후, GitLab 업그레이드 버전 사용하는데 문제가 없음을 확인했음. 단, ‘Background Migrations‘ 목록에선 아직 완료하지 못한 작업들이 계속 남아 있다 보니 찜찜함. 따라서, 자동 DB Migration 완료 확인 후, 남아 있는 migration 작업이 없음을 확인하는 방식으로 업그레이드 하는 것을 추천함.

AD