
본 문서는 sameersbn/docker-gitlab (Docker 버전) 기준으로 GitLab 버전 업그레이드 한 과정을 요약하였습니다. 이 배포판에는 gitlab-ce 공식 배포판에 포함되어 있는 gitlab-rake 나 gitlab-ctl 명령이 없어서 일반적인 Omnibus docker 설명을 참고는 할 수 있지만 대체 명령을 사용해야 합니다. 예를 들어, gitlab-rak 는 bundle exec rake 로 rails 콘솔 접속 명령은 rails console 을 사용해야 합니다.
GitLab 업그레이드 과정 요약
- 기존 사용 버전과 동일한 GitLab 버전을 준비. (기존 버전의
docker-compose.yml이용) - 새 GitLab 서비스에 기존 GitLab backup data 를 Import (restore)
- 업그레이드 버전 경로를 참고해서
소스 저장소의 각 버전(Tag)별sameersbn/docker-gitlabredis, 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
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. 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
– 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_migrations를 ‘status‘ 으로 수정.3
update batched_background_migrations set status=3 where status != 3;
(참고) DB 내용 수정 후, GitLab 업그레이드 버전 사용하는데 문제가 없음을 확인했음. 단, ‘Background Migrations‘ 목록에선 아직 완료하지 못한 작업들이 계속 남아 있다 보니 찜찜함. 따라서, 자동 DB Migration 완료 확인 후, 남아 있는 migration 작업이 없음을 확인하는 방식으로 업그레이드 하는 것을 추천함.









