GitLab 업그레이드 과정 요약
- 기존 사용 버전과 동일한 GitLab 버전을 준비. (기존 버전의
docker-compose.yml
이용) - 새 GitLab 서비스에 기존 GitLab backup data 를 Import (restore)
- 업그레이드 버전 경로를 참고해서
소스 저장소의 각 버전(Tag)별sameersbn/docker-gitlab
redis, postgresql, gitlab image 버전 수정.docker-compose.yml
의- GitLab Upgrade Path 에서 알려주는 버전과
Tag 버전이 일치하지 않을 수 있음. 가장 비슷한 Tag 버전을 선택함.sameersbn/docker-gitlab
- gitlab 또는 postgresql image 버전에 따라
docker-compose.yml
- GitLab Upgrade Path 에서 알려주는 버전과
- GitLab docker instance 실행 후, DB Migration 작업 완료할 때까지 대기.
- 서비스 정상 여부 확인: DB Migration 작업 완료 확인(
), Project 소스 저장소, Commit (또는 Activity) 데이터 일치 여부 확인Admin Area
- (옵션) DB Migration 완료한 data (DB) 폴더 복사 (동일 버전에서 DB migration을 다시 시작할 경우 대비)
- 위 3~6 반복
GitLab 업그레이드 주요 작업
1. GitLab 업그레이드 버전 경로 확인
- Upgrade Path 에서 1차 확인 후,
의 Tag 번호에 따른 Upgrade Path 확인.sameersbn/docker-gitlab
2.
11,12,14 버전의 docker image build.sameersbn/docker-postgresql
- 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 수정 후, 새로운
image를 생성하도록 한다.sameersbn/postgresql
$ 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_migrations
를 ‘status
‘ 으로 수정.3
update batched_background_migrations set status=3 where status != 3;
(참고) DB 내용 수정 후, GitLab 업그레이드 버전 사용하는데 문제가 없음을 확인했음. 단, ‘Background Migrations
‘ 목록에선 아직 완료하지 못한 작업들이 계속 남아 있다 보니 찜찜함. 따라서, 자동 DB Migration 완료 확인 후, 남아 있는 migration 작업이 없음을 확인하는 방식으로 업그레이드 하는 것을 추천함.