镜像说明
镜像ponylee/jenkins-centos7:v1.0基于jenkins/jenkins:lts-centos7-jdk8, 添加 git maven jdk8 等java部署常用的工具。同时改变运行用户jenkins为root,放大权限。
启动jenkins
- host mode
docker run -d \
--network host \
-v /data/jenkins/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
--name jenkins \
ponylee/jenkins-centos7:v1.0
- bridge mode
docker run -d \
-p 8080:8080 \
-p 50000:50000 \
-v /data/jenkins/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
--name jenkins \
ponylee/jenkins-centos7:v1.0
jenkins配置
用到的plugins: Publish Over SSH、SSH plugin、Maven Integration、Date Parameter、和 jenkins社区推荐的插件
General
时间参数配置
依赖Date Parameter插件
选择参数配置
选丢弃旧的构建
源码管理
Repositories 配置
git Credentials 配置
- 生成秘钥
ssh-keygen -t rsa -C "xxx@xx.com" #邮箱
git config --global user.name xxx
git config --global user.email xxx@xx.com
ssh -vT xx.github.com #验证联通性
cd ~/.ssh/
cat ~/.ssh/id_rsa.pub | clip #复制公钥
- 上传公钥
- 配置Credentials
Manage Jenkins -> Manage Credentials -> 全局凭据 ->添加凭据
build
Post Steps
Send files or execute commands over SSH
Publish over SSH 配置
Manage Jenkins -> Configure System -> Publish over SSH
Execute shell script on remote host using ssh
SSH site 配置
Manage Jenkins -> Configure System -> SSH remote hosts
SSH remote hosts Credentials配置
Manage Jenkins -> Manage Credentials -> 全局凭据 ->添加凭据
build.sh脚本
构建docker 镜像并推送到镜像私服
#!/bin/bash
#build.sh
function deploy(){
if (( $# < 2 )) ;then
echo "Please specify images version date parameters and project . eg: [20221215150431] [xx-backend-service1|xx-backend-service2]"
exit;
fi
IMAGE_VERSION=v${1}
PROJECT=${2}
#DATE=$(date '+%Y%m%d%H%M%S')
IMAGE="xx.xx.xx.xx:5000/${PROJECT}:$IMAGE_VERSION"
echo "docker build -t $IMAGE ."
docker build -t "${IMAGE}" .
echo "push ${IMAGE} ... "
docker push $IMAGE
echo "push success!"
mv *.jar ../jars/${PROJECT}-${1}.jar
echo "backup jar success!"
}
function rollback(){
rm -f *.jar
}
function printUsage(){
echo -e "Usage: [deploy|rollback] [20221215150431] [xx-backend-service1|xx-backend-service2]"
}
case "$1" in
(deploy)
deploy $2 $3
;;
(rollback)
rollback
;;
(*)
printUsage
exit 1
;;
esac
Dockerfile
From anapsix/alpine-java
VOLUME /tmp
ADD *.jar app.jar
RUN sh -c 'touch /app.jar'
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV JAVA_OPTS="-Xms2g -Xmx2g"
#ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
CMD exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
xx-start.sh 启动脚本
#!/bin/bash
function deploy() {
if (( $# < 2 )) ;then
echo "Please specify images version date parameters and project . eg: [20221215150431] [xx-backend-service1|xx-backend-service2]"
exit;
fi
IMAGE_VERSION=v${1}
PROJECT=${2}
NEW_IMAGE=xx.xx.xx.xx:5000/${PROJECT}:$IMAGE_VERSION
echo "即将部署镜像: $NEW_IMAGE"
LAST_CONTAINER=$(sudo docker ps -a | grep ${PROJECT} | awk '{print $1}')
#LAST_IMAGE=$(sudo docker images -a | grep ${PROJECT} | awk '{print $3}')
echo "docker pull $NEW_IMAGE"
docker pull $NEW_IMAGE
if [ $? -eq 0 ]; then
echo "镜像下载完毕"
else
echo "镜像下载失败,停止部署!"
exit
fi
echo $LAST_CONTAINER
#echo $LAST_IMAGE
# stop the previous image and remove it
if [ -n "${LAST_CONTAINER}" ]; then
docker stop $LAST_CONTAINER
docker rm $LAST_CONTAINER
fi
echo "开始启动${PROJECT}服务 ..."
if [[ $PROJECT =~ "service1" ]]
then
docker run -d \
-v /etc/localtime:/etc/localtime \
-v /data/log:/var/log \
-p 8080:8080\
--name=${PROJECT} \
--restart=always \
"$NEW_IMAGE" #sleep 100000
else
docker run -d \
-p 8080:8080\
--restart=always \
--name=${PROJECT} \
-v /data/log:/var/log \
-v /etc/localtime:/etc/localtime \
$NEW_IMAGE
fi
echo "服务${PROJECT}启动完成!"
#if [ -n "${LAST_IMAGE}" ]; then
# sudo docker rmi -f $LAST_IMAGE
#fi
}
function rollback() {
if (( $# < 1 )) ;then
echo "Please specify project . eg:[xx-backend-service1|xx-backend-service2]"
exit;
fi
PROJECT=${1}
CNT=`docker images | grep ${PROJECT} | wc -l`
if (( $CNT < 2 ))
then
echo "已经是最初的版本,已经没有版本可以回滚!!!"
exit;
fi
#start kill container
LAST_CONTAINER=$(sudo docker ps -a | grep ${PROJECT} | awk '{print $1}')
echo $LAST_CONTAINER
# stop the previous image and remove it
if [ -n "${LAST_CONTAINER}" ]; then
docker stop $LAST_CONTAINER
docker rm $LAST_CONTAINER
fi
# kill container end
docker images | grep ${PROJECT} | awk 'NR==1{print $3}' | xargs docker rmi -f
REPOSITORY=`docker images | grep ${PROJECT} | awk 'NR==1{print $1}'`
TAG=`docker images | grep ${PROJECT} | awk 'NR==1{print $2}'`
OLD_IMAGE=${REPOSITORY}:${TAG}
echo "即将回滚镜像至: $OLD_IMAGE"
echo "开始回滾${PROJECT}服务 ..."
if [[ $PROJECT =~ "service1" ]]
then
docker run -d \
-v /etc/localtime:/etc/localtime \
-v /data/log:/var/log \
-p 8080:8080 \
--name=${PROJECT} \
--restart=always \
${OLD_IMAGE} #sleep 100000 test
else
docker run -d \
-p 8080:8080\
--restart=always \
--name=${PROJECT} \
-v /data/log:/var/log \
-v /etc/localtime:/etc/localtime \
${OLD_IMAGE}
fi
echo "服务${PROJECT}回滚完成!"
}
function printUsage(){
echo -e "Usage: [deploy|rollback] [20221215150431] [xx-backend-service1|xx-backend-service2]"
}
case "$1" in
(deploy)
deploy $2 $3
;;
(rollback)
rollback $3
;;
(*)
printUsage
exit 1
;;
esac
jenkins 部署
版本可以一直回滚到最后一个发布版本。