# dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器

环境centos 7.4 docker 18.03.0-ce

nuxus,创建maven本地源(可选,编译java时下载jar依赖包)

maven,编译打包java web为war包

jenkins,自动化构建、发布等

jenkins容器里不能执行docker命令,用ssh远程方式

jenkins容器 -> ssh -> maven编译java web -> 构建docker镜像,war包+tomcat

war包+tomcat重新构建镜像,即可运行java web

##############################

# Nexus仓库(基于Docker)

 #下载镜像
docker pull sonatype/nexus3 #data目录设置
mkdir -p /docker/cicd/nexus-data
chown -R 200 /docker/cicd/nexus-data #运行nuxus容器
docker rm -f nexus
docker run -dit -p 8081:8081 --name nexus \
-v /etc/localtime:/etc/localtime:ro \
-v /docker/cicd/nexus-data:/nexus-data \
--restart=always sonatype/nexus3 #查看
docker ps -l
docker logs nexus #浏览器打开,右上角->Sign in ,初始账户admin admin123 #配置阿里maven源加快下载
#新建maven2(proxy)源
#或直接更改maven-central,原地址 https://repo1.maven.org/maven2/
#阿里源地址 http://maven.aliyun.com/nexus/content/groups/public/

##############################

# maven容器编译java

 #下载镜像
docker pull maven:alpine #配置maven使用私有仓库(使用上面搭建的nuxus)
#ip地址为neuxs的10.2.1.18为内网地址
mkdir -p /docker/cicd/maven-data
cd cd /docker/cicd
cat > /docker/cicd/maven-settings.xml<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>elven-maven</id>
<name>elven-maven</name>
<url>http://10.2.1.18:8081/repository/maven-public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<localRepository>/repository</localRepository>
</settings>
EOF

maven容器编译java测试

 #下载源码(我写的hello world测试)
mkdir -p /docker/cicd/git
cd /docker/cicd/git
git clone https://gitee.com/almi/helloworld.git #运行maven容器构建war包测试
docker run --rm \
-v /etc/localtime:/etc/localtime:ro \
-v /docker/cicd/maven-settings.xml:/usr/share/maven/conf/settings.xml \
-v /docker/cicd/maven-data:/repository \
-v /docker/cicd/git:/git \
maven:alpine \
mvn clean package -f /git/helloworld/pom.xml #查看
ls -l /docker/cicd/git/helloworld/target/ #如上maven容器构建war,是挂载本地源码目录到maven容器编译war包
#另一种方式,构建docker镜像时调用maven编译,然后创建容器拷贝出war包

##############################

# jenkins容器

 #下载镜像
docker pull jenkins:alpine #data目录设置
mkdir -p /docker/cicd/jenkins-data
cd /docker/cicd
cat > /docker/cicd/jenkins-data/log.properties <<EOF
handlers=java.util.logging.ConsoleHandler
jenkins.level=FINEST
java.util.logging.ConsoleHandler.level=FINEST
EOF
#目录权限为1000
chown -R 1000:1000 /docker/cicd/jenkins-data #启动jenkins容器
docker rm -f jenkins
docker run --name jenkins -dit \
-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
-v /etc/localtime:/etc/localtime:ro \
-v /docker/cicd/jenkins-data:/var/jenkins_home \
--restart=always -p 8082:8080 jenkins:alpine #查看
docker ps -l
docker logs jenkins #查看初始密码
cat /docker/cicd/jenkins-data/secrets/initialAdminPassword #浏览器登录,安装插件

# jenkins构建运行java web的docker容器

步骤:jenkins -> git拉源码 -> 构建war包 -> docker镜像 -> 运行

jenkins容器无法直接运行宿主机docker命令,可使用ssh远程方式

  • 1、安装Publish Over SSH插件

    系统管理 -> 插件管理 -> 可选插件,搜索Publish Over SSH 安装

  • 2、配置ssh主机

    系统管理 -> 系统设置 -> Publish Over SSH标签配置,添加SSH Servers主机

    可使用秘钥或密码认证,Test Configuration是否配置成功

    Path to key可以这样/root/.ssh/id_dsa

    Hostname使用ip地址, Username 登录用户如 root

#创建构建

创建一个自由风格的软件项目 ->

源码管理 -> git -> https://gitee.com/almi/helloworld.git

增加构建后操作步骤——Send build artifacts over SSH

Exec command:在目标主机执行的shell命令

执行的shell如下

env Gitdir=${JOB_NAME}  bash /docker/cicd/jenkins-data/workspace/${JOB_NAME}/build.sh

build.sh的shell内容如下:

#!/bin/bash
Gitdir=${Gitdir:-helloworld}
#
echo 'docker run maven --------'
docker run --rm \
-v /docker/cicd/maven-settings.xml:/usr/share/maven/conf/settings.xml \
-v /docker/cicd/maven-data:/repository \
-v /docker/cicd/jenkins-data/workspace/:/git/ \
maven:alpine \
mvn clean package -f /git/$Gitdir/pom.xml
#
echo 'docker build --------'
cd /docker/cicd/jenkins-data/workspace/$Gitdir
docker build -t helloworld .
docker images helloworld
#
echo "docker run helloworld --------"
docker rm -f helloworld
sleep 1
[[ `netstat -lntp |grep 8090 |wc -l` -ge 1 ]] && { echo "Port 8090 is used";exit; }
docker run -dit --name helloworld -p 8090:8080 helloworld
[[ -n `docker ps |awk '/8090/{print $1}'` ]] && { echo "run helloworld successful"; } || { echo "run helloworld error"; }
docker ps -l
#立即构建->打开构建,Console Output控制台,查看日志

#构建完成后,浏览器打开ip:8090看到Hello World ! 页面即构建成功

  #jenkins还有更多实用功能如web钩子、定时任务、邮件通知等……

最新文章

  1. [(ngModel)]的实现原理
  2. Google 地图 API V3 之 叠加层
  3. Sum of Two integers
  4. 【循序渐进学Python】5.Python常用流程控制及其他语句
  5. 《ASP.NET MVC4 WEB编程》学习笔记------HtmlHelper
  6. Fluentd 例子
  7. 最简单的视音频播放示例9:SDL2播放PCM
  8. [转]一步步教你如何在 Visual Studio 2013 上使用 Github
  9. &lt;Error&gt;: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
  10. 【形式化方法:VDM++系列】1.前言
  11. Android开源项目分类汇总[转]
  12. Linux C 调用MYSQL API 函数mysql_escape_string()转义插入数据
  13. java替换字符串和用indexof查找字符
  14. Python: 作图
  15. 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)
  16. vue中提示$index is not defined
  17. tyvj/joyoi 1043 表达式计算4
  18. windows程序设计 MessageBox消息框
  19. mysql中左连接后,最终的记录数大于左边表的记录分析
  20. 大数据 - spark-sql 常用命令

热门文章

  1. shell:正则表达式和文本处理器
  2. PHP 页面跳转到另一个页面的多种方法方法总结
  3. A Neural Algorithm of Artistic Style 图像风格转换 - keras简化版实现
  4. 使用poi根据模版生成word文档,支持插入数据和图片
  5. CodeForces 909E Coprocessor(无脑拓扑排序)
  6. JavaScript 随机数相关算法
  7. Diango + uwsgi + nginx 项目部署(可外网访问)
  8. [SCOI2009]生日快乐
  9. hdu 5868 Polya计数
  10. 4455[Zjoi2016]小星星 容斥+dp