代码发布

9/25/2017 jenkinsansibleshell

# 代码发布

# 整体思路

# 依赖环境及工具

  • Git
  • Centos7及以上
  • Gitlab
  • Jenkins
  • shell
  • ansible

# 安装基础环境

# Gitlab install

gitlab install

# Jenkins install

jenkins install

# Ansible install

# yum 安装

yum install -y epel-release
yum install -y ansible
1
2

# 配置文件

/etc/ansible/ansible.cfg ###主要为ansible一些基本配置
/etc/ansible/hosts   ## ansible groups hosts 配置
1
2

# shell

  • 控制脚本调用ansible
#!/bin/bash
## version:1.2
## date: 2017-04-29   liuwenqi  update
## mail

# ENV
PROJECT_NAME=$1
GITTYPE=$2
SERVICE=$3
HARDID= $4

# ansible hosts address
ANSIBLE_HOSTS_ADDR=/cron/base_conf/ansible_conf/ansible/hosts-xxx

#ansible command
/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR $PROJECT_NAME -m shell -a "/bin/bash /cron/xxx-scripts/update_code.sh $PROJECT_NAME $GITTYPE $SERVICE $HARDID"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • update code shell
#!/bin/bash
## version:1.2
## date: 2017-11-29   liuwenqi  update


PROJECT=$1
PROJECT_TYPE=pro

# 判断环境
if [[ ${PROJECT:0-2} == 'hd' || ${PROJECT:0-2} == 'Hd' || ${PROJECT:0-2} == 'hD' || ${PROJECT:0-2} == 'HD' ]];then
    PROJECT_TYPE='hd'
    PROJECT=${PROJECT%${PROJECT:0-2}*}
elif [[ ${PROJECT:0-2} == 'cc' || ${PROJECT:0-2} == 'Cc' || ${PROJECT:0-2} == 'cC' || ${PROJECT:0-2} == 'CC' ]];then
    PROJECT_TYPE='cc'
    PROJECT=${PROJECT%${PROJECT:0-2}*}
fi

# 定义变量

PROJECT_NAME=$PROJECT
GIT_SSH_ADDR=git@gitlab.xxxxx:ERP/$PROJECT_NAME.git ### gitlab库
FILE_OWNER=carry
SCIRPTS_DIR=/cron/erp-scripts

if [ -d "/data/$PROJECT_NAME" ];then
        CODE_DIR=/data
else
        CODE_DIR=/app
fi


START_LOG=/tmp/$PROJECT\_version_iterate.log

rm -f $START_LOG
touch $START_LOG


# 检查项目名
if [  -z  "$1" ];then
    echo "please input project name!!!" >>  $START_LOG 2>&1
    exit 1
fi

#工程赋权
function chownpj()
{
        cd $CODE_DIR/$PROJECT_NAME
        for i in $(ls |grep -v 'upload')
        do
               chown -R $FILE_OWNER.$FILE_OWBER $i >>  $START_LOG 2>&1
        done

}


##拷贝函数,视情况进行相应设计。

function copy_file()
{
#appMobile
#	cp /bak/$PROJECT/$PROJECT--$CUDATE/ini/{mongoConfig.xml,config.properties,task.xml}  $CODE_DIR/$PROJECT_NAME/ini/ >>  $START_LOG 2>&1
#appSyncBaseMsg
#	cp /bak/$PROJECT/$PROJECT--$CUDATE/ini/{mongoConfig.xml,config.properties}  $CODE_DIR/$PROJECT_NAME/ini/ >>  $START_LOG 2>&1
#appSyncBiz
	cp /bak/$PROJECT/$PROJECT--$CUDATE/ini/{jdbc.properties,config-timer-jdbc.properties,mongoConfig.xml,appTaskStartConfig.xml,task.xml,config.properties,appMainConfig.xml}  $CODE_DIR/$PROJECT_NAME/ini/ >>  $START_LOG 2>&1
#       cp /bak/$PROJECT/$PROJECT--$CUDATE/WEB-INF/web.xml  $CODE_DIR/$PROJECT_NAME/WEB-INF/  >>  $START_LOG 2>&1
#webMobile2/webMobile3/webErp2/webFile
#       cp /bak/$PROJECT/$PROJECT--$CUDATE/WEB-INF/classes/{config.properties,mongoConfig.xml,redis.properties}  $CODE_DIR/$PROJECT_NAME/WEB-INF/classes  >>  $START_LOG 2>&1
#webErpReport
#	cp /bak/$PROJECT/$PROJECT--$CUDATE/WEB-INF/classes/{config.properties,mongoConfig.xml,redis.properties}  $CODE_DIR/$PROJECT_NAME/WEB-INF/classes  >>  $START_LOG 2>&1
#	cp /bak/$PROJECT/$PROJECT--$CUDATE/WEB-INF/web.xml  $CODE_DIR/$PROJECT_NAME/WEB-INF/  >>  $START_LOG 2>&1
}

function code_clone()
{
	chown -R $FILE_OWNER.$FILE_OWBER $START_LOG
	runuser -l $FILE_OWNER -c "/bin/bash $SCIRPTS_DIR/newrestart.sh stop $PROJECT"  >>  $START_LOG 2>&1

	if [ -d "/data/$PROJECT_NAME" ];then
	        cd /data/$PROJECT_NAME
		GITREMOTE=`git remote -v 2>/dev/null|grep $PROJECT_NAME`  >>  $START_LOG 2>&1
		if [[ -z $GITREMOTE ]];then
			cd /data
			mkdir -pv /bak/$PROJECT
			CUDATE=`date +"%Y-%m-%d-%H-%M"`
			mv /data/$PROJECT_NAME /bak/$PROJECT/$PROJECT--$CUDATE  >>  $START_LOG 2>&1
			git clone $GIT_SSH_ADDR >>  $START_LOG 2>&1
			copy_file
		else
			cd /data/$PROJECT_NAME
			git reset --hard origin/master
			git pull -f >>  $START_LOG 2>&1
		fi
	elif [ -f /app/$PROJECT_NAME/bin/server.sh ];then
		cd /app/$PROJECT_NAME
                GITREMOTE=`git remote -v 2>/dev/null|grep $PROJECT_NAME`  >>  $START_LOG 2>&1
                if [[ -z $GITREMOTE ]];then
                        cd /app
                        mkdir -pv /bak/$PROJECT
                        CUDATE=`date +"%Y-%m-%d-%H-%M"`
                        mv /app/$PROJECT_NAME /bak/$PROJECT/$PROJECT--$CUDATE  >>  $START_LOG 2>&1
                        git clone $GIT_SSH_ADDR >>  $START_LOG 2>&1
                        copy_file
                else
                        cd /app/$PROJECT_NAME
			git reset --hard origin/master
                        git pull -f >>  $START_LOG 2>&1
                fi
	else
		cd /data
	        git clone $GIT_SSH_ADDR > /dev/null 2>&1
	fi
	chownpj
}
function reback_one()
{
	cd $CODE_DIR/$PROJECT_NAME
	git reset --hard HEAD^ >>  $START_LOG 2>&1
	chownpj
}
function reback_two()
{
	cd $CODE_DIR/$PROJECT_NAME
        git reset --hard HEAD^^  >>  $START_LOG 2>&1
	chownpj
}
function reback_hard() {
  cd $CODE_DIR/$PROJECT_NAME
        git reset --hard $4 >>  $START_LOG 2>&1
  chownpj
}
## $2 git command 
case "$2" in
pull)
code_clone
;;
reback_one)
reback_one
;;
reback_two)
reback_two
;;
reback_hard)
reback_hard
;;
none)
;;
*)
printf 'Usage: %s {pull|reback_one|reback_two|reback_hard}\n' "$"
exit 1
;;
esac

## restart service
chown -R $FILE_OWNER.$FILE_OWBER $START_LOG
runuser -l $FILE_OWNER -c "/bin/bash $SCIRPTS_DIR/newrestart.sh $3 $PROJECT" >>  $START_LOG 2>&1
if [[ $? -eq 0 ]]; then
   PROJECT_PID=`ps -ef | grep $PROJECT | grep java|awk '{print $2}'`
   if [[ ! -z $PROJECT_PID  ]];then
     echo "@@@@@@@@  service $PROJECT $PROJECT_TYPE $3  Successfully!!!!,PID is: $PROJECT_PID.  @@@@@@@@"
   else
     echo "!!!!!!!!  service $PROJECT $PROJECT_TYPE $3  failed. !!!!!!!!"
   fi
else
  echo "!!!!!!!! service $PROJECT $3 $PROJECT_TYPE failed. !!!!!!!!"
fi
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166

# jenkins 配置

# 所需插件

  • Publish Over SSH

# 任务配置