需要在jenkins 服务器、后台节点服务器安装docker环境
安装jenkins 方法省略
安装docker 方法省略
配置jenkins 界面如下:
jenkins 字符参数设置:
构建执行shell :
命令:
#!/bin/bash
repo=${repo_ip}/${repo_images}_${repo_project_name}:${publish_version}.${BUILD_NUMBER}
### maven 打包编译方法
maven_build(){
echo -e "\033[31m ################ maven_build \n \033[0m "
/usr/local/apache-maven/bin/mvn clean package -Dmaven.test.skip=true
}
RUN_CHECK(){
if [ $? -eq 0 ];then
echo -e "\033[32m Run $1 is successful \033[0m "
else
echo -e "\033[31m Run $1 is fail \033[0m "
fi
}
# 构建管理镜像
dockerfile_management(){
## 配置dockerfile
cat > Dockerfile << EOF
FROM ${repo_images}
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:UTF-8
ENV LC_ALL en_US.UTF-8
ENV JAVA_HOME /usr/local/java
ENV PATH ${JAVA_HOME}/bin:${PATH}:.
ENV CLASSPATH $CLASSPATH:${JAVA_HOME}/lib/dt.jar:$CLASSPATH:${JAVA_HOME}/lib/tools.jar:.
RUN mkdir -p /home/scf
RUN mkdir -p /data
COPY ./target/${1}-0.0.1-SNAPSHOT.jar /home/scf
WORKDIR /data
EXPOSE 8888
ENTRYPOINT ["sh","-c","java -jar /home/scf/${1}-0.0.1-SNAPSHOT.jar"]
EOF
}
# 构建节点镜像
dockerfile_node(){
## 配置dockerfile
cat > Dockerfile << EOF
FROM ${repo_images}
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:UTF-8
ENV LC_ALL en_US.UTF-8
ENV JAVA_HOME /usr/local/java
ENV PATH ${JAVA_HOME}/bin:${PATH}:.
ENV CLASSPATH $CLASSPATH:${JAVA_HOME}/lib/dt.jar:$CLASSPATH:${JAVA_HOME}/lib/tools.jar:.
RUN mkdir -p /home/scf
RUN mkdir -p /data
COPY ./target/mdbc_node-0.0.1-SNAPSHOT.jar /home/scf
WORKDIR /data
EXPOSE 6789 8081
#ENTRYPOINT ["java","-jar","-Dspring.profiles.active=${1}","-DmanagerUrl=http://192.168.10.202:8888","/home/scf/mdbc_node-0.0.1-SNAPSHOT.jar"]
ENTRYPOINT ["sh","-c","java \$PROFILES_ACTIVE \$MANAGER_URL -jar /home/scf/mdbc_node-0.0.1-SNAPSHOT.jar"]
EOF
}
### docker 集成 jar 包 成镜像,并发布到私服
if [ "$run_stats" == "publish" ];then
#echo "WORKSPACE is ${WORKSPACE}"
cd ${WORKSPACE}
svn update
if [[ "${repo_project_name}" == "mdbc_manager" ]];then
cd md_blockchain_manager
maven_build
echo -e "\033[32m \n==> repo is ${repo} \033[0m \n "
sleep 1
dockerfile_management "${repo_project_name}"
#构建镜像
docker build -t ${repo} .
# 上传镜像
docker push ${repo}
fi
if [[ ${repo_project_name} == mdbc_node ]];then
cd md_blockchain
maven_build
dockerfile_node
#构建镜像
docker build -t ${repo} .
# 上传镜像
docker push ${repo}
echo -e "\033[32m \n==> repo is ${repo} \033[0m \n "
fi
fi
#远端节点执行命令:
需要安装 Execute shell 插件:
SSH site : root@192.168.XX.XX:22
Command:
#/bin/bash
echo -e "\033[31m \n *############################### hostname is `hostname` ###############################* \n \033[0m "
########### 客户端执行方法
########################################################
RUN_CHECK(){
if [ $? -eq 0 ];then
echo -e "\033[32m==> Run $1 is successful \033[0m "
else
echo -e "\033[31m==> Run $1 is fail \033[0m "
fi
}
if [ "$run_stats" == "publish" ];then
repo=${repo_ip}/${repo_images}_${repo_project_name}:${publish_version}.${BUILD_NUMBER}
echo -e "\033[31m docker pull the private repo is : $repo \033[0m "
fi
if [ "$run_stats" == "rollback" ];then
repo=${repo_ip}/${repo_images}_${repo_project_name}:${publish_version}
echo -e "\033[31m docker rollback image is : $repo \033[0m "
fi
## docker 停止方法
docker_stop(){
echo -e "\033[31m docker stop ${1} ---- \033[0m "
docker stop ${1} >/dev/null 2>&1
RUN_CHECK "docker stop ${1}"
}
## docker 启动方法
docker_start(){
echo -e "\033[31m docker start ${1} ---- \033[0m "
docker start ${1} >/dev/null 2>&1
RUN_CHECK "docker start ${1}"
}
## docker 删除容器方法
docker_rm(){
echo -e "\033[31m docker rm ${1} ---- \033[0m "
docker rm ${1} >/dev/null 2>&1
RUN_CHECK "docker rm ${1}"
}
## docker 重启方法
docker_restart(){
docker_stop "${1}"
docker_start "${1}"
}
## docker 发布方法
docker_publish(){
docker_stop "${1}"
docker_rm "${1}"
if [ "$1" == "mdbc_manager" ];then
echo -e "\033[31m docker run -d --name ${1} -P ${2} -v /usr/local/java:/usr/local/java -v /data/${1}:/data ${repo} \033[0m "
docker run -d --name ${1} -P ${2} -v /usr/local/java:/usr/local/java -v /data/${1}:/data ${repo}
RUN_CHECK "docker run ${1}"
fi
if [[ ${1} == mdbc_node* ]];then
echo -e "\033[31m docker run -d --name ${1} -P ${2} -v /usr/local/java:/usr/local/java -v /data/${1}:/data \
-e PROFILES_ACTIVE="-Dspring.profiles.active=mdbc_node_a" -e MANAGER_URL="-DmanagerUrl=http://192.168.10.202:8888" ${repo} \033[0m "
docker run -d --name ${1} -P ${2} -v /usr/local/java:/usr/local/java -v /data/${1}:/data -e PROFILES_ACTIVE="-Dspring.profiles.active=${1}" \
-e MANAGER_URL="-DmanagerUrl=http://192.168.10.202:8888" ${repo}
RUN_CHECK "docker run ${1}"
fi
echo -e "\n\n"
}
#### 发布 启动容器 核心方法
if [ "$run_stats" == "publish" ] || [ "$run_stats" == "rollback" ];then
case "${repo_project_name}" in
mdbc_manager)
docker_publish "mdbc_manager" "-p 8888:8888 "
;;
mdbc_node)
docker_publish "mdbc_node_a" "-p 6001:6789 -p 7001:8081 "
docker_publish "mdbc_node_b" "-p 6002:6789 -p 7002:8081 "
;;
esac
else
docker_$run_stats "$repo_project_name"
fi
echo -e "\033[32m \n *############################### end ###############################* \n \033[0m "
jenkins 构建发布界面如下:
构建日志如下: