分享下怎么使用jenkins 发布 docker
 
首先准备docker的相关部分
docker tomcat基础镜像,这边使用centos7做系统,dockerfile如下:
#tomcat基础镜像
#我这边先把tomcat 各项配置好了,然后重新打包,传入docker,tomcat的数据目录设置在 /data/www 下 ,机器上先装了JDK
FROM centos:
MAINTAINER www.cnblogs.com/fanpiao ENV VERSION=8.5.
ENV JAVA_HOME /usr/local/jdk WORKDIR /usr/local/
ADD apache-tomcat-${VERSION}.tar.gz . RUN mv apache-tomcat-${VERSION} tomcat && \
rm -rf apache-tomcat-${VERSION}.tar.gz && \
yum install -y unzip && \
mkdir -p /data/www #ENV PATH $PATH:/usr/local/tomcat/bin
#WORKDIR /usr/local/tomcat
#EXPOSE
#CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
打包成镜像,并上传到容器仓库
#可以和我一样使用阿里云提供的容器镜像服务,免费的

上传完成后备用
 
#jenkins pipeline 脚本准备
node {
def JAVA_HOME = tool 'jdk'
env.PATH = "${JAVA_HOME}/bin:${env.PATH}" stage('拉取代码') {
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'http://svn.yin.cn/repos/${version}/project']], quietOperation: false, workspaceUpdater: [$class: 'UpdateUpdater']])
} stage('构建') {
if ("${Status}"== 'Deploy') {
echo "JDK: ${JAVA_HOME}"
sh "/usr/local/maven/bin/mvn clean install -pl $module -am -U -Dmaven.test.skip=true"
echo '需要构建'
} else {
echo '不需要构建'
}
} def web_name = "${JOB_NAME}" stage('Status判断') {
if ("${Status}"== 'Deploy') {
jar_file = sh (
script: 'find $WORKSPACE/$module/target -name *.war',
returnStdout: true
).trim()
sh 'mkdir -p $WORKSPACE/bak/$BUILD_ID'
sh "(cp -a '${jar_file}' $WORKSPACE/bak/$BUILD_ID)"
echo '部署'
} else {
jar_file = sh (
script: 'find $WORKSPACE/bak/$Rollback_tag -name *.war',
returnStdout: true
).trim()
echo '回滚'
}
} war_file_name = sh (
script: "(basename '${jar_file}')",
returnStdout: true
).trim() config_file_name = sh (
script: 'basename ${config_file}',
returnStdout: true
).trim() old_BUILD_NUMBER = sh (
script: "(awk 'BEGIN{print '${BUILD_NUMBER}' - 1 }')",
returnStdout: true
).trim() stage('打印部署参数') {
echo "jar_file: ${jar_file}"
echo "war_file_name: ${war_file_name}"
echo "config_file: ${config_file}"
echo "config_file_name: ${config_file_name}"
echo "job_name: ${web_name}"
echo "old_BUILD_NUMBER: ${old_BUILD_NUMBER}"
echo "JDK: ${JAVA_HOME}"
} stage('构建镜像') {
if ("${Status}"== 'Deploy') {
REPOSITORY="registry.cn-beij.aliyuncs.com/service/${web_name}:${BUILD_NUMBER}"
sh """
mkdir -p dockerfile
cd dockerfile
yes|cp -a $config_file/log4j2.xml .
#yes|cp -a $config_file/config.properties .
yes|cp -a ${jar_file} . cat > Dockerfile << EOF
FROM registry.cn-beij.aliyuncs.com/basis/tomcat:v7
COPY ${war_file_name} /tmp
RUN unzip -oq /tmp/${war_file_name} -d /data/www/ && \
rm -rf /tmp/${war_file_name}
COPY log4j2.xml /data/www/WEB-INF/classes/log4j2.xml
#COPY config.properties /data/www/WEB-INF/classes/config.properties
EXPOSE
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
docker push $REPOSITORY
docker image rm $REPOSITORY |true
"""
}
else {
REPOSITORY="registry.cn-beij.aliyuncs.com/service/${web_name}:${Rollback_tag}"
echo "无需构建镜像直接回滚"
}
} stage('部署') {
sh "/usr/bin/ansible-playbook /etc/ansible/playbook/docker-deploy.yaml -f 5 -e host=${host} -e REPOSITORY=${REPOSITORY} -e docker_name=${web_name} -e run_port=${run_port}"
} }

ansbile-playbook准备,ansbile ,host主机的配置请自己先配置

---
- hosts: '{{ host }}'
remote_user: java
gather_facts: false
vars:
REPOSITORY: '{{ REPOSITORY }}'
docker_name: '{{ web_name }}'
run_port: '{{ run_port }}'
tasks:
#下载镜像
- name: "Download images"
shell: docker pull {{ REPOSITORY }}
#删除在运行的旧容器
- name: "rm container"
shell: docker rm -f {{ docker_name }} | true
#启动容器
- name: "run container"
#shell: docker run -d -p {{ run_port }}: -v /usr/local/jdk:/usr/local/jdk -v /etc/localtime:/etc/localtime:ro --name {{ docker_name }} {{ REPOSITORY }}
shell: docker run -d -p {{ run_port }}: \
-v /usr/local/jdk:/usr/local/jdk \
-v /data/logs/Blockchain:/data/logs/Blockchain \
-v /data/logs/tomcatlogs/{{ docker_name }}:/usr/local/tomcat/logs \
-v /etc/localtime:/etc/localtime:ro \
--name {{ docker_name }} {{ REPOSITORY }}
register: result
#打印启动命令
- name: "print information"
debug: msg={{ result.cmd }}
~

jenkisn 的配置,需要如下设置如下参数

在流水线这里配置上刚才准备的 jenkins pipeline 脚本

保存后就完成了,效果如下

jenkins docker 发布的更多相关文章

  1. 从0到1体验Jenkins+Docker+Git+Registry实现CI自动化发布

    一.前言 Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件.Jenkins 支持各种运行方式,可通过系统包.Docker 或者通过一个独立的 Java ...

  2. 【linux】【jenkins】自动化运维四 整合gitlab、docker发布java项目

    jenkins发布java项目 过程参考发布vue项目.https://www.cnblogs.com/jxd283465/p/11543431.html 大同小异. vue建立的是Freestyle ...

  3. Jenkins+Harbor+Docker发布

    使用Jenkins发布Docke 需要准备的,docker,jenkins,Harbor docker安装 安装依赖: # yum install -y yum-utils device-mapper ...

  4. jenkins+docker+k8s项目发布

    目录 一.简介 二.新建docker-build工程 三.项目部署 四.访问测试 一.简介 1.该章节基于jenkins.Harbor.pipeline.k8s来做发布,如对这些不熟悉,请按以下进入学 ...

  5. jenkins+docker 持续构建非docker in docker jenkins docker svn maven

    工欲善其事必先利其器,为了解脱程序员的,我们程序员本身发明了很多好用的工具,通过各种工具的组合来达到我们想要的结果 本文采用jenkins docker svn maven作为相关工具,项目sprin ...

  6. jenkins+docker 持续构建非docker in docker

    工欲善其事必先利其器,为了解脱程序员的,我们程序员本身发明了很多好用的工具,通过各种工具的组合来达到我们想要的结果 本文采用jenkins docker svn maven作为相关工具,项目sprin ...

  7. jenkins自动发布java代码

    注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...

  8. 基于 Jenkins+Docker+Git 的CI流程初探

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...

  9. jenkins+docker持续集成实验

    在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署.交付(CD).本文基于Jenkins+Docker+Git实现 ...

随机推荐

  1. git用ssh方式下载和提交代码

    之前git上传下载代码都是用的http方式,但是今天遇到个大文件上传的时候,http方式上传超出大小限制了413 request entity too large,所以改成了用ssh方式上传,简单记录 ...

  2. 手动写一个类支持foreach循环

    之前初学时看过可以实现Iterable接口实现Iterator迭代器的支持,并且也支持foreach循环.现在学习了数据结构,手动写一个单链表支持foreach循环吧. 手写foreach循环步骤: ...

  3. 二分答案 + multiset || NOIP 2018 D1 T3 || Luogu P5021 赛道修建

    题面:P5021 赛道修建 题解:二分答案,用Dfs进行判断,multiset维护. Dfs(x,fa,Lim)用来计算以x为根的子树中有多少符合条件的路径,并返回剩余未使用的最长路径长. 贪心思想很 ...

  4. --set-upstream新版本不在支持

    --set-upstream最新版本貌似不在支持,使用--track和--set-uptream-to来替代 --set-upstream: git branch --set-upstream [本地 ...

  5. 第五章Java

    2 [单选题] 已知MyInterface是一个接口,ClassA是实现该接口的一个类,ClassB是ClassA的子类,则下面说法哪个正确?   A. ClassB obj = new ClassA ...

  6. [uboot] (第三章)uboot流程——uboot-spl代码流程 后续2018版本分析

    board_init_f在/u-boot-2018.07-fmxx/arch/arm/mach-fmxx/spl.c中定义 board_init_f之后,和转载的部分有出入: u-boot-2018. ...

  7. 多线程(三) 同步synchronized

    五.同步 1.锁 多线程程序一般是为了完成一些相同的工作而存在的,因此有时间也会共享一些资源,例如对象.变量等等,此时如果不对各个线程进行资源协调,就会出现一些冲突,从而导致程序功能失效.例如下面的示 ...

  8. pidstat 命令(Linux 进程使用资源情况采样)

    pidstat 作用 pidstat 获取服务器指定进程的使用资源信息(包括 CPU.设备IO.内存.线程.任务切换等). 执行一波 [root@wille ~]# pidstat Linux 2.6 ...

  9. k8sReplicaSet控制器

    一.ReplicaSet概述 简称RS,是pod控制器类型的一种实现,用于确保由其管控的pod对象副本数在任一时刻都能精确满足期望的数量.ReplicaSet控制器资源启动后会查找集群中匹配其标签选择 ...

  10. Python的语句---钱中平

    python中的两种语句:1.if条件控制语句 格式: if: a = int(input("请输入第一个数:"))b = int(input("请输入第二个数:&quo ...