ci,cd完整流程
- 安装docker
- 安装jenkins
- 在jenkins里面安装maven环境
- 服务器里面安装jdk
- 执行ci脚本
- 构建企业微信通知
- 服务器里面放入dockerfile文件
安装docker
安装jenkins
在jenkins里面安装maven环境
jenkinsfiels 文件
ci pipline 流水线
try{
node{
stage("prepare"){
checkout scm
def start = new Date().format('yyyy-MM-dd HH:mm:ss')
def pom = readMavenPom file: 'pom.xml'
echo " group: ${pom.groupId} , artifactId: ${pom.artifactId}, version: ${pom.version} "
build_name= "cc.jar"
// 集群空间 这些参数是在jenkins里面配置的
namespace = "${params.namespace}"
// 项目名称
appName= "${params.appName}"
// 项目名称
configCenter= "${params.configCenter}"
// 镜像名称
image_name = "${namespace}-${appName}"
// 应用group
container_group= image_name
// 端口
server_port= "${params.serverPort}"
script {
build_tag= sh(returnStdout:true, script: 'git rev-parse --short HEAD').trim()
}
seconds = (System.currentTimeMillis()/1000).intValue()
// 容器名称
conatianer_name = "${container_group}-${build_tag}-${seconds}"
}
stage("test"){
echo "test stage , skip "
}
// 构建镜像
stage ("build"){
sh " echo 'success'";
sh 'echo Build stage ...'
sh 'export CHAT_WEBHOOK_KEY=cc; sh /home/send_message.sh wechat "测试环境正在构建" "构建第一步 successfully completed..."'
sh "mvn clean package -U -DskipTests -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true"
sh " cp -rf ${WORKSPACE}/lianli-beauty-lyh-start/target/${build_name} /home/zouxulei/local/script/dockers/ "
// /home/local/script/dockers/ 这个是容器或者宿主机里面的路径 需要放dockerfile文件来构建镜像
sh "docker build -t ${image_name}:${build_tag}"+
" --build-arg BUILD_TARGET=${build_name} /home/local/script/dockers/"
}
//删除已有容器
stage("clear_old"){
sh 'echo Test stage ...'
// /home/send_message.sh 容器或者宿主机里面放的企业微信启动文件
sh 'export CHAT_WEBHOOK_KEY=cc; sh /home/send_message.sh wechat "流水线第二步" "构建第二步 successfully completed..."'
sh "docker stop \$(docker ps -aq --no-trunc --filter name=${container_group}) || echo 'stop fail' "
sh "docker rm \$(docker ps -a -q --no-trunc --filter name=${container_group}) || echo 'container rm failed' "
sh "find /home/local/script/dockers/ -mtime +1 -name \"*.jar\" -exec rm -Rf {} \\; "
}
// 运行启动容器
stage("deploy"){
sh "sleep 5"
sh 'echo deploy stage ...'
sh 'export CHAT_WEBHOOK_KEY=cc; sh /home/send_message.sh wechat "流水线第三步" "最终构建 successfully completed..."'
def increase_port= Math.abs("${image_name}-${build_tag} ".hashCode() % 800)
sh "docker run -d -e JAVA_OPTS=\"-Xmx1G -Dspring.cloud.nacos.config.server-addr=${configCenter} -Dspring.cloud.nacos.config.namespace=${namespace} -Dspring.cloud.nacos.discovery.port=${server_port} \" -p ${server_port}:8080 " +
" -v /home/data/logs:/app/logs -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro --name=${conatianer_name} ${image_name}:${build_tag} "
}
}
}catch(e){
currentBuild.result = 'FAILURE'
}
if(currentBuild.result == 'FAILURE') {
node(env.BuildMachineLabel){
stage("Post Build") {
// 在使用send_message脚本之前需要先配置CHAT_WEBHOOK_KEY
sh 'export CHAT_WEBHOOK_KEY=ss; sh /home/send_message.sh wechat "构建失败" "failed completed..."'
} // stage
} // node
} // if
构建通知相关
第一步 sendmessage.sh 脚本文件
#!/bin/sh
usage(){
echo "usage: $0 TYPE TITLE CONTENT [URL]"
echo " TYPE: wechat|dingtalk"
}
TYPE="$1"
TITLE="$2"
CONTENT="$3"
URL="$4"
CHAT_CONTENT_TYPE='Content-Type: application/json'
DEFAULT_PIC_URL="https://img-blog.csdnimg.cn/20191227152859635.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9saXVtaWFvY24uYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70"
DINGTALK_DEFAULT_WORDS=" [LiuMiaoMsg]"
if [ $# -lt 3 ]; then
usage
exit 1
fi
if [ _"${TYPE}" = _"wechat" ]; then
CHAT_WEBHOOK_URL='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key'
elif [ _"${TYPE}" = _"dingtalk" ]; then
CHAT_WEBHOOK_URL='https://oapi.dingtalk.com/robot/send?access_token'
else
usage
exit 1
fi
if [ _"${CHAT_WEBHOOK_KEY}" = _"" ]; then
echo "please make sure CHAT_WEBHOOK_KEY has been exported as environment variable"
usage
exit 1
fi
#!换成自己的构建地址
if [ _"${URL}" = _"" ]; then
URL='https://blog.csdn.net/sha1024/article/details/118600085?spm=1001.2014.3001.5501'
fi
echo "## send message for : ${TYPE}"
if [ _"${TYPE}" = _"wechat" ]; then
curl "${CHAT_WEBHOOK_URL}=${CHAT_WEBHOOK_KEY}" \
-H "${CHAT_CONTENT_TYPE}" \
-d '
{
"msgtype": "news",
"news": {
"articles" : [
{
"title" : "'"${TITLE}"'",
"description" : "'"${CONTENT}"'",
"url" : "'"${URL}"'",
"picurl" : "'"${DEFAULT_PIC_URL}"'"
}
]
}
}'
elif [ _"${TYPE}" = _"dingtalk" ]; then
curl "${CHAT_WEBHOOK_URL}=${CHAT_WEBHOOK_KEY}" \
-H "${CHAT_CONTENT_TYPE}" \
-d '
{
"msgtype": "link",
"link": {
"text": "'"${CONTENT}${DINGTALK_DEFAULT_WORDS}"'",
"title": "'"${TITLE}"'",
"picUrl": "'"${DEFAULT_PIC_URL}"'",
"messageUrl": "'"${URL}"'"
}
}'
else
usage
exit 1
fi
第二步 登录自己的服务器
登录自己的服务器,touch send_message.sh
vim send_message.sh 把上面的文本内容添加进去
第三步 修改jenkinsfiles 脚本
在原先的脚本里面加入这两行
sh 'echo Build stage ...'
sh 'export CHAT_WEBHOOK_KEY=cc; sh /home/wusha/send_message.sh wechat "测试环境正在构建" "构建第一步 successfully completed..."'
主要是修改里面的CHAT_WEBHOOK_KEY 这个企业微信构建机器人的key 替换成你自己企业微信群机器人的key,然后执行流水线就可以成功推送了。
CHAT_WEBHOOK_KEY = key
服务器里面放入dockerfile文件
Dcokerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD eureka-server-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]