maven私有库神坑之:“Downloading: http://repo.maven.apache.org/maven2/”

现象:

即使你配置了私有库,并且在maven setting.xml中配置了mirror,但是,经常会遇到执行mvn命令的时候,会提醒:
Downloading: http://repo.maven.apache.org/maven2/

原因:

所有自定义pom.xml都是继承自super pom:
http://maven.apache.org/ref/3.0.4/maven-model-builder/super-pom.html

super pom中有如下内容:

 <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

因此,当maven项目需要下载一些metadata、pom、jar的时候,会优先去中央仓库下载,导致内网用户各种报错!

解决办法:

在项目pom.xml中添加如下配置:

<repositories>
    <repository>
        <id>central</id>
        <url>http://host:port/content/groups/public</url>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <url>http://host:port/content/groups/public</url>
    </pluginRepository>
</pluginRepositories>

Jenkins之配置Maven和JDK-yellowcong

系统管理->Global Tool Configuration

未分类

1、配置jdk

#获取到服务器上JAVA_HOME配置的地址
echo $JAVA_HOME

未分类

设置到Jenkins上

未分类

2、配置Maven

echo $M2_HOME
#一般都放到usr/local目录下
#/usr/local/maven/apache-maven-3.5.0

Maven的HOME路径

未分类

路径配置上,完事

未分类

3、安装Maven插件

Maven Integration Plugin 这个插件

未分类

点击直接安装后,结果看到,这个地方有一堆插件,等待这安装,排着队呢

未分类

要是失败了,就会变成红色,这为啥失败,还是国内的网络问题

未分类

全部都挂掉了,这是够了。。

未分类

4、手动安装插件

首先我到网址
http://updates.jenkins-ci.org/download/plugins/
http://mirrors.jenkins-ci.org
中下载了下面几个插件: 所有的插件是以hpi 结尾的,比如 maven-plugin.hpi,这个实在是太坑了网络问题,这个是大坑。

未分类

需要下载依赖包和自己需要安装的包,这个是Maven 3.0的插件

未分类

在插件管理项目下,高级选项,可以直接上传插件

未分类

微服务部署之Maven插件构建Docker镜像

微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上。单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网状分布的,有很多服务需要维护和管理,对它进行部署和维护的时候则比较复杂。

下面从Dev的角度来看一下Ops的工作。从Dev提交代码,到完成集成测试的一系列步骤如下:

  • 首先是开发人员把程序代码更新后上传到Git,然后其他的事情都将由Jenkins自动完成。
  • 然后Git在接收到用户更新的代码后,会把消息和任务传递给Jenkins,然后Jenkins会自动构建一个任务,下载Maven相关的软件包。下载完成后,就开始利用Maven Build新的项目包,然后重建Maven容器,构建新的Image并Push到Docker私有库中。
  • 最后删除正在运行的Docker容器,再基于新的镜像重新把Docker容器启动,自动完成集成测试。

整个过程都是自动的,这样就简化了原本复杂的集成工作,一天可以集成一次,甚至是多次。

未分类

本文主要关注的第二步,作为Dev使用Maven插件构建Docker镜像。

一、过程步骤

1、环境

笔者的电脑系统是MacOS,在进行下面的步骤之前,先具备一下条件:

  • Docker Registry
  • Maven(3.5.0)
  • JDK(1.8.0_131)
  • Docker for Mac (17.09.0-ce-mac35)

Maven 和JDK 就不用过多多了,必须具有的。Docker Registry是私有的hub,mac上装好docker之后,配置一下Docker Registry的地址,配置如下:

  "debug" : true,
  "experimental" : false,
  "insecure-registries" : [
    "192.168.1.202"

未分类

2、pom文件

pom文件中需要引入相应的插件。docker-maven-plugin有三款:spotify、fabric8io和bibryam。其中第一款最为流行,资料也多,所以毫不犹豫选择第一款。
插件有两种使用方式,一种是在直接在pom配置中指定baseImage和entryPoint。另一种适合于复杂的构建,使用dockerfile,只需要在配置中指定dockerfile的位置。前一种比较简单,此处略过,主要讲下第二种的配置。

<plugin>
             <groupId>com.spotify</groupId>
             <artifactId>docker-maven-plugin</artifactId>
             <version>${maven.docker.version}</version>
             <!--插件绑定到phase-->
             <executions>
                 <execution>
                     <phase>install</phase>
                     <goals>
                         <goal>build</goal>
                     </goals>
                 </execution>
             </executions>
             <configuration>
             <!--配置变量,包括是否build、imageName、imageTag,非常灵活-->
                 <skipDocker>${docker.skip.build}</skipDocker>
                 <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                 <!--最后镜像产生了两个tag,版本和和最新的-->
                 <imageTags>
                     <imageTag>${project.version}</imageTag>
                     <imageTag>latest</imageTag>
                 </imageTags>
                 <forceTags>true</forceTags>                 
                 <env>
                     <TZ>Asia/Shanghai</TZ>
                 </env>
                 <!--时区配置-->
                 <runs>
                     <run>ln -snf /usr/share/zoneinfo/$TZ /etc/localtime</run>
                     <run>echo $TZ > /etc/timezone</run>                      
                 </runs>
                 <dockerDirectory>${project.basedir}</dockerDirectory>
                 <resources>
                     <resource>
                         <targetPath>/</targetPath>
                         <directory>${project.build.directory}</directory>
                         <include>${project.build.finalName}.jar</include>
                     </resource>
                 </resources>
                 <!--push到私有的hub-->
                 <serverId>docker-registry</serverId>
             </configuration>
         </plugin>

${maven.docker.version}、${docker.skip.build}、${docker.image.prefix}都是可配置的变量。${project.basedir}、${project.build.directory}、${project.build.finalName}、${project.version}分别对应项目根目录、构建目录、打包后生成的结果名称、项目版本号。

上面的pom插件配置,指定了dockerfile的位置和镜像的命名规则。并将docker的build目标,绑定在install这个phase上。

3、dockerfile

FROM 192.168.1.202/library/basejava
VOLUME /tmp
ADD ./target/cloud-api-gateway-1.2.0.RELEASE.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

dockerfile 写的很简单,将jar包ADD进去,提供ENTRYPOINT。

4、setting.xml

在pom插件中,还有一个serverId的配置。这个配置是必要的,对于需要将image上传到私有hub上,在如上配置之后,只需要加上-DpushImage即可实现。serverId是与maven的配置文件setting.xml相对应,setting.xml中增加的配置:

<server>
  <id>docker-registry</id>
  <username>用户名</username>
  <password>密码</password>
  <configuration>
    <email>邮箱</email>
  </configuration>
</server>

5、结果

未分类

上图是执行mvn clean install -DpushImage成功的结果。mvn首先是打包,将生产的文件拷贝到target下的docker目录,然后执行dockerfile中的步骤,将打成的镜像进行tag,最后上传到私有hub上。

未分类

上图是VMware Harbor中的截图,可以看到,我们已经成功将镜像上传,其tag有两个:1.2.0.RELEASE和latest。

本文属于工程实践类文章,比较简单。开头由背景介绍了Dev到继承测试的一系列步骤,本文主要关注的是第二步,作为Dev使用Maven插件构建Docker镜像。正文部分主要讲了实践的环境,然后讲了docker-maven-plugin插件的使用方式,重点介绍了使用dockerfile的方式,对于涉及到的配置进行了解释。

本文的源码地址:

GitHub:https://github.com/keets2012/snowflake-id-generator
码云: https://gitee.com/keets/snowflake-id-generator

docker maven nexus svn 搭建

0. 准备工作

需要一个 image curiousby/centos-ssh-root-java-tomcat-maven-nexus:original

1. 运行该 镜像

Java代码

docker run -d -p 8080:8080   -p 8081:8081  -v /docker/nexus/data/:/usr/local/nexus/sonatype-work -v /docker/tomcat2/logs/:/usr/local/tomcat/logs  -v /docker/maven/repos/:/docker/maven/repos/ curiousby/centos-ssh-root-java-tomcat-maven-nexus:original   

2. 进入该镜像

Java代码

docker exec -it f7f bash  

3. 使用 yum 命令安装 svn

Java代码

yum install -y subversion  

Java代码

mkdir -p /data/svn/    
svnadmin create /data/svn/repo    
修改配置    
vim /data/svn/repo/conf/svnserve.conf    

[general]    
anon-access=none #匿名访问的权限,可以是read,write,none,默认为read    
auth-access=write #使授权用户有写权限     
password-db=passwd #密码数据库的路径     
authz-db=authz #访问控制文件     
realm=/data/svn/repo #认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字     

vim /data/svn/repo/conf/passwd    
[users]    
baoyou=123456    

vim /data/svn/repo/conf/authz    
[/]    
baoyou = rw    
启动    
ps -ef|grep svn     
svnserve -d -r /data/svn/repo  --listen-port=3690      

4. 提交镜像

Java代码

docker commit  f7f  curiousby/centos-ssh-root-java-tomcat-maven-nexus-svn:original  

5. 启动运行镜像

Java代码

docker run -d -p 8080:8080  -p 3690:3690  -p 8081:8081  -v  /docker/svn/data:/data/svn/ -v /docker/nexus/data/:/usr/local/nexus/sonatype-work -v /docker/tomcat/server/:/usr/local/tomcat/webapps -v /docker/tomcat/logs/:/usr/local/tomcat/logs  -v /docker/maven/repos/:/docker/maven/repos/ curiousby/centos-ssh-root-java-tomcat-maven-nexus-svn:original   

6. 进入镜像打开 svn 访问权限

Java代码

svnadmin create /data/svn/repo  
svnserve -d -r /data/svn/repo  --listen-port=3690  

7. 测试

未分类

未分类

未分类

未分类

Centos 7 Java配置maven+jenkins+git(svn)+tomcat自动编译和部署(持续集成)

目的

在开发中,需要经常频繁的对测试服务器进行部署,而且在多人协同中开发经常遇到的问题就是别人更新了他的代码,而你去更新你的代码时并没有更新到别人的代码,导致测试环境的代码不是最新,当然这个问题也好解决,那就是每次更新的时候先获取版本控制器上面的代码,然后更新,当然每次这样操作都是耗时耗力的,如果是整个项目更新,一般项目至少3、40M上传到服务器也需要一定的时间,而部分更新,也需要找到指定的文件或者整个代码覆盖,然后重启服务器(Tomcat里面直接覆盖class虽然可以配置热加载,但是容易内存溢出),就我工作中的情况而言,是每次都需要先把代码上传到服务器-解压-找到Tomcat进程id(Linux)-kill线程-启动Tomcat,每次下来就需要最少几分钟时间,而且每天有可能多次部署,所以对整个工作效率是有一定影响的。正是因为以上种种,所以才有了本文,而本文最终的结果就是一旦代码上传到Git或者svn的时候,代码能自动部署到服务器上面去,这样我们就只需要吧正确的代码提交的版本控制器,就不用理会服务器的更新了。

jenkins部署

  • Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

  • Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:

    • 持续的软件版本发布/测试项目。

    • 监控外部调用执行的工作。

  • Jenkins能做的东西有很多,不过本文只介绍一个简单的自动编译打包部署,首先下载Jenkins,推荐下载war包, 下载地址: https://jenkins.io/download/

基础准备

配置jdk+tomcat: http://www.okay686.cn/628.html

关闭selinux 以及 firewall 服务。

本文是基于Centos 7,war环境部署的,把下载好的war文件直接放到Tomcat中,然后启动Tomcat,启动成功后访问tomcat的jenkins项目如:

war包下载: http://mirrors.jenkins.io/war-stable/latest/jenkins.war

http://192.168.96.129:8080/jenkins 会看到以下界面:

未分类

注意红色框中的红色文字,那个是初始密码的路径,直接根据路径找到initialAdminPassword文件并打开,把密码复制出来,输入到页面中点击continue按钮,进入下一步: ( /root/.jenkins/secrets/initialAdminPassword )

未分类

Jenkins拥有很多插件,一般在开始我们并不清楚需要什么插件的时候,可以选择自定义安装,把所有基本的插件全部安装好,此页面第一个按钮是安装推荐插件,第二个是自己选择安装,这里我选择第二个按钮。

未分类

此界面是初始化安装插件的界面,先选择All插件,然后点击install

未分类

在这个界面需要多等一下,因为是在网上下载插件,而且是外国的网站,所以经常有下载失败的情况,最好打开V梯P子N,当所有插件安装完成后会有continue按钮出现,如果没有则刷新一下页面,当然也可能存在有插件安装失败,根据自己是否需要自行选择retry或continue,这里因为我的都已经安装完成了,所以进入到了下一个页面.

未分类

在此页面设置用户名和密码,记得点击save and finish按钮,如果选择了Continue as admin,会把用户名重置admin,然后密码也是你设置的密码,而是初始化文件中的密码,设置完成之后的页面.

未分类

点击Start using Jenkins 即可

未分类

Jenkins主界面

未分类

配置Jenkins

创建项目之前先要对Jenkins进行基本的配置,比如jdk的目录,git命令的目录和maven的目录等等

首先点击 系统管理

进入管理页面后如图:

未分类

点击 Global Tool Configuration 进入插件配置页面

配置jdk

(不晓得安装位置,好办,打开 vim /etc/profile 就可以找到!)

未分类

点击新增JDK按钮,会显示jdk配置form,如果电脑上已经安装了jdk则可以去掉自动安装,不过如果是用Tomcat运行的Jenkins那么是肯定已经安装了的,这里我们只需要配置好 jdk别名 和 JAVA_HOME 即可

配置git

未分类

需要将git的正确路径配置到Path to Git executable中。

配置maven

未分类

跟jdk相同,配置好名字和路径即可,当然也可以选择自动安装,不过还是推荐手动安装然后配置,配置好了之后点击save即可

当然还有现在很火的Gradle (有空写个教程,在此,我没有配置)

未分类

安装插件

由于新版默认没有将war部署到Tomcat的插件,所以需要手动安装,在系统管理中选择管理插件,再选择可选插件,搜索 Deploy to Container Plugin ,然后勾选点击直接安装

创建Jenkins任务

点击开始创建一个新任务进入任务创建页面:

未分类

先输入项目名字,然后选择构建一个maven项目,最后点击ok按钮

选择版本控制器

页面中找到源码管理模块,根据项目使用的版本控制器选择,如我们使用的git,则选择git

未分类

选择构建触发器

如果是git的话,可以直接通过GitLab(WebHooks)来实现触发,这样你每次提交到配置编译的分支就会git就会通知,不过目前我知道的是git.oschina.NET的钩子没有作用,当然如果不是git或者钩子没有作用的时候,可以用最简单的,定时查询。

未分类

这样是每10分钟查询一次,如果有更新就构建,具体Poll SCM的参数可以百度,那里更加详细

配置编译命令

编译命令我们可以直接配置最简单的命令编译:

未分类

选择Execute shell,在出来的界面中配置maven命令就行了,比如

mvn install

配置部署到Tomcat

点击新增构建后操作,选择 Deploy war/ear to a container ,然后配置 WAR/EAR files ,这个war的地址,一般都 target/xxx.war ,xxx是war的文件名。

然后点击Add Container,添加Tomcat服务器:

未分类

配置好Tomcat的管理员用户和密码以To及mcat的访问地址就ok了,这样只要你上传了代码,并且是配置编译的分支,一般过几分钟就会自动编译然后部署到Tomcat中了,当然最好还是用git,然后通过GitLab实现,这样不仅不用每隔几分钟查询一次,而且延迟很小!!