前言

本节需要对jenkinsfile有点了解,对dockerfile有点了解,对shell有点了解,对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.com: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="ccr.ccs.tencentyun.com/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 -Dmaven.test.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=yourpassword ccr.ccs.tencentyun.com
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} ccr.ccs.tencentyun.com/qiao_namespace/${IMAGE_NAME}:${VERSION_ID} # 将镜像仓库能够试别的镜像推送到仓库
sudo docker push ccr.ccs.tencentyun.com/qiao_namespace/${IMAGE_NAME}:${VERSION_ID}

步骤四:【run】应用服务器拉取项目并且运行, 这一步要选择节点(应用服务器,如果是集群,就不用节点用scp登陆吧)

# 登陆到镜像仓库
sudo docker login --username=yourusername --password=yourpassword ccr.ccs.tencentyun.com
# 从仓库中拉取刚才生成的镜像
sudo docker pull ccr.ccs.tencentyun.com/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

文件内容如下

FROM ccr.ccs.tencentyun.com/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 进入到容器看到文件是存在的

jenkins配合dockerfile部署项目的更多相关文章

  1. docker | jenkins 实现自动化部署项目,后端躺着把运维的钱挣了!(上)

    前言 背景 最近在帮学校导师写项目,团队有4个人,项目前后端分离.如果是选择瀑布式开发:(在约定好接口的情况下)A.B同学写前端,C.D同学写后端,然后约定一个时间统一联调,最后将项目交付安装到客户机 ...

  2. 使用jenkins 插件自动部署项目至tomcat

    前面使用maven.ant编译项目就不说,只说一下使用jenkins的插件自动部署项目 1.首先jenkins安装插件Deploy to container Plugin ,下载地址为:https:/ ...

  3. springboot+Jenkins+docker-compose自动部署项目实践

    DevOps思想 一个开发.测试.运维的整个过程的思想. plan:需求.计划 code:编码 build:构建 test: 测试 release:发布版本 deploy:部署 operate:项目运 ...

  4. jenkins自动打包部署项目

    首先去jenkins的官网下载安装包 https://jenkins.io/   个人下载是长期稳定的那个版本,下载后,得到一个.msi的安装包: 点击进行安装,然后一直点击下一步. jenkins会 ...

  5. 使用 IDEA 配合 Dockerfile 部署 SpringBoot 工程

    准备 SpringBoot 工程 新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestController public class ...

  6. 利用jenkins+saltstack+sh部署项目到多台服务器

    jenkins的配置(这里作用只是当做界面使用,利用它来管理执行salt命令,这里以 shop.51ekt.com 这个项目目录为例) 1.利用参数化构建项目,来实现是发布还是回滚操作: 2.构建操作 ...

  7. Jenkins~配合Docker及dotnetCore进行生产和测试环境的灵活部署

    回到目录 首先要清楚本文是讲dotnetcore项目在生产和测试环境部署的,这在过去的frameworks项目里,我们可以通过设置web.config的环境变量,然后再发布时指定具体的变量,去实现生产 ...

  8. k8s+Jenkins+GitLab-自动化部署项目

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 此文阅读目录: 1.闲聊 ...

  9. jenkins+git+maven搭建自动化部署项目环境

    简介    折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...

随机推荐

  1. dinoql 使用nodejs 运行的几个问题

    dinoql 是一个很不错的javascript objects 查询处理方案,基于graphql,当前版本有点问题 node 环境运行 ReferenceError: window is not d ...

  2. 使用git_stats 统计分析git 仓库代码&& 集成webhook

      前几天写过一个使用gitstats 统计分析代码的,但是那个因为开发的问题,对于直接和容器集成是有问题的,统计需要进入容器执行 命令,对于自动构建的还不是很方便,所以使用了git_stats 项目 ...

  3. Nginx 和 PHP 和 mysql扩展的安装

    1.nginx 安装 2.php的安装 3.php的扩展mysql的安装

  4. cyyz: Day 4 网络流整理

    Day 4 网络流的理论性知识(算了..我自己都看不下去,还是整理些例题以后复习用吧qaq): 一.PPT(主要内容)   二.搜自度娘 定义: 年,L.R. 福特和 D.R. 富尔克森等人给出了解决 ...

  5. P2210 Haywire

    P2210 Haywire 模拟退火练手题 #include<cmath> #include<ctime> #include<cstdio> #include< ...

  6. Pollard-Rho算法求大数质因子

    /* * 大整数分解到现在都是世界级的难题,但却是一个重要的研究方向,大整数在公共密钥的研究上有着重要的作用 * Pollard Rho算法的原理就是通过某种方法得到两个整数a和b.而待分解的大整数为 ...

  7. Python配置环境变量

    Python安装完成之后,运行cmd(win+R): 在控制台中输入Python,若安装完成,会在控制台中打开Python:   如果Python未添加至环境变量,则会提示"python不是 ...

  8. 仿站技术——获取和使用某些网站的iconfont图标字体

    前言: 很多前端新手在仿一些大型网站的时候经常遇到一个问题:该网站使用了图标字体——iconfont,虽然现在阿里有开源的iconfont库,但是还是没有原网站的效果(本人强迫症但非处女座).所以此文 ...

  9. AudioManager: android插上耳机仍然使用扬声器播放音频

    手机音频的输出有外放(Speaker).听筒(Telephone Receiver).有线耳机(WiredHeadset).蓝牙音箱(Bluetooth A2DP)等输出设备.在平时,电话免提.插拔耳 ...

  10. Python将print输出内容保存到指定文件中

    #!/usr/bin/python # -*- coding: utf- -*- import sys import os class Logger(object): def __init__(sel ...