gitlab 업데이트

Synology에 gitlab을 설치해서, 프로젝트마다 (간혹 그리고 어쩌다가 commit 하면서) 작업을 하고 있다.

편한 것도 있고 조금 불편한 것도 있고 그랬지만, 버전 관리가 되고 있다는 점에서 안심이 되었기 때문이다.

21년도에 gitlab 14.3.2-ce.0를 docker로 설치해서 지금까지 업데이트를 하지 않고 사용해왔다.

사실 내가 쓰는 기능이라고 해봐야 아주 초보적인, 그리고 웹 브라우저에서 간혹 코드 살펴볼 정도만 쓰는거라 버전이 낮아도 큰 불편함은 없었다.

그래도 혹시나 보안에 취약하지는 않을까, 중간에 뻑이 나지 않을까 걱정은 되기는 했다.

털려봐야 큰 타격이 없는 것들이기는 하지만, 그래도 기분은 나쁘니까...


며칠 전에 갑자기 gitlab을 업데이트해야겠다는 마음을 먹었다.

docker 사용법도 다 잊어버렸고, gitlab 설정파일을 어디 고쳤는지 기억도 나지 않았지만 그래도 chtaGPT가 있으니 안심하고 시작했다. (결론적으로 설정파일인 gitlab.rb 은 문제가 발생하지 않는 한 손보지 않고 그대로 갖고 가는 것을 확인했다.)

우선은 gitlab을 업데이트하기 위해서는 upgrade path가 맞아야 한다.
바로 14.3.2에서 18.5.1로 업데이트가 되지 않는다.

https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/

위 링크에서 업데이트해야 하는 주요 image를 다 pulling해 놓는다. (아래 코드는 버전 하나만 적어놓았지만, upgrade path에 보여지는 모든 버전을 pulling해야 한다)

sudo docker pull gitlab/gitlab-ce:14.10.5-ce.0

그리고 기존 컨테이너는 중지한다.

sudo docker stop gitlab

컨테이너들 모두 살펴본다.

sudo docker ps -a

가장 최신 gitlab 컨테이너의 이름을 바꿔놓는다.

`sudo docker rename gitlab gitlab_14.3_backup'

컨테이너를 실행한다.

sudo docker run -d \
  --hostname URL_OF_MY_GITLAB \
  -p 8080:80 -p 8443:443 -p 49158:22 \
  --name gitlab \
  --restart always \
  -v /volume1/@docker/volumes/217a84837ed4ad139ca6da453e54bea098aba367f3120cdc67161d57b2409072/_data:/etc/gitlab \
  -v /volume1/docker/gitlab/logs:/var/log/gitlab \
  -v /volume1/@docker/volumes/ef707c6e62394d75d232a9b3c7ce72c90a34ca9b8b6d79239712a1e812e9e2a0/_data:/var/opt/gitlab \
  gitlab/gitlab-ce:14.10.5-ce.0

약 15~20분 정도 기다려야 하는데, 이게 귀찮으니...
다음 쉘 스크립트를 실행해서, 제대로 작동하는지를 10초마다 확인한다.

while true; do
  out=$(sudo docker ps)
  echo "$out"
  if echo "$out" | grep -q "(healthy)"; then
    echo "SUCCESS!!"
    break
  fi
  sleep 10
done

웹브라우저로 접속이 되는지 확인한다.


아주 종종, 여러가지 문제가 발생한다.

gitlab.rb 파일을 손봐서 gitlab reconfigure를 하거나,
사용자 비번이 먹히지 않아서 새로 손봐야 하거나,
gitaly 설정 파일 등을 손봐야 할 경우도 있다.

이럴 경우는 문제에 따라서 해결해야 하는 초식이 다르니,
chatGPT한테 해결책을 물어가면서 해결했다.

mactex texlive + kotex 설정

$ sudo tlmgr repository remove main
$ sudo tlmgr repository remove ktug
$ sudo tlmgr repository add https://ftp.kaist.ac.kr/tex-archive/systems/texlive/tlnet main
$ sudo tlmgr repository add http://mirror.ischo.org/KTUG/texlive/tlnet ktug
$ sudo tlmgr pinning add ktug "*"
$ cd ~/tmp
$ curl -O https://mirror.ischo.org/KTUG/texlive/tlnet/ktugrepo.pub.txt
$ sudo tlmgr key add ./ktugrepo.pub.txt
$ sudo tlmgr repository list
List of repositories (with tags if set):
    https://ftp.kaist.ac.kr/tex-archive/systems/texlive/tlnet (main)
    http://mirror.ischo.org/KTUG/texlive/tlnet (ktug)

R package build

nonparaeff 패키지를 처음 작성했던 게 아마 포닥을 하고 있을 때였던 것 같다.
혼자 쓰다가 CRAN에 업로드를 하고자 매뉴얼도 작성해서 Kurt에게 메일로 submission을 하면 Kurt가 CRAN으로 업로드를 하는 시스템이었는데, 이제는 자동 submission 시스템으로 바뀌어서 무척 편해졌다.
DEA 책을 쓰면서 자잘한 함수들을 몇개 더 만들고, 버그도 수정해 가면서 2013년에 0.5.8 버전을 만들고 그 이후는 귀찮아서 업데이트를 하지 않았다.

그 동안에 Kurt가 패키지 업데이트가 필요하다는 메일을 자꾸 보내왔다.
NAMESPACE를 작성해서 패키지를 수정하라는 것이었는데, NAMESPACE가 뭔지를 모르니 무시를 하곤 했다.
내가 패키지를 만들던 시절에는 매뉴얼에 NAMESPACE에 대한 내용이 없었거나 내가 귀찮아서 안 읽었거나, 둘 중의 하나인데.. 아무튼 NAMESPACE에 대해서 시간을 내서 공부하기가 싫었다.

저번주에는 Kurt에게서 최후 통첩이 날아왔다. Compind 패키지와 의존성 문제가 생기는 문제를 해결하지 않고 NAMESPACE를 작성하지 않으면 패키지를 CRAN에서 내리겠다는 내용이었다. 내 nonparaeff에 의존하는 패키지가 있다는게 살짝 기쁘기도 했지만, 어쨋든 매뉴얼을 새로 읽고 뭔가를 고쳐야 한다는 압박감과 귀찮음이 동시에 밀려오기도 했다.

할 수 없이 저번주부터 다시 R Packages라는 책을 띄엄띄엄 읽어가면서 고칠 부분을 조금씩 손을 봤다. Writing R Extensions 매뉴얼보다 더 친절하게 쓰여 있어서 읽기가 무척 수월하기도 했고, 무엇보다 이런 유용한 정보를 Wikibooks로 뿌려서 저자에게 고마운 마음이 들었다.


R 버전이 올라가면서 DESCRIPTION 파일의 i) Depends 항목을 될 수 있으면 쓰지 말아야 하며 Imports와 Suggests 항목이 그 역할을 대신하고, ii) NAMESPACE 파일에서 다른 패키지에서 꼭 필요한 함수들만 불러오는 방식으로 정책이 바뀌었다는 것을 드디어 알아냈다.

DESCRIPTION 파일에서 Authors@R 항목이 신설되었고 Author와 Maintainer 항목은 쓰지 않을 것을 권고하고 있으나, 실상 Author와 Maintainer 항목을 쓰지 않으면 에러가 발생했다.
Authors@R 항목으로 쓰려고 했지만 어쩔 수 없이 Author와 Maintainer 항목을 구분해서 작성했다.
예전에는 Author에 한명만 기록을 할 수 있었던 것 같은데, 이제는 여러명을 comma로 구분해서 쉽게 넣을 수 있게 되었다.

중간에 한글로 커멘트를 달아놓은 ar.dual.dea()함수는 뭔가 더 작업을 해야 할 것 같은데, 그 작업을 하기 귀찮아서 아예 패키지에서 삭제해버렸다.

CRAN에 submission을 하면 NOTE들을 해결하라고 몇번 빠꾸를 먹다가, 어제는 제대로 submission을 한 것 같아서 Francesco Vidoli에게 제대로 submission을 했다는 메일을 보내고 퇴근을 했다.
그러나 운전 중에 reverse dependency 문제가 발생했다는 메일을 받았다.
이런 것까지 내가 신경을 써야 할 필요가 있을까 짜증이 밀려왔지만, reverse dependency 문제를 보고하는 시스템이 있어야 패키지 작성자들이 제대로 패키지를 작성하게 된다는 결론에 이르러서 얼른 문제를 해결하겠다고 마음을 또 먹었다.


Compind 패키지의 NAMESPACE 파일을 살펴보니, ar.dual.dea() 함수를 사용하고 있어서 reverse dependency 문제가 발생한 것이었다. "소스코드를 다 뜯어볼 필요없이 NAMESPACE 파일만 보면 여러 문제가 해결되네. 이래서 NAMESPACE 파일이 필요한 거구나"라고 혼잣말을 하면서 R 개발자들에게 찬사를 보냈다. "역시 똑똑한 사람들은 설계를 잘 해"

집에서는 컴퓨터를 켜기가 싫어서 Vidoli에게 '내일 출근을 해서 롤백하겠다'고 메일을 보냈지만, 이 아저씨는 냉큼 ar.dual.dea()함수를 사용하지 않게끔 Compind 패키지를 재작성해서 submission을 한 것 같다.

오늘 출근을 하고 ar.dual.dea() 함수를 다시 집어넣고, DESCRIPTION 파일과 NAMESPACE 파일들을 손보고 다시 submission을 했다.

이번에는 에러가 발생하지 말기를 바라면서 이 글을 작성하고 있다.

주말에도 일

최근 최현도 교수와 함께 쓰는 태양광 기업의 기술협엽 전략 논문의 자료를 재구축 하는데 힘을 쏟고 있다.

이제는 SQL을 쓰는데 많이 익숙해져서 R이 잘 하는 기능과 SQL이 잘 하는 기능을 분리해서 작업을 해나가고 있다.

RMySQL 패키지를 쓰자니 코딩하는데 생산성이 떨어져서 sql 스크립트를 만들고 system() 명령으로 수행하고 있다.


오늘 드디어 모든 작업을 완료했다.

그 동안 내가 실수한 부분도 있었고, 최교수가 자료를 잘 못 전해준 적도 있어서 여러번 로직을 바꾸고 함수를 수정/보완하느라 많이 늦어졌다.

게다가 데이터 용량이 크니 SQL 수행하는 데도 시간이 꽤 걸려서, 한번 실수를 하면 수정/보완하는데 많은 시간을 할애했다.

물론 땜빵식으로 해결하면야 빨리 할 수 있었지만, 이번에는 100% replication이 되고 documentation에도 완벽을 기하고 싶었다.

그래서 이 파일 저 파일 검증도 여러번 하고, README.md 파일도 매우 꼼꼼하게 작성했다.


이렇게 일을 하다보니 느리게 진척이 되는데다가 에너지가 많이 빠지는 느낌이 들었다.

원래 오늘은 석원형, 재원이와 등산을 가기로 했던 날이지만 몸 상태도 별로 좋지 않았고 상협이 중간고사도 가까워서 등산을 연기했다.

그리고는 어제와 오늘은 연구실에 상협이와 같이 가서 상협이는 중간고사 공부를, 나는 분석작업 마무리를 했다.

거의 코드가 완성되어 갈 때 R 패키지를 업데이트를 하고, 테스트 코드를 작성했다.

해당 테스트 코드가 작동하지 않아서, 나는 패키지 업데이트 때문에 함수 사용법이 바뀌었거나 연관 패키지에 버그가 발생한 것으로 착각을 하고 정말 오랜 시간 삽질을 했다.

하다하다 못 해 github의 RMySQL 개발자 홈페이지도 들어가고, 이 사람이 쓴 글도 읽어보았다.
이 개발자는 요새 RMariaDB 개발에만 매진하고 있다길래.. 혹시나 RMariaDB로는 그 버그를 해결할 수 있을 것으로 착각으로 하고 RMariaDB를 설치하고 모든 코드를 RMariaDB용으로 다 고쳤다.

그럼에도 불구하고 버그가 있을 것이라고 생각하는 부분(그리고 내가 테스트용 코드를 잘 못 적어놓은 부분)은 여전히 문제가 해결되지 않아서, 개발자에게 issue까지 던졌다.

이 와중에 R-4.1.2 -> R-4.1.3으로 업그레이드도 해보고, 패키지도 다 새로 설치해보고, 다시 R-4.1.2로 돌아가는 등 많은 삽질을 했다.

virtual env를 안 써서 이런 사단이 났구나 싶어서, 자책도 많이 했다.

그러나 순식간에 날아온 답변에는 내가 테스트 코드를 잘 못 적었다는 짤막한 글이 담겨있었다.

얼마나 피곤했으면 몇 줄 안 되는 테스트 코드를 실수할까 싶어 무척 당황스러웠다. 고맙다고 답글을 남기고 오늘 아침에 마무리를 하겠다고 마음을 먹으면서, 막걸리로 하루를 마무리했다.


드디어 오늘 그 동안 마음에 걸렸던 부분을 깔끔하게 다 정리하고, Google Maps API도 거하게 한번 다시 사용하면서 완벽하게 replication이 가능하게 만들었다.

이제야 마음이 좀 놓인다.

최현도 교수와 초반에 작업하던 때와는 달리 새로운 데이터를 생성했으며, 처음에 의도했던 바대로 데이터가 뽑혀서 다행이다.

결과를 보내주게 되어서, 한참 동안 미안했던 마음이 조금 안정이 되었다.