Mỗi 5 năm một lần, cùng một bài hát và điệu nhảy. Phiên bản LTS của Debian sắp hết hạn, và đã đến lúc cập nhật máy chủ. Đây cũng là thời điểm thích hợp để nâng cấp lên máy mới để tận dụng hiệu suất cải thiện.
Nếu chúng ta có ổ cứng SATA, thì tốt nhất là nên bắt đầu với ổ đĩa mới bất kể, vì tuổi thọ của chúng có hạn.
Vì vậy, chúng ta sẽ tiến hành một loạt sao lưu trên máy chủ cũ, chuyển chúng sang máy mới, và cài đặt lại mọi thứ như cũ.
Trong trường hợp của chúng ta, chúng ta đang sử dụng Debian 8, hỗ trợ GitLab 13.3.9.
Chúng ta chuyển máy sang Debian 10, hỗ trợ GitLab 14.x.x
Cài đặt GitLab-ce dễ dàng, miễn là chúng ta không cần di chuyển bất kỳ kho lưu trữ nào. Sự phức tạp đến từ việc đảm bảo chúng ta không mất bất cứ thứ gì từ phiên bản cũ. Tại partITech, chúng ta có hơn 100 kho lưu trữ với tổng cộng khoảng 20 GB lưu trữ.
Các bản lưu trữ không tương thích giữa các phiên bản. Do đó, nếu chúng ta có một bản lưu trữ được tạo ra với phiên bản 13.3.9, chúng ta sẽ cần cài đặt phiên bản đó và nhập nó. Bước cuối cùng sẽ liên quan đến việc chuyển đổi từ 13.3.9 sang phiên bản 14.x mới nhất
Nhưng để tiến hành nâng cấp phiên bản chính, điều quan trọng là phải cài đặt phiên bản mới nhất của loạt 13.x, đó là 13.12.0
Cài đặt các gói cơ bản
apt-get install vim curl backup-manager mlocate libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev libpcre2-dev build-essential git-core graphicsmagick libimage-exiftool-perl htop
Chúng ta cài đặt vim và vô hiệu hóa chuột.
vi ~/.vimrc
#on ajoute set mouse-=a
Chúng ta bỏ chú thích các bí danh.
vi ~/.bashrc
. ~/.bashrc
Trên máy chủ cũ
Dịch vụ được dừng lại.
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
Tạo một bản sao lưu.
sudo gitlab-rake gitlab:backup:create
Chúng ta chuẩn bị một thư mục để đặt tất cả các tệp của chúng ta cần được chuyển.
mkdir ~/gitlab-old
Chúng ta sao chép các tệp cấu hình của mình từ thư mục của chúng ta. /etc/gitlab (gitlab.rb và gitlab-secrets.json) cũng như thư mục /etc/gitlab/ssl
sudo cp /etc/gitlab/gitlab.rb ~/gitlab-old
sudo cp /etc/gitlab/gitlab-secrets.json ~/gitlab-old
sudo cp -R /etc/gitlab/ssl ~/gitlab-old
sudo cp /etc/backup-manager.conf ~/gitlab-old/
sudo cp /etc/backup-manager.sh ~/gitlab-old/
Trên máy chủ mới
Chúng ta cài đặt nguồn apt của GitLab.
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
Chúng ta cài đặt GitLab chính xác cùng phiên bản như cái cũ để tránh vấn đề cài đặt. Sau đó chúng ta sẽ cập nhật lên phiên bản mới nhất.
sudo apt-get install gitlab-ce=13.3.9-ce.0
Chúng ta cài đặt các tệp cấu hình của mình từ phiên bản cũ của chúng ta.
sudo mv /etc/gitlab/gitlab.rb /etc/gitlab/_gitlab.rb
sudo cp gitlab-old/gitlab* /etc/gitLab
Chúng ta sao chép thư mục SSL từ phiên bản cũ của chúng ta.
cp -R gitlab-old/ssl /etc/gitlab/
Chúng ta bắt đầu cấu hình lại GitLab.
sudo gitlab-ctl reconfigure
Chúng ta dừng các dịch vụ.
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
Chúng ta đặt bản sao lưu đầu tiên của mình vào thư mục sao lưu mặc định của GitLab (chúng ta đã sửa đổi thư mục mặc định của mình).
sudo cp gitlab-old/1624870826_2021_06_28_13.3.9_gitlab_backup.tar ~/gitlab-backups
Và chúng ta nhập nó.
sudo gitlab-rake gitlab:backup:restore BACKUP=1624870826_2021_06_28_13.3.9
Chúng ta thiết lập quyền.
sudo find /data/gitlab-storage -type f -exec chmod 0644 {} \;
sudo find /data/gitlab-storage/uploads -type d -not -path /data/gitlab-storage/uploads -exec chmod 0700 {} \;
Chúng ta chuyển đổi kho lưu trữ của mình thành mã băm nếu cần thiết.
gitlab-rake gitlab:storage:migrate_to_hashed
Chúng ta mở cổng 80 và 443 trong tường lửa nếu cần.
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
Giao diện giờ đây sẽ phản hồi bình thường trên máy chủ mới của chúng ta.
Nâng cấp phiên bản
Bây giờ chúng ta cần cập nhật GitLab.
Bước đầu tiên, chúng ta chuyển sang phiên bản 13.5.0
apt-get install gitlab-ce=13.5.0-ce.0
Và tại đó chúng ta gặp lỗi sau: PG::DuplicateTable: ERROR: relation "postgres_indexes" đã tồn tại

Để cho script chạy, chúng ta sẽ cần chỉnh sửa quy trình nâng cấp để thêm việc xóa chỉ mục trong file: /opt/gitlab/embedded/service/gitlab-rails/db/migrate/20200922093004_add_postgres_index_view.rb
# frozen_string_literal: true
class AddPostgresIndexView < ActiveRecord::Migration[6.0]
DOWNTIME = false
def up
execute(<<~SQL)
DROP VIEW IF EXISTS postgres_indexes;
CREATE VIEW postgres_indexes AS
SELECT
pg_namespace.nspname || '.' || pg_class.relname as identifier,
pg_index.indexrelid,
pg_namespace.nspname as schema,
pg_class.relname as name,
pg_index.indisunique as unique,
pg_index.indisvalid as valid_index,
pg_class.relispartition as partitioned,
pg_index.indisexclusion as exclusion,
pg_indexes.indexdef as definition,
pg_relation_size(pg_class.oid) as ondisk_size_bytes
FROM pg_index
INNER JOIN pg_class ON pg_class.oid = pg_index.indexrelid
INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
INNER JOIN pg_indexes ON pg_class.relname = pg_indexes.indexname
WHERE pg_namespace.nspname <> 'pg_catalog'
SQL
end
def down
execute(<<~SQL)
DROP VIEW postgres_indexes
SQL
end
end
Một khi script di cư được chỉnh sửa, chúng ta khởi động lại cấu hình.
gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure

Bây giờ chúng ta có thể tiếp tục nâng cấp. Nâng cấp lên phiên bản 13.6.0 và tăng cài đặt lên đến phiên bản 13.12.0
apt-get install gitlab-ce=13.6.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.7.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.8.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.9.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.10.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.11.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
apt-get install gitlab-ce=13.12.5-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
Đối với phiên bản 13.7.0, script di cư sẽ cần được sửa chữa.
/opt/gitlab/embedded/service/gitlab-rails/db/migrate/20201127170848_add_index_bloat_estimate_view.rb
# frozen_string_literal: true
class AddIndexBloatEstimateView < ActiveRecord::Migration[6.0]
DOWNTIME = false
def up
execute(<<~SQL)
DROP VIEW IF EXISTS postgres_index_bloat_estimates;
CREATE VIEW postgres_index_bloat_estimates AS
-- Originally from: https://github.com/ioguix/pgsql-bloat-estimation/blob/master/btree/btree_bloat.sql
-- WARNING: executed with a non-superuser role, the query inspect only index on tables you are granted to read.
-- WARNING: rows with is_na = 't' are known to have bad statistics ("name" type is not supported).
-- This query is compatible with PostgreSQL 8.2 and after
SELECT nspname || '.' || idxname as identifier,
CASE WHEN relpages > est_pages_ff
THEN bs*(relpages-est_pages_ff)
ELSE 0
END::bigint AS bloat_size_bytes
FROM (
SELECT
coalesce(1 +
ceil(reltuples/floor((bs-pageopqdata-pagehdr)*fillfactor/(100*(4+nulldatahdrwidth)::float))), 0
) AS est_pages_ff,
bs, nspname, tblname, idxname, relpages, is_na
FROM (
SELECT maxalign, bs, nspname, tblname, idxname, reltuples, relpages, idxoid, fillfactor,
( index_tuple_hdr_bm +
maxalign - CASE -- Add padding to the index tuple header to align on MAXALIGN
WHEN index_tuple_hdr_bm%maxalign = 0 THEN maxalign
ELSE index_tuple_hdr_bm%maxalign
END
+ nulldatawidth + maxalign - CASE -- Add padding to the data to align on MAXALIGN
WHEN nulldatawidth = 0 THEN 0
WHEN nulldatawidth::integer%maxalign = 0 THEN maxalign
ELSE nulldatawidth::integer%maxalign
END
)::numeric AS nulldatahdrwidth, pagehdr, pageopqdata, is_na
FROM (
Bây giờ chúng ta cài đặt phiên bản 14.0.0.
apt-get install gitlab-ce=13.12.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
Kể từ phiên bản 14, việc sử dụng hệ thống tệp băm là bắt buộc. Việc cài đặt sẽ hiển thị cảnh báo và dừng quá trình.
root@git-partitech-sd-47766:/opt/gitlab# apt-get install gitlab-ce=14.0.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
gitlab-ce
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/923 MB of archives.
After this operation, 14.5 MB of additional disk space will be used.
Reading changelogs... Done
(Reading database ... 119998 files and directories currently installed.)
Preparing to unpack .../gitlab-ce_14.0.0-ce.0_amd64.deb ...
gitlab preinstall: Checking for unmigrated data on legacy storage
gitlab preinstall:
gitlab preinstall: Legacy storage is no longer supported. Please migrate your data to hashed storage.
gitlab preinstall: Check https://docs.gitlab.com/ee/administration/raketasks/storage.html#migrate-to-hashed-storage for details.
gitlab preinstall:
gitlab preinstall: If you want to skip this check, run the following command and try again:
gitlab preinstall:
gitlab preinstall: sudo touch /etc/gitlab/skip-unmigrated-data-check
gitlab preinstall:
dpkg: error processing archive /var/cache/apt/archives/gitlab-ce_14.0.0-ce.0_amd64.deb (--unpack):
new gitlab-ce package pre-installation script subprocess returned error exit status 1
Errors were encountered while processing:
/var/cache/apt/archives/gitlab-ce_14.0.0-ce.0_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Vì vậy, bạn sẽ cần chuyển đổi kho lưu trữ của mình nếu chưa làm.
gitlab-rake gitlab:storage:migrate_to_hashed
Và sau đó khởi động cài đặt với chỉ thị không hiển thị cảnh báo nữa.
sudo touch /etc/gitlab/skip-unmigrated-data-check
apt-get install gitlab-ce=14.0.0-ce.0 && gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl reconfigure

Bước quan trọng nhất đã qua. Giờ đây chúng ta có thể cập nhật lên phiên bản mới nhất. Về phía chúng ta, đó là phiên bản 14.0.1
apt-get upgrade
Hoạt động cuối cùng. Nếu như chúng ta, bạn sử dụng thông báo Slack, bạn sẽ cần di chuyển cấu hình. Các mẫu dịch vụ đã được gỡ bỏ kể từ phiên bản 14.x.x
Bạn có thể tích hợp lại thông báo cho từng dự án, hoặc như chúng ta, thiết lập nó trên toàn cầu.
Để làm điều này, bạn sẽ cần vào Khu vực Quản trị >> Móc Hệ thống
