一、背景
公司的CI/CD环境出现了故障,影响项目联调测试,于是协调运维给了台服务器,准备自己来玩
初步设想是通过脚本一键自动从git拉代码、maven自动打包、自动启动项目
二、服务器环境
已装好Centos、有外网
三、环境准备
先建好目录
cd /data
mkdir project
cd project
mkdir gitlab
1. 安装Java
参考网上资料,jdk要求建议1.8+
我安装的是 jdk-8u341-linux-x64.tar.gz ,先把包下载下来,然后上传到服务器(我是在/usr/local 目录下建了个java目录,然后把包上传到这个目录),然后执行如下命令解压
tar -xzvf jdk-8u341-linux-x64.tar.gz
然后配置一下环境变量
vim /etc/profile
在最后面加上
export JAVA_HOME=/usr/local/java/jdk1.8.0_341
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
然后执行如下命令让环境变量生效
source /etc/profile
最后验证一下,输入:java -version ,看到如下则代表成功
2. 安装Git
我是先移除了服务器自带的git
yum -y remove git
然后重新安装了下
yum -y install git
执行完检查下,看到如下则ok
3. 安装Maven
切换到/data/apps 目录
先下载maven包
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.8.2/binaries/apache-maven-3.8.2-bin.tar.gz
然后解压
tar -xzvf apache-maven-3.8.2-bin.tar.gz
cd apache-maven-3.8.2/
pwd
获取到目录 然后去配置maven的环境变量
也是先vim /etc/profile ,在最后输入如下
export MAVEN_HOME=/data/apps/apache-maven-3.8.2
export PATH=${PATH}:${MAVEN_HOME}/bin
然后执行如下命令让环境变量生效
source /etc/profile
验证一下:mvn -v , 看到如下代表成功
在/data 目录下建一个目录,名为:mvnrepository 用于存放jar包
进入到:/data/apps/apache-maven-3.8.2/conf 目录,先将默认的settings.xml文件备份
mv settings.xml settings.xml.bak
然后新建一下包含公司私服的配置文件,取名:settings.xml,内容参考如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/data/mvnrepository</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>xxxx</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>xxxx</password>
</server>
</servers>
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun maven</name>
<mirrorOf>central,!com.e-iceblue,!oss-snapshot,!nexus-agile-bpm,!release,!alfresco,!spring,!elastic.co
</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<mirror>
<id>self-public</id>
<name>nexus maven</name>
<mirrorOf>*,!com.e-iceblue,!oss-snapshot,!nexus-agile-bpm,!release,!alfresco,!spring,!elastic.co
</mirrorOf>
<url>http://xxx.xxx.xxx.xxx:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>alibaba</id>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<id>jdk18</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<id>self</id>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://xxx.xxx.xxx.xxx:8081/repository/maven-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://xxx.xxx.xxx.xxx:8081/repository/maven-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>alibaba</activeProfile>
<activeProfile>self</activeProfile>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
四、具体实施
1. 先把Git上的代码拉到服务器目录
切换到/data/project/gitlab 目录,执行如下命令,把相关的几个项目拉到本地
cd /data/project/gitlab/
git clone http://xxx.xxx.xxx/hcloud-cloud-plus.git
git clone http://xxx.xxx.xxx/hcloud-commons-plus.git
切换到目录,看一下代码有没有拉下来
2. 尝试编译
切换到其中一个项目目录
cd /hcloud-cloud-plus
然后执行如下maven命令测试
/data/apps/apache-maven-3.8.2/bin/mvn -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -f pom.xml clean package
项目build成功,证明拉代码和打包这一步走通了,接下来就是写项目启动脚本
3. 编写脚本
在/data/project 目录下新建一个名为:start.sh 的脚本,内容如下:
start() 方法里的内容要根据自己项目的实际情况调整
#!/bin/bash
ACTION=$1
MODULER=$2
BRANCH=$3
if [ "$ACTION" = "" ];
then
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
exit 1
fi
if [ "$MODULER" = "" ];
then
echo -e "\033[0;31m 未输入应用名 \033[0m"
exit 1
fi
if [ "$BRANCH" = "" ];
then
BRANCH="feature-220915"
fi
JAVA_OPT="-Xms256M -Xmx1024M -Xss512k -XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=128M -XX:+UseG1GC"
echo $JAVA_OPT
function start()
{
count=`ps -ef | grep java | grep $MODULER | grep -v grep | wc -l`
if [ $count != 0 ];then
echo "$MODULER is running..."
else
cd gitlab/hcloud-cloud-plus/$MODULER/
echo "开始拉取模块:【$MODULER】的git代码,分支为:【$BRANCH】..."
git pull origin $BRANCH
echo "开始maven打包..."
/data/apps/apache-maven-3.8.2/bin/mvn -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -f pom.xml clean package
echo "开始启动$MODULER-server..."
nohup java -jar $JAVA_OPT /data/project/gitlab/hcloud-cloud-plus/$MODULER/$MODULER-server/target/$MODULER-server.jar > /data/project/$MODULER.log 2>&1 &
echo "模块$MODULER-server启动完成..."
echo $(date +%F%n%T)
fi
}
function stop()
{
echo "Stop $MODULER"
pid=`ps -ef | grep java | grep $MODULER-server | grep -v grep | awk '{print $2}'`
count=`ps -ef | grep java | grep $MODULER | grep -v grep | wc -l`
if [ $count != 0 ];then
kill $pid
count=`ps -ef | grep java | grep $MODULER-server | grep -v grep | wc -l`
pid=`ps -ef | grep java | grep $MODULER-server | grep -v grep | awk '{print $2}'`
kill -9 $pid
echo "Stop $MODULER Success"
fi
}
function restart()
{
stop
sleep 2
start
}
function status()
{
count=`ps -ef | grep java | grep $MODULER-server | grep -v grep | wc -l`
if [ $count != 0 ];then
echo "$MODULER is running..."
else
echo "$MODULER is not running..."
fi
}
case $ACTION in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
echo -e "\033[0;31m Usage: \033[0m \033[0;34m sh $0 {start|stop|restart|status} {SpringBootJarName} \033[0m
\033[0;31m Example: \033[0m
\033[0;33m sh $0 start esmart-test.jar \033[0m"
esac
给大家看下我们其中一个项目的结构,然后应该能明白我为什么在start() 方法里要这样写
其实用到的就是hcloud-epidemic-server 这个module打好的jar包
4. 测试脚本
回到/data/project 目录,执行start.sh脚本
hcloud-authority.log这几个以.log结尾的文件是脚本启动后生成的,我是后截的图,所以有这三个
执行脚本
./start.sh start hcloud-epidemic
在/data/project下生成了一个hcloud-epidemic.log 日志文件,可以打开看一下日志
tail -1000f hcloud-epidemic.log
项目启动成功
不想看日志,直接ctrl + c结束掉就行(不会影响程序在后台执行)
这个脚本还支持停止、重启、查看运行状态等操作,写个脚本,放到开机欢迎屏,方便其它开发知道咋使用
编辑:/etc/motd 文件
vim /etc/motd
输入如下内容:
*******************xxx项目测试服务器********************************
前端:前端打好的包上传解压到:/usr/local/nginx/html/ 目录下即可
后端:项目目录:/data/project/
后端启动方式:(自动拉取git以及maven打包,后端只须提交代码到对应的分支即可)
启动:./start.sh start hcloud-epidemic
带项目分支:./start.sh start hcloud-epidemic dev (不带分支默认使用的feature-220915分支)
重启:./start.sh restart hcloud-epidemic
查看状态:./start.sh status hcloud-epidemic
停止:./start.sh stop hcloud-epidemic
hcloud-authority 和 hcloud-oauth的启动方法同上
********************xxx项目测试服务器*********************************
然后重新打开一下shell窗口,可以看到项目说明
至此一个简单的CI/CD完成,算是给开发节省了一点工作量吧
|