【linux】【jenkins】jenkins构建、mvn或者npm打包、docker运行、失败自动回滚脚本

小白对jenkins运维的使用有点简单的想法,这里开个记录贴记录下。

由于未找到jenkins构建失败后执行其他脚本的插件,也暂时没有使用其他运维工具。所以想自己写一个shell脚本,一是方便其他人使用,二是可以失败后回滚。

本文使用gitlab webhook触发jenkins构建,jenkins执行shell命令---》mvn或者npm打包---》打包成docker镜像---》发布---》发布成功后用jenkins的git publisher插件push一个gitlab tag作为备份。

如果构建失败,则checkout最新的tag代码---》重新打包---》打包成docker镜像---》发布运行。

最后发现,结果是可以正常构建,构建失败也可以回滚。但是jenkins的发布状态一直是success,无法知道是正常构建还是回滚构建成功。

也想过,回滚的时候发布邮件或者短信提醒。或者修改jenkins源码,增加构建状态roolback。

 

也想用这个shell脚本做个简单的jenkins------easy-ci

通过java调用linux命令,写几个前端页面。页面上填写shell脚本的参数,点击发布,查看日志,查看容器,停止容器,重启容器等操作。

但是gitlab的webhook如何触发java自动构建是个问题。

后来发现有个gitlab runner可以触发命令,后期可以研究下。

 

此处先贴出shell脚本:清除旧的构建、构建、回滚。

#镜像名称
IMAGE_NAME=$1
#容器名称
CONTAINER_NAME=$2
#端口映射(9500:9000)
PORT=$3
#语言类型(java or vue)
LANG=$4
#日志路径夹
logs_path="logs/"
#日志名称
log_name=$5
#日志路径
log_path=$logs_path$log_name

function deploy(){

    echo "=======================删除旧容器======================="
    t=`sudo docker ps -a | grep $1|awk '{print  $1}'|sed 's/%//g'`;
    if [ $t ];
    then
    sudo docker stop  $t
    echo "停止容器成功"
    sudo docker rm $t
    echo "删除容器成功"
    fi

    echo "=======================删除无用镜像======================="
    docker images|grep none|awk '{print $3}'|xargs docker rmi

    echo "=================删除多余tag,保留最新三个================"
    tagnum=`git tag | wc -l`;
    tag=(`git tag`)
    a=0;
    echo "当前tag数目为:" $tagnum "个"
    until [ $tagnum -lt 3 ]
    do
       echo $a 准备删除tag:${tag[$a]}
       git tag -d ${tag[$a]}
       echo "=======================本地删除成功======================="
       git push $2 :refs/tags/${tag[$a]}
       echo "=======================远程删除成功======================="
       a=`expr $a + 1`
       tagnum=`expr $tagnum - 1`
    done

}

function build(){

    if [ $1 = java ];then

        echo "=======================jar包打包开始======================="
        mvn package  -DskipTests
        echo "=======================jar包打包完成======================="

        echo "====================docker镜像打包开始"===================="
        mvn dockerfile:build
        echo "====================docker镜像打包完成"===================="

    else

        echo "=======================vue打包开始======================="
        sudo /usr/local/bin/npm install
        sudo /usr/local/bin/npm run build
        echo "=======================vue打包完成======================="

        echo "====================docker镜像打包开始"===================="
        sudo docker build -t $2 .
        echo "====================docker镜像打包完成"===================="

    fi

    echo '=================开始推送镜像到docker私服=================='
    sudo docker push $2
    echo '========================推送镜像完成======================='

    echo '=======================删除旧的构建========================'
#    deploy $2 $4 >> $5 2>&1
    echo '======================旧的构建删除成功===================='

    echo '=======================容器运行开始========================'
    sudo docker run -d --name $4 -p:$3 $2
    sudo docker ps | grep $2
    echo '=======================容器运行完成========================'
    #port=($3//:/ )
    #echo 访问路径为:`ifconfig ens192 | grep "inet" | awk '{ print $2}' | awk -F: '{print $1}' | grep 192`:${port[0]}

}

function rollback(){

    echo "====================================开始执行回滚===================================="

    echo '=======================删除旧的构建========================'
        deploy $2 $4 >> $5 2>&1
        echo '======================旧的构建删除成功===================='

    tag=(`git tag`)
    echo "检测到的git tag版本为:" ${tag[*]}

    maxtag=(${tag[0]//_/ })
    maxnum=${maxtag[1]}

    for i in ${!tag[*]};do
        nexttag=(${tag[$i]//_/ })
        nextnum=${nexttag[1]}

        if [[ $maxnum -lt $nextnum ]];then
            maxnum=$nextnum
        fi
    done
    echo "检测到最新的git tag版本为:" rc_$maxnum 
    echo "拉取上一次构建成功的tag代码"
    
    if [ `git checkout rc_$maxnum` ];then
        echo "拉取代码失败,请手动选择代码构建"
    else
        echo "拉取代码成功"
    fi
    build $1 $2 $3 $4
}



mkdir logs
echo '创建日志文件成功' >> $log_path 2>&1
echo `date` >> $log_path 2>&1
echo "开始构建" >> $log_path 2>&1
build $LANG $IMAGE_NAME $PORT $CONTAINER_NAME $log_path >> $log_path 2>&1
resule=`sudo docker ps | grep pig-ui|awk '{print  $1}'|sed 's/%//g'`
if [ $resule != '' ];then
    echo "构建成功"
else
    echo "回滚"
    rollback $LANG $IMAGE_NAME $PORT $CONTAINER_NAME $log_path >> $log_path 2>&1
fi

 

转载于:https://www.cnblogs.com/jxd283465/p/11589193.html

你可能感兴趣的:(【linux】【jenkins】jenkins构建、mvn或者npm打包、docker运行、失败自动回滚脚本)