Bitbucket 서버 업그레이드하기

In 네트워크와 시스템 관리 by Choi Kyung-sik

지원 정보 확인하기

오라클의 엄격해진 라이센스 정책으로 Java, MySQL, VirtualBox 등이 데비안의 패키지 대상에서 빠져나갔다. 데비안과 그 시스템에 설치한 Atlassian 제품인 Confluence, Jira, Bitbucket을 업그레이드할 때 신경이 쓰이고 손이 많이 간다. 좀 더 쉬운 관리를 위해 Oracle Java는 OpenJDK로 MySQL은 PostgreSQL로 변경하기로 마음먹고 작업을 진행하였다. Bitbucket 서버처럼 Atlassian 제품을 설치할 때나 업그레이드할 때 항상 문서 웹 페이지를 확인할 필요가 있다. Java, 데이터베이스에 대한 지원 정보는 필수적으로 보아야 한다. 내가 사용하고 있는 Bitbucket 서버 버전이 4.10.1이고 Supported platforms – Bitbucket Server 4.10.x에 나오는 지원 정보는 다음과 같다.

  • OpenJDK: 1.8u40+, 1.8u0 – 1.8u20
  • PostgreSQL: 9.2 – 9.5

사용하고 있는 데비안 9(stretch)에서 PostgreSQL 9.6을 사용한다. MySQL을 PostgreSQL로 마이그레이션할 때 문제가 발생할 것으로 보인다. Supported platforms – Bitbucket Server 7.2.x에 나오는 최신 버전의 지원 정보는 다음과 같다.

  • Oracle Java & OpenJDK : Java 11, Java 8 (1.8u65+) – OpenJDK는 AdoptOpenJDK의 Java 8 JRE 권장
  • PostgreSQL: 9.4 – 11

PostgreSQL 9.6을 지원하므로 먼저 Bitbucket 7.2로 업그레이드하고 MySQL을 PostgreSQL로 마이그레이션할 것이다. 4 버전에서 7 버전으로 차이가 크게 나는 버전 업그레이드이기 때문에 문서를 꼼꼼히 볼 필요가 있다. 특히 Upgrade Bitbucket Server from an archive fileMigrate server.xml customizations to bitbucket.properties 두 페이지를 주의 깊게 보아야 한다. Bitbucket 5부터 server.xml의 설정을 bitbucket.properties 파일에 하도록 변경하였기 때문이다. 아래에서 이에 관한 내용을 살펴볼 것이다.

OpenJDK는 Confluence, Jira, Bitbucket의 지원 정보를 종합적으로 고려하면 AdoptOpenJDK의 Java 8 (HotSpot)이 제일 나은 선택이다. AdoptOpenJDK 설치는 데비안에 AdoptOpenJDK 설치하기에서 다룬다.

Bitbucket 서버 업그레이드 절차

사용자의 데이터가 지속해서 쌓이는 Bitbucket과 같은 Atlassian 제품들은 한 번 설치 후 그 과정은 잊힌다. 사용자의 데이터를 유지하면서 새로운 기능을 사용하기 위한 업그레이드로 관심이 옮겨가는 것이다. 나는 Bitbucket으로 이름이 바뀌기 전 Stash부터 주기적으로 업그레이드해 왔다. 자잘한 문제가 있었기는 하지만 전반적으로 부드럽게 업그레이드할 수 있었다.

업그레이드는 한 번 하고 끝나는 것이 아니므로 그 절차를 정리해 둘 필요가 있다. 다음의 절차는 업그레이드할 때마다 참고하기 위해 정리했다. 내가 Bitbucket을 설치한 디렉토리는 /opt/share/bitbucket이고 Bitbucket 홈 디렉토리는 /var/local/lib/bitbucket이다. 설치 파일은 TAR.GZ 압축 파일을 사용한다. 여러분에게 맞게 적용하자.

  1. 위에서 보았듯이 지원하는 Java와 데이터베이스의 버전을 확인한다. 업그레이드 문서에서 이슈가 발생할 만한 것이 없는지도 찾아본다.
  2. 다음의 명령어 실행으로 Bitbucket을 종료한다.
    # systemctl stop bitbucket.service
    
  3. 데이터베이스와 Bitbucket의 홈 디렉토리를 백업한다. 나의 경우 데이터베이스를 포함해서 서버 전체를 백업하는 스크립트를 사용한다.
  4. 다음의 명령어로 기존 버전의 bitbucket의 이름을 변경한다.
    # mv /opt/share/bitbucket /opt/share/bitbucket-old
    
  5. Download Bitbucket Server에서 TAR.GZ Archive 설치 파일을 다운로드한다.
  6. 다운로드한 Bitbucket 압축 파일을 /opt/share로 복사한 후 다음의 절차로 /opt/share/bitbucket에 위치하도록 압축을 푼다.
    # cd /opt/share
    # tar zxvf atlassian-bitbucket-<version>.tar.gz
    # mv atlassian-bitbucket-<version> bitbucket
    # chown -R bitbucket:bitbucket bitbucket
    
  7. 다음의 명령어로 Bitbucket을 시작한다.
    # systemctl start bitbucket.service
    
  8. 웹 브라우저로 새로 설치한 Bitbucket에 접속하여 테스트해 본다. 새로운 버전에 문제가 없으면 다음과 같이 다운로드 받았던 TAR.GZ Archive 설치 파일과 기존의 Bitbucket을 삭제한다.
    # rm atlassian-bitbucket-<version>.tar.gz
    # rm -rf bitbucket-old
    
Bitbucket 버전 4.10.x에서 7.2.x로 업그레이드 시 주의 사항

위의 업그레이드 절차는 미래를 위한 것이다. Bitbucket 서버를 4.10.1에서 7.2.3으로 업그레이드하면서 변경한 내용을 반영한 것이다. 7.2.3 이상의 버전으로 업그레이드할 때 유효하다. 그 이전 버전, 특히 5.0 이전에서 업그레이드하려 한다면 주의해야 한다. Confluence, Jira, Bitbucket의 systemd unit 설정에서 설치 디렉토리와 systemd unit 설정에 대해 다루었는데 Bitbucket 서버 4.10.1을 기반한 것이다. 버전 7.2.3에서 많은 변경이 있다. 내가 직면했던 사항들을 정리해 본다.

1. Bitbucket 서비스의 쓰기 권한이 필요했던 /opt/share/bitbucket 안의 다음 디렉토리가 더는 존재하지 않는다.

  • logs
  • temp
  • work

How to View Detailed permissions for Bitbucket Server directory에서 설치 디렉토리의 사용자와 그룹을 bitbucket이 소유하도록 하고 있다. 그래서 위의 Bitbucket 서버 업그레이드 절차 6.의 라인 4에서 그렇게 했다.

2. Bitbucket 서버 업그레이드 시 발생한 변경 사항들 때문에 systemd unit 설정 파일을 다음과 같이 수정하였다.

[Unit]
Description=Atlassian Bitbucket
After=network.target

[Service]
Type=forking
User=bitbucket
UMask=0027
Environment="BITBUCKET_HOME=/var/local/lib/bitbucket" "JRE_HOME=/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64"
PIDFile=/var/local/lib/bitbucket/log/bitbucket.pid
SuccessExitStatus=143
ExecStart=/opt/share/bitbucket/bin/start-bitbucket.sh --no-search
ExecStop=/opt/share/bitbucket/bin/stop-bitbucket.sh

[Install]
WantedBy=multi-user.target

2.1. PID 파일의 위치가 /opt/share/bitbucket/work/catalina.pid에서 /var/local/lib/bitbucket/log/bitbucket.pid로 변경되었다. 라인 10에서 이를 반영하여 변경하였다.

2.2. ‘systemctl stop bitbucket’ 명령어로 Bitbucket 서비스를 종료하고 ‘systemctl status bitbucket’으로 상태를 확인하면 다음과 같이 종료가 실패하였다는 메시지가 나왔다.

... systemd[1]: bitbucket.service: Main process exited, code=exited, status=143/n/a
... stop-bitbucket.sh[2487]: The Bitbucket webapp has stopped
... systemd[1]: Stopped Atlassian Bitbucket.
... systemd[1]: bitbucket.service: Unit entered failed state.
... systemd[1]: bitbucket.service: Failed with result 'exit-code'.

stop-bitbucket.sh 스크립트의 종료 처리가 미비한 것으로 보인다. 위의 라인 1에서 나온 상태(status) 값 143을 정상적인 종료라고 systemd에게 알려줄 필요가 있다. systemd unit 설정 파일의 라인 11에서 SuccessExitStatus 지시자의 값을 143으로 설정하였다.

2.3. /opt/share/bitbucket/bin 디렉토리 안의 set-bitbucket-home.sh, set-jre-home.sh 스크립트 파일을 보면 환경 변수로 BITBUCKET_HOME과 JRE_HOME을 설정할 수 있다. 그래서 라인 9의 Environment 지시자에 환경 변수 값을 설정하여 넘겨주도록 하였다. 이후 업그레이드를 할 때 set-bitbucket-home.sh, set-jre-home.sh 파일에 BITBUCKET_HOME과 JRE_HOME을 설정하는 귀찮은 작업이 없어질 것이다.

2.4. Bitbucket에 딸려 오는 Elasticsearch를 사용하지 않을 것이기 때문에 라인 12에서 –no-search를 추가하였다.

2.5. Bitbucket 서비스를 실행할 때 umask로 0027을 권장하고 있다. 즉, 사용자와 그룹이 아닌 다른 사용자에게 읽기와 쓰기 권한을 주지 말라고 하는 것이다. 라인 8에서 UMask 지시자를 0027로 설정하였다. 이 설정으로 Bitbucket 서비스가 생성하는 파일은 다른 사용자가 읽거나 쓸 수 없을 것이다. 일관성을 위해 다음의 명령어를 실행하여 Bitbucket 홈 디렉토리의 권한을 변경하였다.

# chmod -R o-rwx /var/local/lib/bitbucket

3. Bitbucket 5부터 server.xml의 설정이 bitbucket.properties로 옮겨졌다. 내가 server.xml에서 설정했던 Proxy 관련 설정 등을 /var/local/lib/bitbucket/shared/bitbucket.properties 파일에 다음과 같이 추가하였다.

server.context-path=/bitbucket
server.secure=true
server.scheme=https
server.proxy-port=443
server.proxy-name=www.bitneer.dev

4. MySQL에서 PostgreSQL로 변경하면서 Download Connector/J에서 받은 MySQL JDBC 드라이버를 /opt/share/bitbucket/lib 또는 /opt/share/bitbucket/app/WEB-INF/lib 디렉토리로 복사해야 하는 번거로운 작업이 하나 줄었다.

관련 글
참고 자료