jenkins配合dockerfile部署项⽬前⾔
本节需要对jenkinsfile有点了解,对dockerfile有点了解,对shell有点了解,对docker有点了解
执⾏流程
docker打包镜像1. jenkins拉取代码仓库中的代码
2. jenkins执⾏jenkinsfile⽂件(可指定⽂件名)
3. 先在jenkins所在的服务器将拉取的项⽬build成docker镜像
4. 将镜像发布到镜像仓库(我这⾥是腾讯云配置的私有仓库)
5. 在应⽤服务器的节点上将该镜像拉取下来(私有仓库需要⽤户名/密码)
6. 在应⽤服务器上执⾏该镜像
⼀、jenkins配置
创建⼀个Pipeline SCM项⽬ jenkins项⽬名为springboot-test (和发布的⼯程名保持⼀致)
Definition选择【Pipeline Script from SCM】
Branch Specifier(blank for 'any'):选择分⽀
Additional Behaviours:添加邮箱通知的发送者【这⾥没有写】
Script Path: 填写使⽤项⽬中的Jenkinsfile⽂件的名字
⼆、应⽤⼯程配置
在⼯程的根⽬录下创建Dockerfile⽂件和Jenkins_docker⽂件
jenkinsfile_docker⽂件内容如下
// docker集成docker部署
pipeline {
agent {label 'master'}
tools{
maven 'maven'
}
environment {
GIT_PROJECT_ADDR="git@gitee:uncleqiao/springboot-test.git" //项⽬的git地址
JENKINS_WORKSPACE="/root/.jenkins/workspace"    //jenkins存放⽂件的地址
PROJECT_NAME="${JOB_NAME}"            // 项⽬名
JAR_NAME="springboot-test-0.0.1-SNAPSHOT.jar"  // 项⽬⽣成的jar的名字
IMAGE_NAME="springboot-test"                    // 镜像名⼀般和项⽬名相同
IMAGE_ADDR="tyun/qiao_namespace/${IMAGE_NAME}"    // 镜像的位置
VERSION_ID="${BUILD_ID}"
}
stages {
stage('pullCode'){
steps{
echo 'This is a pullCode step'
//git branch: "${BRANCH}", credentialsId: '1001', url: "${GIT_PROJECT_ADDR}"
checkout scm
}
}
stage('Build') {
steps{
echo 'This is a Build step'
/
/ 在有Jenkinsfile同⼀个⽬录下(项⽬的根⽬录下)
sh 'mvn clean package -st.skip=true'
}
}
// 创建⽬录(如果不存在),并把jar⽂件上传到该⽬录下
stage('ssh') {
steps{
echo 'push jar to target server'
sh '''
ole_image_id=`docker images|grep ${IMAGE_NAME}|grep ${VERSION_ID}|awk '{print $3}'`
if [[ -n "${ole_image_id}" ]]; then
docker rmi -f ${ole_image_id}
fi
docker build -f Dockerfile --build-arg jar_name=${JAR_NAME} -t ${IMAGE_NAME}:${VERSION_ID} .
new_image_id=`docker images|grep ${IMAGE_NAME}|grep ${VERSION_ID}|awk '{print $3}'`
sudo docker tag ${new_image_id} ${IMAGE_ADDR}:${VERSION_ID}
sudo docker push ${IMAGE_ADDR}:${VERSION_ID}
'''
}
}
stage('run') {
// 在应⽤服务器节点 test
agent {
node {
label 'test'
//customWorkspace "${SERVER_TARGET_PATH}"  //此参数会初始化⽬录注意填写
}
}
options {
// 不让它切换到节点上⾃动从仓库拉取项⽬
skipDefaultCheckout()
}
steps {
echo 'pull image and docker run'
withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) {
sh '''
sudo docker login --username=yourusername --password=s.tencentyun
sudo docker pull ${IMAGE_ADDR}:${VERSION_ID}
container_id=`docker ps|grep ${IMAGE_ADDR}:${VERSION_ID}|awk '{print $1}'`
if [ -n "${container_id}" ]; then
docker rm -f "${container_id}"
fi
old_pid=`ps -ef|grep ${JAR_NAME}|grep -v grep|awk '{print $2}'`
if [[ -n $old_pid ]]; then
kill -9 $old_pid
fi
old_image=`docker images|grep ${IMAGE_ADDR}|grep ${VERSION_ID}`
if [[ -n $old_image ]]; then
old_image_id=`echo ${old_image}|awk '{print $3}'`
docker rmi -f ${old_image_id}
fi
sudo docker run --name "${PROJECT_NAME}_${VERSION_ID}" -p 9001:8081 -d ${IMAGE_ADDR}:${VERSION_ID}
'''
}
}
}
}
}
注意:
if [ -n str ] 这个命令在使⽤的时候如果str为空,也是true,可以使⽤if [ -n ${str} -a "${str}x" != "x" ]或者使⽤if [[ -n ${str} ]]来判断shell语法中,$()` 和 `` (两个单引号) 可以在⼦shell中执⾏命令,但是这⼉$()不⽀持
idea没有jenkinsfile的语法提⽰,很容易出错,这个很难受
步骤⼀:拉取项⽬在【pullCode】步骤中
checkout scm ,这个scm是创建jenkins流⽔线时选择的,属于特殊变量,代表了你的仓库信息,⾃动从仓库中获取项⽬
步骤⼆:【Build】
将拉取下来的项⽬进⾏编译并打包
步骤三:【build_image】将打包好的项⽬build成docker镜像,然后推送到镜像仓库(这⾥可以分成两步)
# 获取已经存在的镜像
ole_image_id=`docker images|grep ${IMAGE_NAME}|grep ${VERSION_ID}|awk '{print $3}'`
# 删掉存在的镜像
if [[ -n "${ole_image_id}" ]]; then
docker rmi -f ${ole_image_id}
fi
# 通过项⽬根⽬录下的Dokcerfile来构建镜像 -f filename --build-arg <key=value> 给Dockerfile传递参数
# -t 镜像的名称:版本这⾥我将jenkins的构建次数当作镜像的版本
docker build -f Dockerfile --build-arg jar_name=${JAR_NAME} -t ${IMAGE_NAME}:${VERSION_ID} .
# 获取构建好的镜像的id
new_image_id=`docker images|grep ${IMAGE_NAME}|grep ${VERSION_ID}|awk '{print $3}'`
# 根据⽣成的镜像,tag出⼀个名称空间不同的镜像(腾讯云能识别的镜像)
sudo docker tag ${new_image_id} tyun/qiao_namespace/${IMAGE_NAME}:${VERSION_ID}
# 将镜像仓库能够试别的镜像推送到仓库
sudo docker s.tencentyun/qiao_namespace/${IMAGE_NAME}:${VERSION_ID}
步骤四:【run】应⽤服务器拉取项⽬并且运⾏,这⼀步要选择节点(应⽤服务器,如果是集,就不⽤节点⽤scp登陆吧) # 登陆到镜像仓库
sudo docker login --username=yourusername --password=s.tencentyun
# 从仓库中拉取刚才⽣成的镜像
sudo docker s.tencentyun/qiao_namespace/${IMAGE_NAME}:${VERSION_ID}
# 查看已经存在的容器,存在则删掉存在则删掉这⾥应该是⼀个数组,有点⼩问题,待修改
container_id=`docker ps|grep ${IMAGE_ADDR}:${VERSION_ID}|awk '{print $1}'`
if [ -n "${container_id}" ]; then
docker rm -f "${container_id}"
fi
# 查看已经运⾏的同版本的项⽬,存在则删掉这⾥应该是⼀个数组,有点⼩问题,待修改
pid=`ps -ef|grep ${JAR_NAME}|grep -v grep|awk '{print $2}'`
if [[ -n $pid ]]; then
kill -9 $pid
fi
# 查看已经存在的镜像,存在则删掉这⾥应该是⼀个数组,有点⼩问题,待修改
old_image=`docker images|grep ${IMAGE_ADDR}|grep ${VERSION_ID}`
if [[ -n $old_image ]]; then
old_image_id=`echo ${old_image}|awk '{print $3}'`
docker rmi -f ${old_image_id}
fi
# 运⾏容器
sudo docker run --name "${PROJECT_NAME}_${VERSION_ID}" -p 9001:8081 -d ${IMAGE_ADDR}:${VERSION_ID}
Dockerfile
⽂件内容如下
s.tencentyun/qiao_namespace/myjdk8:v1
# 默认jar包的名字注意分隔符为 :-  这⾥是由jenkinsfile中build dockerfile时传递过来的
ARG jar_name={jar_name:-springboot-test-0.0.1-SNAPSHOT.jar}
# RUN ⽤于容器内部执⾏命令
RUN mkdir -p /usr/local/project
WORKDIR /usr/local/project
# 将项⽬放到/usr/local/project下
COPY ./target/springboot-test-0.0.1-SNAPSHOT.jar ./
EXPOSE 8081
CMD java -jar -Dserver.port=8081 springboot-test-0.0.1-SNAPSHOT.jar
执⾏完毕后我们登陆到应⽤服务器
看到容器已经启动,docker exec 进⼊到容器看到⽂件是存在的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。