Home SE Note

Gitlab upgrade from 11.11.3 to 16.6.2

0

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 확인.

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

  • 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

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 작업이 없음을 확인하는 방식으로 업그레이드 하는 것을 추천함.

Exit mobile version