태그 보관물: opengrok

Docker로 OpenGrok 설치

잘 쓰고 있던 OpenGrok 서버가 갑자기 맛이 가는 바람에 부랴부랴 대안을 찾아야 했는데 마땅한 서버가 없어서 로컬 머신에 Docker로 설치하는 방법을 찾아 보았다. 여기 소개된 내용은 Docker Hub에서 자세한 설명을 찾을 수 있다.

Docker가 설치되어 있다면 command창에서 다음의 명령으로 OpenGrok docker를 pull한다.

docker pull opengrok/docker

Pulling이 끝나면 목적에 소스와 indexing결과가 저장될 공간을 만들어 준다. src에는 분석할 소스를 넣고 bin에는 편의를 위한 스크립트를 넣을 예정이다.

mkdir -p ~/opengrok/bin
mkdir -p ~/opengrok/src
mkdir -p ~/opengrok/etc
mkdir -p ~/opengrok/data

이제, 8080 port에 접속 설정을 하고 위에서 만든 volume들을 docker에 마운트 시켜준다. Git server에 접근하기 위해 키 관련 설정을 해주어야 하는데, 귀찮아서 그냥 .ssh 디렉토리를 마운트 시켜 주었다.

docker run -d \
    --name opengrok \
    -p 8080:8080/tcp \
    -v ~/opengrok/bin/:/opengrok/bin/ \
    -v ~/opengrok/src/:/opengrok/src/ \
    -v ~/opengrok/etc/:/opengrok/etc/ \
    -v ~/opengrok/data/:/opengrok/data/ \
    -v ~/.ssh:/root/.ssh \
    opengrok/docker:latest

이제 해당 서버의 콘솔을 열고 인덱싱 명령을 수행하면 된다. GUI가 없다면 다음의 명령으로 실행 중인 docker에 접속할 수 있다.

docker exec -it <docker_container_id> bash

서버에 접속한 후 인덱싱을 수행하는 명령어는 다음과 같다.

export OPENGROK_DIR=/opengrok
java \
    -Djava.util.logging.config.file=$OPENGROK_DIR/etc/logging.properties \
    -Xmx1024m \
    -jar $OPENGROK_DIR/lib/opengrok.jar \
    -c /usr/local/bin/ctags \
    -s $OPENGROK_DIR/src -d $OPENGROK_DIR/data -H -P -S -G \
    -W $OPENGROK_DIR/etc/configuration.xml -U http://localhost:8080/

인덱싱이 끝나면 웹브라우져에서 http://localhost:8080으로 접속하면 된다.

위의 인덱싱 명령어가 너무 길어서 입력하기 힘들기 때문에 source code를 업데이트하고 인덱싱 하는 과정을 묶어서 다음과 같이 스크립트로 만들고 ~/opengrok/bin 안에 넣어 두면 편리하게 사용할 수 있다.

OpenGrok 최신버전 설치하기

한 때 갑자기 배포하던 서버가 없어져서 혹시나 하는 걱정에 배포파일을 다운로드 받아 두기까지 했던 OpenGrok project가 다행히 Oracle의 GitHub 내에 자리를 잡고 잘 꾸준히 업데이트 되고 있다.

예전에 작성했던 OpenGrok 설치를 위한 글들은 너무 오래되어서 잘 맞지 않는 것도 있고 해서 최근 버전과 환경을 기준으로 다시 설치 과정을 정리했다. 이 포스팅은 잘 작성된 프로젝트의 문서인 ‘How to setup OpenGrok’을 기준으로 한 나름의 정리이다.

환경과 필요한 것들

– Ubuntu 18.4 LTS
– OpenJDK 11
– Tomcat 9
– Universal-ctags
– 최신 버전의 release file: https://github.com/oracle/opengrok/releases

설치

이 후로는 OpenGrok이 설치 되는 위치를 OPENGROK_DIR로 정의 하고 다음과 같이 환경 변수로 설정 했다고 가정한다.

export OPENGROK_DIR=/var/opt/opengrok

설치할 디렉토리와 하위 디렉토리를 만들어 주고 소유자 권한을 $USER, 그룹 권한을 tomcat으로 설정한 다음, 배포 파일의 압축을 풀어준다. (<version> 부분은 알맞은 값으로 대체)

mkdir -p $OPENGROK_DIR/{src, data, dist, etc, log}
sudo chown $USER:tomcat -R $OPENGROK_DIR
tar -C $OPENGROK_DIR/dist --strip-components=1 -xzf opengrok-<version>.tar.gz

Deployment

Tomcat9을 실행한 상태에서 http://localhost:8080/manager/html로 접근해서 deploy -> WAR file to deploy -> Choose File 버튼을 선택하고 $OPENGROK_DIR/dist/lib/source.war 경로를 찾은 다음 Deploy 버튼을 누른다.

Indexing

분석 할 source code를 $OPENGROK_DIR/src에 받아 둔 후 다음의 커맨드로 indexing을 완료하면 모든 준비가 완료된다.

java \
    -Djava.util.logging.config.file=$OPENGROK_DIR/etc/logging.properties \
    -jar $OPENGROK_DIR/dist/lib/opengrok.jar \
    -c /usr/local/bin/ctags \
    -s $OPENGROK_DIR/src -d $OPENGROK_DIR/data -H -P -S -G \
    -W $OPENGROK_DIR/etc/configuration.xml -U http://localhost:8080/source

Source code가 업데이트 될 때 마다 indexing을 해 주어야 하는데 커맨드가 너무 길어서 복잡하니까 bin directory를 만들고 여기에 index.sh라는 이름으로 shell script를 만들어서 넣어 주었다.

mkdir $OPENGROK_DIR/bin
chmod +x index.sh
$OPENGROK_DIR/bin/index.sh

Access

indexing 까지 다 되었으면 http://localhost:8080/source에 접근하여 source code를 browsing 할 수 있다. Localhost가 아닌 외부에서 접근을 허용 하려면 tomcat의 환경을 변경해 주면 된다. (관련 내용은 인터넷에서 어렵지 않게 찾을 수 있다)

참고: universal-ctags

Ubuntu에서 apt로 설치 할 수 있는 ctags는 Exuberant ctags이지만 OpenGrok은 Universla-ctags를 요구한다. 다음의 방법으로 코드를 컴파일 하고 /usr/local/bin에 설치해서 기존의 /usr/bin/ctags 경로와 충돌하지 않도록 해준다.

git clone git@github.com:universal-ctags/ctags.git
cd ctags
autogen.sh
./configure --prefix=/usr/local
make
sudo make install
/usr/local/bin/ctgas --version

Repo와 OpenGrok update를 위한 cron용 script

OpenGrok은 여러면에서 좋은 점이 많은 도구이지만 source code가 변경될 때마다 오랜시간이 걸리는 indexing을 해야 한다는 점은 불편 한 점 중 하나이다. 여기서는 cron으로 돌릴 수 있는 간단한 shell script를 사용해서 한가한 시간에 source가 최신으로 유지될 수 있도록 하는 방법을 설명한다.

Cron runnable update script

Cron으로 동작시키는 script를 작성할 때 가장 많이 실수하는 것은 환경변수들을 사용할 수 없다는 것을 종종 잊는다는 점이다. 이 script 역시 cron에서 동작시킬 것을 감안해서 절대 경로를 사용하도록 작성되어야 한다.

이 script는 REPO_DIR_ROOT로 선언한 directory에 있는 directory들을 돌아다니면서 repo sync를 수행한 다음 OpenGrok index를 돌리는 일을 한다. 다음 세개의 변수를 자신에 맞게 변경해 주자.

  • REPO_DIR_ROOT: Source repository들의 최상위 directory
  • OPENGROK_DIR: OpenGrok binary의 위치
  • REPO: Repo script의 위치
#!/bin/bash
#
# Cron runnable OpenGrok updating script.
# This script syncs all source repositories under 
#  the REPO_DIR_ROOT then runs OpenGrok indexing. 
#
#                                      -litcoder

####
# Configuration variables. - Use absolute path.
#
# * REPO_DIR_ROOT : Top of the source repositories
# * OPENGROK_DIR : Path to OpenGrok executable
# * REPO : Path to repo script
REPO_DIR_ROOT="/var/opengrok/src"
OPENGROK_DIR="/var/opengrok/bin/OpenGrok"
REPO="/home/<<YOUR_HOME_DIR>>/bin/repo"
####

sync_cmd="$REPO sync"
repodirs=`ls ${REPO_DIR_ROOT}`

#################
function clear_all_modifications
{
  #Make a master branch
#  MASTER_BRANCH="master"
#  echo "$REPO start $MASTER_BRANCH --all"

  #Clear all
  echo "$REPO forall -c 'git checkout -f&&git clean -f -d ./'"
}

function print_msg
{
  msg=$1
  echo "$msg"
}

function print_msg_with_time
{
  msg=$1
  echo "$msg - [`date`]"
}

function run_repo_sync
{
  repo_prj=$1
  dirs_skip=$2
  print_msg_with_time "Syncing [$repo_prj]"
  cd ${REPO_DIR_ROOT}/$repodir/

  print_msg "Clear modifications"
  clear_all_modifications

  $sync_cmd 2>&1
}

function run_opengrok_index
{
  $OPENGROK_DIR index
}

#################

#RepoSync 
print_msg "start syncing"

for repodir in $repodirs
do
  run_repo_sync $repodir
done
echo "syncing has done at `date`"

#OpenGrok
print_msg_with_time "Start OpenGrok indexing (`date`)"
run_opengrok_index

echo "done at `date`"

Cron Job 등록

Cron을 설정하는 방법에 대해 잘 설명된 문서들이 많으니 이것을 참고해서 crontab을 실행하고 시간을 설정한다.

$> crontab -e

다음은 금요일 오후 7시 부터 script를 실행하고 home directory에 ‘opengrok_sync_log.txt’  file에 수행 log를 남기도록 설정하는 예이다. /home/<your_home_dir>/bin 아래에 update_opengrok.sh라는 이름으로 script를 저장한다고 가정했다.

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
00 19 * * 5 /home/<YOUR_HOME_DIR>/bin/update_opengrok.sh > /home/<YOUR_HOME_DIR>/opengrok_sync_log.txt

주의할 점

Crontab 실행주기를 결정할 때 script의 수행에 소요되는 시간을 고려해야 한다. 너무 잦은 주기로 설정해 놓으면 이전의 job들이 끝나지 않은 상태에서 다음 job이 실행되는 경우가 생기게 되고 이것들이 쌓여서 system 자원을 잡아먹고 느려지다가 결국은 system 관리자의 전화를 받게 될 수도 있다. 😉

OpenGrok 0.11.1

Update 2020년 12월 26일.
다행히 OpenGrok project는 새 주인을 잘 만나 GitHub(https://github.com/oracle/opengrok)에서 배포되고 있어, 아래의 내용은 더 이상 유효하지 않습니다. GitHub로 부터 최신 버전을 설치하는 방법은 OpenGrok 최신버전 설치하기를 참고하세요.

언제 부턴가 Oracle에서 OpenGrok page가 없어졌다.
GitHub에 source로 배포하는 곳은 있는데 빌드된 버전에 대한 링크를 찾기 힘들어서 예전에 받아 두었던 0.11.1 version의 source와 binary를 올려 둔다.

  • Binary : <링크 삭제됨>
  • Source : <링크 삭제됨>

OpenGrok 설치 빨리 하기

지난번 OpenGrok 설치 관련 포스팅 이후 OpenGrok을 설치할 기회가 몇 번 더 있었는데, Source 경로를 제외한 나머지 설정들을 기본값으로 사용하니 훨씬 설치 하기가 간편했다. 여기에는 source를 제외한 나머지 설정을 기본으로 사용해서 약간의 수정으로 설치 하는 방법을 설명한다.

2017년 12월 13일 : Ubuntu16.04 LTS를 기준으로 수정함.

설치환경

Ubuntu 16.04 LTS

필요한 package들

$ sudo apt-get install tomcat8 tomcat8-admin exuberant-ctags
$ sudo service tomcat8 start

Tomcat등의 필요한 package들을 설치하고 OpenGrok을 download 받아서 압축을 푼다.

$ wget http://3.1.85.226/wp-content/uploads/2013/04/opengrok-0.11.1.tar.gz
$ tar xvzf opengrok-0.11.1.tar.gz

 

OpenGrok 실행 환경 만들기

OpenGrok은 설치 환경이 /var/opengrok directory 아래에 구성되어 있다고 가정한다. 이를 위해 압축을 해제한 OpenGrok file들을 /var/opengrok 으로 옮긴다.

$ sudo mv ./opengrok-0.11.1 /var/opengrok

Source file 복사

분석하고자 하는 소스 파일을 /var/opengrok/src 아래로 복사한다.

Deploy 및 indexing

모든 설정이 끝났으니 deploy하고 indexing을 시작한다. Oepngrok-0.11.1은 tomcat6를 가정하므로 tomcat8의 위치를 가리키도록 OPENGROK_TOMCAT_BASE를 지정한다.

$ sudo OPENGROK_TOMCAT_BASE=/var/lib/tomcat8 /var/opengrok/bin/OpenGrok deploy
$ /var/opengrok/bin/OpenGrok index