컴퓨터활용/프로프레임

[프로프레임3.0] tmconfig.m 을 통한 서버 일괄 빌드

멜번초이 2017. 3. 17. 22:41

프로프레임 3.0 에서 티맥스 서버를 일괄 컴파일하는 쉘을 작성하였다.  서버는 두가지 종류로 나눌 수 있는데 표준적인 서버가 있다. 이런 서버는 표준 템플릿서버소스로 동일한 모양의 소스로 생성이 되고 각 서비스는 dlcall 방식으로 호출하게 된다. 서버에 서비스는 하나씩만 구성할 수도 있고 하나의 서버에 여러 서비스를 묶을 수도 있는데 이것은 프로젝트 상황에 맞게 구성하면 된다. 

작업하기 전에 쉘들이 존재하는 디렉토리 하위에 src, log, appbin 이 만들어져 있어야 한다. 

| 직접 컴파일 서버 목록 파일 작성 

직접 컴파일 하는 목록을 먼저 작성한다.  전체 업무별 디렉토리를 뒤지면 직접 컴파일하는 서버 목록은 구할 수 있다.  이 작업은 약간의 수작업이 요구된다.  

[compile.svr.list]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/approot/pfm/fw/src/TPFMAPLOGER
/approot/pfm/fw/src/TPFMAPLOGSL
/approot/pfm/fw/src/TPFMAPLOGTX
/approot/pfm/fw/src/TPFMCCUT
/approot/pfm/fw/src/TPFMDFER
/approot/pfm/fw/src/TPFMHLTHCHK
/approot/pfm/fw/src/TPFMIPPR
/approot/pfm/fw/src/TPFMLINK
/approot/pfm/fw/src/TPFMOPPR
/approot/pfm/fw/src/TPFMTIMER
/approot/pfm/fw/src/UPFMAPLOGER
/approot/pfm/fw/src/UPFMAPLOGSL
/approot/pfm/fw/src/UPFMAPLOGTX
/approot/pfm/fw/src/UPFMHLTHCHK
/approot/pfm/fw/src/UPFMSELFCHK
/approot/app/aa/src/UAA001
/approot/app/aa/src/DAA001
/approot/app/bb/src/DBB001
/approot/app/bb/src/DBB002
/approot/app/cc/src/UCC001
/approot/app/cc/src/UCC002
/approot/app/cc/src/UCC003
/approot/app/cc/src/UCC004
/approot/app/cc/src/UCC005
/approot/app/cc/src/UCC006
cs


| 직접 컴파일 

목록이 작성되면 이제 일괄 컴파일을 한다. comp_svr.sh 를 실행한다.  입력 아규먼트로 위에서 작성한 목록 파일을 지정한다.  순서대로 소스파일을 복사해 와서 컴파일을 실행하고 정상 컴파일이 완료되면 생성된 바이너리를 상위의 appbin 으로 옮겨 놓는다.  실제  $TMAXDIR/appbin 으로 복사해 넣는 것은 때가 되면 직접 한다. 


[comp_svr.sh]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/ksh
 
HOSTNAME=`hostname`
USER=`id`
LOG_HOME=../log
LOG_FILE=comp_svr.log.$DATE_TIME
BK_TEAMDIR=$TEAMDIR
BK_WORKDIR=$WORKDIR
TARGET_DIR=../appbin/
 
# ******************** execute (sql/program) *****************
 
usage()
{
      echo "Usage : `basename $0` serverlist_file"
      echo "   (ex) `basename $0` comp_svr.list"  
      exit 
}
 
echo_log()
{
   DT=`date +%Y%m%d_%H%M%S`
   echo "$1"
   echo "$DT|$1" >> $LOG_HOME/$LOG_FILE
}
 
# ======================  MAIN ====================== #
 
if [ $# -eq 1 ];then 
   SVR_LIST_FILE=$1
else 
   usage;
   exit
fi
 
SVR_LIST=`grep -"^#" $SVR_LIST_FILE`
cd ./src/
 
for LIST_ONE in $SVR_LIST
do
   SVR_NM=`echo $LIST_ONE | rev | cut -d/ -f1 | rev`
   # 서버 소스를 복사해 온다
   echo "cp -p ${LIST_ONE}.c  . "
   cp -p ${LIST_ONE}.c   .
   cp -p ${LIST_ONE}.mk  .
   # 컴파일을 한다
   make -f  ${SVR_NM}.mk clean all
   # 로그를 기록 
   if [ $? -eq 0 ];then
      mv ${SVR_NM} $TARGET_DIR
      echo_log "${SVR_NM}|OK" 
   else 
      echo_log "${SVR_NM}|FAIL" 
   fi
done
 
# ======================  END  ====================== #
cs


| 자동 컴파일 서버목록파일 작성

이제 남은 서버들은 자동 컴파일하면 된다. 프로프레임3.0 에서는 pfmbuildsvr 이라는 명령어가 있는데 이 프로그램은 tmconfig.m 에서 서버에 포함된 서비스목록을 구하여 서버.c를 생성하고 이것을 컴파일하여 서버 바이너리를 생성해 준다. 문제는 이 pfmbuildsvr 대상 서버 목록을 구하는 것이다.   

자 그러면 이제 표준 템플릿모양의 서버 목록을 추출하기 위한 쉘을 작성했다. 먼저 준비한 직접 컴파일 대상 목록이 필요하다. 

실행 : make_build_svr_list.sh  compile.svr.list  

그러면 compile.svr.list  목록을 하나씩 읽으면서 전체 서버목록에서 하나씩 제외한다. 전체 서버 목록은   $HOSTNAME.svr.list.all 로 생성이 될 것이며 build 서버의 목록은 $HOSTNAME.build.svr.list  으로 생성될 것이다. 


[make_build_svr_list.sh] 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/ksh
 
HOSTNAME=`hostname`
LOG_HOME=../log
LOG_FILE=comp_svr.log.$DATE_TIME
LISTFILE=$HOSTNAME.build.svr.list
TARGET_DIR=../appbin/
 
# **************************** execute (sql/program) *************************
 
usage()
{
      echo "Usage : `basename $0` 컴파일대상서버목록"
      echo "   (ex) `basename $0` comp_svr.list"  
      exit 
}
 
echo_log()
{
   DT=`date +%Y%m%d_%H%M%S`
   echo "$1"
   echo "$DT|$1" >> $LOG_HOME/$LOG_FILE
}
 
# =================  MAIN  ====================== #
 
if [ $# -eq 1 ];then 
   EXCPT_LIST_FILE=$1
else 
   usage;
   exit
fi
 
# tmconfig.m 에서 서버목록을 구함.  # 로 시작하는 것은 제외
grep SVRNAME $TMAXDIR/config/tmconfig.m |grep -"^#" > buildsvr.list.temp2
cat buildsvr.list.temp2 |cut -d= -f2|awk '{ print $1 }' > buildsvr.list.temp1 
 
# 혹시 붙어 있을 , 제거 
cat  buildsvr.list.temp1 | sed -'s/\,//g' >  buildsvr.list.temp2
cat  buildsvr.list.temp2 | sort | uniq >   $HOSTNAME.svr.list.all
 
SVR_LIST=`grep -"^#" $EXCPT_LIST_FILE`
 
cp $HOSTNAME.svr.list.all buildsvr.list.temp1
 
# 루프를 돌면서 compile 대상 서버는 제외한다
for LIST_ONE in $SVR_LIST
do
   SVR_NM=`echo $LIST_ONE | rev | cut -d/ -f1 | rev`
   echo "$SVR_NM 제외"
   cat  buildsvr.list.temp1  | sed -e s/${SVR_NM}/compile/> buildsvr.list.temp2
   mv buildsvr.list.temp2 buildsvr.list.temp1
done
 
# 직접컴파일대상 서버는 목록에서 제외
egrep -"=|tmaxadm|trace|PFMAGENT|PFMIPPR|DOGW0|compile" buildsvr.list.temp1>buildsvr.list.temp2
egrep -"fdltest|snd_svr|snd_svr01|svr2|svr4|pTm_svr" buildsvr.list.temp2 > $LISTFILE
rm -f compile buildsvr.list.temp1  buildsvr.list.temp2
 
echo "created $LISTFILE"
# =======================  END OF FILE  ================== #
 
cs



| 빌드서버를 이용한 서버 자동 컴파일 

자동컴파일 목록이 생성되었으면 전체 컴파일 하는 방법은 간단하다. 내부적으로 서비스목록이 포함된 서버 소스를 자동 생성하고 컴파일을 실행하게 된다.

실행방법 : build_svr.sh 위에서생성된buildsvr대상목록


[build_svr.sh]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/ksh
 
HOSTNAME=`hostname`
LOG_HOME=../log
LOG_FILE=build_svr.log.$DATE_TIME
TARGET_DIR=appbin
 
# **************** execute (sql/program) *******************
usage()
{
      echo "Usage : `basename $0` serverlist_file"
      echo "   (ex) `basename $0` comp_svr.list"
      exit
}
 
echo_log()
{
     DT=`date +%Y%m%d_%H%M%S`
     echo "$1"
     echo "$DT|$1" >> $LOG_HOME/$LOG_FILE
}
 
# ======================  MAIN  ====================== #
if [ $# -eq 1 ];then
   SVR_LIST_FILE=$1
else
   usage;
   exit
fi
 
#  # 시작되는 주석라인은 제외 
SVR_LIST=`grep -"^#" $SVR_LIST_FILE`
cd $TARGET_DIR
 
for SVR_NM in $SVR_LIST
do
  pfmbuildsvr $SVR_NM
  if [ $? -eq 0 ];then
      echo_log "${SVR_NM}|OK"
  else 
      echo_log "${SVR_NM}|FAIL"
  fi
done
 
# ======================  END  ====================== #
cs


모두 수행하게 되는 현재 디렉토리 하위의 appbin 에 컴파일된 바이너리들이 모아져 있을 것이다. 직접 컴파일 해야 하는 서버의 C 프로그램은 src 에 복사되어져 있을 것이다. 컴파일 결과 로그는 log 에 만들어져 있게 된다.