Skip to main content

Making debian file for java application.

Making debian file for java application.

ㅇ deployed resources
/opt/testApp/bin/testApp.jar
/etc/testApp/testApp.conf
/etc/testApp/log4j.conf

ㅇ Preparation
1. install dpkg-deb
ㅇ install debian packaging
# install macport
https://guide.macports.org/#installing.macports
cd /opt/local/bin
sudo port selfupdate
sudo port install dpkg

brew install dpkg
2. make jar in dist/lib
        3. init file in /testApp/etc/init/testApp.conf

ㅇ Make debian for jar

VERSION="0.0.1"
PROJ_NAME="testApp"

#now we build .deb package
mkdir -p builds
rm -rf builds/$VERSION
mkdir -p builds/$VERSION/$PROJ_NAME/etc/$PROJ_NAME
mkdir -p builds/$VERSION/$PROJ_NAME/opt/$PROJ_NAME/bin
mkdir -p builds/$VERSION/$PROJ_NAME/opt/$PROJ_NAME/log
mkdir -p builds/$VERSION/$PROJ_NAME/DEBIAN/

# debian control file
echo "Package: $PROJ_NAME" >> builds/$VERSION/$PROJ_NAME/DEBIAN/control
echo "Architecture: amd64" >> builds/$VERSION/$PROJ_NAME/DEBIAN/control
echo "Maintainer: Dewey Hong" >> builds/$VERSION/$PROJ_NAME/DEBIAN/control
echo "Priority: optional" >> builds/$VERSION/$PROJ_NAME/DEBIAN/control
echo "Version: $VERSION" >> builds/$VERSION/$PROJ_NAME/DEBIAN/control
echo "Description: $PROJ_NAME" >> builds/$VERSION/$PROJ_NAME/DEBIAN/control

# debian conffiles file
echo "etc/$PROJ_NAME/$PROJ_NAME.conf" >> builds/$VERSION/$PROJ_NAME/DEBIAN/conffiles
echo "etc/$PROJ_NAME/log4j.conf" >> builds/$VERSION/$PROJ_NAME/DEBIAN/conffiles

# debian preinst file
echo "#!/bin/sh" >> builds/$VERSION/$PROJ_NAME/DEBIAN/preinst
echo "set -e" >> builds/$VERSION/$PROJ_NAME/DEBIAN/preinst
echo "if [ \"\$(pidof $PROJ_NAME)\" ] " >> builds/$VERSION/$PROJ_NAME/DEBIAN/preinst
echo "then" >> builds/$VERSION/$PROJ_NAME/DEBIAN/preinst
echo " echo \"stoping $PROJ_NAME \"" >> builds/$VERSION/$PROJ_NAME/DEBIAN/preinst
echo " stop $PROJ_NAME" >> builds/$VERSION/$PROJ_NAME/DEBIAN/preinst
echo "fi" >> builds/$VERSION/$PROJ_NAME/DEBIAN/preinst
chmod 775 builds/$VERSION/$PROJ_NAME/DEBIAN/preinst

# copy files where they need to be
cp dist/lib/$PROJ_NAME.jar  builds/$VERSION/$PROJ_NAME/opt/$PROJ_NAME/bin/$PROJ_NAME.jar
cp src/main/resources/localhost.conf  builds/$VERSION/$PROJ_NAME/etc/$PROJ_NAME/$PROJ_NAME.conf
cp src/main/resources/log4j.conf  builds/$VERSION/$PROJ_NAME/etc/$PROJ_NAME/log4j.conf

# make debian
dpkg-deb --build builds/$VERSION/$PROJ_NAME
DEBIAN=${PROJ_NAME}-${VERSION}_amd64.deb
echo mv builds/$VERSION/$PROJ_NAME.deb builds/$VERSION/$DEBIAN
mv builds/$VERSION/$PROJ_NAME.deb builds/$VERSION/$DEBIAN


= [testApp.conf] =================================================
#!upstart
description "testApp"
author      "Dewey Hong"

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on runlevel [2345]
stop on runlevel [016]

# Automatically Respawn:
respawn
respawn limit 99 5

#modify limits
limit nofile 64000 64000

env PROJ_NAME=testApp
env JMX_PORT=28001
env JDB_PORT=28002

script
    ulimit -n 65000
    # Not sure why $HOME is needed, but it is:
    export HOME="/root"
    export JARFILE="/opt/$PROJ_NAME/bin/$PROJ_NAME.jar"
    export IPADDR=`ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'|head -n 1`
    
# configure the -Dproperties
    #JOPTS="-Xmx xxx -Xms=xxx -Xmn xxx"
    JOPTS="$JOPTS -server -Djava.net.preferIPv4Stack=true"
    JOPTS="$JOPTS -Xmx1G -Xms1G -Xmn128M -XX:+UseParNewGC -XX:ParallelCMSThreads=2 -XX:+UseConcMarkSweepGC -Xloggc:/var/log/testApp/gc.log -XX:+PrintGCDateStamps"
    JOPTS="$JOPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$JDB_PORT"
    JOPTS="$JOPTS -Dsun.jnu.encoding=ISO-8859-1 -Dfile.encoding=ISO-8859-1"
    JOPTS="$JOPTS -Djava.rmi.server.hostname=$IPADDR \
  -Dcom.sun.management.jmxremote \
           -Dcom.sun.management.jmxremote.port=$JMX_PORT \
           -Dcom.sun.management.jmxremote.authenticate=false \
           -Dcom.sun.management.jmxremote.ssl=false"

    # configure application apps
    JARGS="$JARGS -c /etc/$PROJ_NAME/$PROJ_NAME.conf"
    JARGS="$JARGS -l /etc/$PROJ_NAME/log4j.conf"
    JLOGFILE=$LOGS_DIR/$PROJ_NAME_error.log
    # Override JOPTS with OVERRIDE_JOPTS from commandline while starting this script
    # Override JARGS with OVERRIDE_JARGS from commandline while starting this script
    set -x
echo "============ restart process !!!! ============" >> /opt/$PROJ_NAME/log/$PROJ_NAME.log
echo java $JOPTS $OVERRIDE_JOPTS -jar $JARFILE $JARGS $OVERRIDE_JARGS >> /opt/$PROJ_NAME/log/service.log
    exec java $JOPTS $OVERRIDE_JOPTS -jar $JARFILE $JARGS $OVERRIDE_JARGS > /opt/$PROJ_NAME/log/$PROJ_NAME.log  2>&1
    set +x
end script

post-start script
    PID=`ps -ef | grep $PROJ_NAME.jar | egrep -v 'grep|nohup' | awk '{print $2}'`
    echo $PID > /opt/run/$PROJ_NAME.pid
end script

pre-start script
if [ -f /opt/run/$PROJ_NAME.pid] ; then
        rm /opt/run/$PROJ_NAME.pid
    fi
    # Date format same as (new Date()).toISOString() for consistency
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /opt/$PROJ_NAME/log/$PROJ_NAME.log
end script

pre-stop script
    if [ -f /opt/run/$PROJ_NAME.pid] ; then
        rm /opt/run/$PROJ_NAME.pid
    fi
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /opt/$PROJ_NAME/log/$PROJ_NAME.log
end script




Comments

Popular posts from this blog

Install CoreOs on linode without VM

Install CoreOs on linode without VM 1. Add a Linode 2. Create a new Disk   CoreOS 3. Rescue > Reboot into Rescue Mode 4. Remote Access   Launch Lish Console 5. make an install script cat <<'EOF1' > install.sh # add needed package sudo apt-get update sudo apt-get install -y curl wget whois sudo apt-get install -y ca-certificates #sudo apt-get install gawk -y # get discovery url discoveryUrl=`curl https://discovery.etcd.io/new` # write cloud-config.yml cat <<EOF2 > cloud-config.yml #cloud-config users:   - name: core     groups:       - sudo       - docker coreos:   etcd:     name: node01     discovery: $discoveryUrl hostname: node01 EOF2 # get the coreos installation script #wget https://raw.github.com/coreos/init/master/bin/coreos-install wget https://raw.githubusercontent.com/coreos/init/master/bin/coreos-install # run installation chmod 75...

Amazon RDS Blue/Green Deployments

In order to avoid some errors I experienced when proceeding as described in the official documentation, I describe what I did in order. 1) Modify parameters of source_database * error: Blue Green Deployments requires cluster parameter group has binlog enabled. RDS Parameter groups: source-params-group binlog_format => MIXED mysql> show global variables like 'binlog_format'; 2) Insert a row after rebooting the source database, to avoid this error. * error: Correct the replication errors and then switch over. Read Replica Replication Error - IOError: 1236, reason: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file' => To Fix: You need to change the data in the source database. INSERT INTO dummy_table ( `favorite_id` , `favorite_order` , `user_id` , `board_id` ) VALUES ('100001', '1', '11111', '11111'); 3) Modify the param...

실리콘밸리 구직 체험기2_201505 - 3. 새로운 위기

실리콘밸리 구직 체험기2_201505 - 3. 새로운 위기 우리는 지난 1년간 lockscreen app과 messenger app을 만들었습니다. 나는 backend restful API를 만들고 cms를 node.js, angular.js로 만들었다. 또한 AWS 인스턴스를 관리했습니다. 마지막 몇달 동안 기존 lockscreen 앱과 CMS 관리 대신에 메신저 앱에 집중했습니다. 한국에서는 매출과 이익을 내지 않으면 투자를 받을 수 없는 환경이지만 매출 없이 유저수 증가에만 집중하는 모습이 참 생소했습니다. 우리는 사용자의 행태를 확인하기 위해서 BI툴을 이용해서 사용자 수와 retention rate 등을 추적하고 새로운 기능에 대해 사용자의 반응을 점검하면서 기획을 수시로 바꿨습니다. 많은 기능을 새로 만들고 ab test를 통해서 또 많이 폐기 했다. 실제 만든 기능 중에 절반 이상은 버려 졌습니다. locket앱은 2014년 google store의 베스트 앱으로 선정되기도 했다. 그러나 사실 이 시점에 이미 우리는 메신저 앱에 올인 하고 있었습니다. https://www.facebook.com/photo.php?fbid=10204452594066393&set=a.2225490048257.118046.1577949323&type=1 우리가 만든 메신저 앱은 초반의 반응이 워낙 좋아서 정체되었던 lockscreen 유저수를 단번에 따라 잡았습니다. 특히 Retention Rate 이 좋아서 사용자들의 제대로 사용하고 있다고 생각했습니다. 잠깐이지만 google play 에 featured 되고, 인도에 가입 지원을 했을 때 사용자 수가 급증하기도 했습니다. https://www.facebook.com/photo.php?fbid=10204901853057587&set=a.2225490048257.118046.1577949323&type=1 그 시...