# 代码发布
# 整体思路
# 依赖环境及工具
- Git
- Centos7及以上
- Gitlab
- Jenkins
- shell
- ansible
# 安装基础环境
# Gitlab install
# Jenkins install
# Ansible install
# yum 安装
yum install -y epel-release
yum install -y ansible
1
2
2
# 配置文件
/etc/ansible/ansible.cfg ###主要为ansible一些基本配置
/etc/ansible/hosts ## ansible groups hosts 配置
1
2
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
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
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