Há algum tempo eu precisei atualizar uma instalação do Gitlab que ainda estava na versão 14.9.x para a versão 15.x., mas como o salto de versão é muito longo ele não é permitido pelos próprios scripts de pós-instalação do pacote. Para concluir a tarefa foi necessário primeiro atualizar para versão 14.10.x e só então instalar a versão 15. Mas como se faz isso? Acompanhe o restante do artigo.
O procedimento que vou mostrar foi realizado em um ambiente de produção (após testá-lo no ambiente de testes para certificar que estava tudo certo e realizar o backup do ambiente de produção, claro).
Embora eu vá usar os exemplos para o pacote do Gitlab-CE, ele pode ser usado seguramente para atualizar qualquer outra aplicação que esteja nas mesmas condições para atualizar.
Primeira tentativa de atualização
A primeira tentativa de atualização, saltando da 14.9 para a 15 resulta na seguinte situação:
apt-get upgrade gitlab-ce
Preparing to unpack …/gitlab-ce_15.0.0-ce.0_amd64.deb …
gitlab preinstall: It seems you are upgrading from major version 14 to major version 15.
gitlab preinstall: It is required to upgrade to the latest 14.10.x version first before proceeding.
gitlab preinstall: Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrade-paths
dpkg: error processing archive /var/cache/apt/archives/gitlab-ce_15.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_15.0.0-ce.0_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Os scripts de pos instalação impedem que façamos esta atualização. O motivo pelo qual ele fez isso pode ser variado.
Talvez alguma mudança na versão 14.10 que precisa ser aplicada e que na versão 15 é esperada existir.
Apesar do trabalho extra que nos dá, este é um zelo dos desenvolvedores que é digno de aplausos pelo cuidado com a entrega do produto.
Nem toda aplicação te dará uma mensagem tão explícita do motivo de insucesso na atualização, mas dependendo do caso você só perceberá o erro quando a aplicação estiver quebrada e seu telefone tocando, um monte de gente mandando zap ou batendo na sua porta porque algo parou de funcionar.
Neste caso, uma vez que você tenha identificado o motivo, o ideal será voltar o backup do ambiente para o ponto que ela estava funcionando e rever como proceder.
Por isso, antes de atualizar na produção, sempre faça em um ambiente de testes e mesmo após todos os passos estarem anotados, realize um backup completo do seu ambiente antes de partir para produção.
Descobrindo quais versões do pacote estão disponíveis
Antes de mais nada nós precisamos descobrir quais versões temos disponíveis no repositório. Isso é importante porque a mensagem apenas nos diz que devemos instalar um pacote da série 14.10.x e podem haver vários ai.
As duas formas de se fazer isso usam o comando apt-get. Eu vou mostrar as duas formas, porém você não precisa usar as duas. Escolha uma só.
Opção 1: apt-cache madison
apt-cache madison gitlab-ce|head
gitlab-ce | 15.0.0-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.10.3-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.10.2-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.10.1-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.10.0-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.9.4-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.9.3-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.9.2-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.9.1-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
gitlab-ce | 14.9.0-ce.0 | https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
Opção 2: apt-cache policy
apt-cache policy gitlab-ce|head
gitlab-ce:
Installed: 14.9.3-ce.0
Candidate: 15.0.0-ce.0
Version table:
15.0.0-ce.0 500
500 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
14.10.3-ce.0 500
500 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
14.10.2-ce.0 500
500 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 Packages
Perceba que até o tamanho do comando é o mesmo, mudando apenas o formato da saída. Mas o que nos importa é realmente o número da versão dos pacotes então escolha a opção que te agradar.
Atualizando para versão seguinte
Como eu preciso atualizar para versão 14.10.x, eu escolhi a versão 14.10.3-ce.0 que foi o último lançamento nesta série (observe que o número de versão deve ser exatamente o descrito pelo gerenciador de pacotes.
Sendo assim, a minha linha de comandos acaba sendo a seguinte (observe como a versão do pacote a ser instalado foi passado para o apt-get – este é o segredo para escolher a versão):
apt-get install gitlab-ce=14.10.3-ce.0
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following packages were automatically installed and are no longer required:
libfwupdplugin1 linux-aws-5.13-headers-5.13.0-1022 linux-aws-5.13-headers-5.13.0-1023
linux-headers-5.13.0-1022-aws linux-headers-5.13.0-1023-aws linux-image-5.13.0-1022-aws
linux-image-5.13.0-1023-aws linux-modules-5.13.0-1022-aws linux-modules-5.13.0-1023-aws
Use 'sudo apt autoremove' to remove them.
The following packages will be upgraded:
gitlab-ce
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
23 not fully installed or removed.
Need to get 1048 MB of archives.
After this operation, 5596 kB of additional disk space will be used.
Get:1 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal/main amd64 gitlab-ce amd64 14.10.3-ce.0 [1048 MB]
Fetched 1048 MB in 17s (60.9 MB/s)
(Reading database … 260114 files and directories currently installed.)
Preparing to unpack …/gitlab-ce_14.10.3-ce.0_amd64.deb …
gitlab preinstall: Checking for unmigrated data on legacy storage
gitlab preinstall: Automatically backing up only the GitLab SQL database (excluding everything else!)
2022-05-25 15:50:21 -0300 -- Dumping database …
[...]saída truncada aqui[...]
_______ __ __ __
/ ____(_) /_/ / ____ _/ /_
/ / __/ / __/ / / __ `/ __ \
/ /_/ / / /_/ /___/ /_/ / /_/ /
\____/_/\__/_____/\__,_/_.___/
Upgrade complete! If your GitLab server is misbehaving try running
sudo gitlab-ctl restart
before anything else.
If you need to roll back to the previous version you can use the database
backup made during the upgrade (scroll up for the filename).
Eu trunquei a saída do apt-get pois ela é bem extensa, mas ao final a atualização para esta versão foi concluída com sucesso e após alguns testes com o ambiente já estável pudemos fazer a ultima atualização para versão mais recente da forma como já estamos habituados.
apt-get install gitlab-ce
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following packages were automatically installed and are no longer required:
libfwupdplugin1 linux-aws-5.13-headers-5.13.0-1022 linux-aws-5.13-headers-5.13.0-1023
linux-headers-5.13.0-1022-aws linux-headers-5.13.0-1023-aws linux-image-5.13.0-1022-aws
linux-image-5.13.0-1023-aws linux-modules-5.13.0-1022-aws linux-modules-5.13.0-1023-aws
Use 'sudo apt autoremove' to remove them.
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/1081 MB of archives.
After this operation, 34.7 MB of additional disk space will be used.
(Reading database … 261129 files and directories currently installed.)
Preparing to unpack …/gitlab-ce_15.0.0-ce.0_amd64.deb …
gitlab preinstall: Checking for unmigrated data on legacy storage
gitlab preinstall: Automatically backing up only the GitLab SQL database (excluding everything else!)
2022-05-25 16:03:22 -0300 -- Dumping database …
Dumping PostgreSQL database gitlabhq_production … [DONE]
2022-05-25 16:03:29 -0300 -- Dumping database … done
[...]saída truncada[...]
_______ __ __ __
/ ____(_) /_/ / ____ _/ /_
/ / __/ / __/ / / __ `/ __ \
/ /_/ / / /_/ /___/ /_/ / /_/ /
\____/_/\__/_____/\__,_/_.___/
Upgrade complete! If your GitLab server is misbehaving try running
sudo gitlab-ctl restart
before anything else.
If you need to roll back to the previous version you can use the database
backup made during the upgrade (scroll up for the filename).
Aplicação atualizada, sistema estável e nenhum novo incidente.
Recomendação final
Para finalizar vale a pena enfatizar que isso foi feito em ambiente de teste.
Na produção, independente de qual seja a aplicação, só realize a atualização após ter feitos todos os testes em um ambiente de teste separado, após ter gerado snapshots e backups dos servidores da aplicação e do bancos de dados.
E o mais importante, antes de simplesmente digitar “apt-get upgrade” ou qualquer outro comando de atualização, verifique qual é o caminho de atualização recomendado pelos desenvolvedores. Isso pode te poupar de virara noite voltando backups.
Eu já tive um problema com uma aplicação que estava mais de 30 releases desatualizada e alguém resolveu dar um apt-get sem verificar isso.
O resultado foi um desastre que só não foi maior porque era uma aplicação de uso interno e os principais usuários estavam de férias.
O problema só foi solucionado após voltar o backup da máquina e uma nova atualização ser feita avançando versão por versão até a última, tal como mostrado neste texto.
No final, a aplicação ficou bem, os usuários satisfeitos e o carinha que fez isso… bem … espero que ele tenha aprendido algo novo (estudar e planejar antes de fazer uma atualização) para usar na nova empresa que o contratou.