自动打包上传到Nexus


一、实现目标及验证标准

  • 当组件代码提交到开发分支后,组件的Jenkins Job会自动触发,将组件最新的代码打包上传到Nexus开发库相应组件目录下;
  • 当组件代码提交到发布分支后,手动触发组件的Jenkins Job,将组件最新的代码打包上传到Nexus发布库相应组件目录下;
  • 能够下载Nexus上组件开发版本二进制文件;
  • 能够下载Nexus上组件发布版本二进制文件;

以wordpress-devops-demo组件为例, 配置发布分支的持续集成和打包上传存储管理:

当组件代码提交后,手动触发组件的Jenkins Job,Jenkins Job将组件最新的代码打包上传到Nexus发布库组件相应目录下, 即如果组件的groupid为com.fit2cloud.devops, 组件Id为f2c-ops, 版本号为0.1,则组件的上传到 http://nexus.fit2cloud.com/content/repositories/releases/com/fit2cloud/devops/wordpress-devops-demo/0.1/wordpress-devops-demo-0.1-bin.zip

二、前置要求

  • Nexus服务器已经搭建好;
  • 组件代码分支已经创建;
  • Jenkins服务器上可以成功checkout下来组件代码分支,比如如使用Git,已将Jenkins服务器ssh key添加到Git服务端
  • Jenkins服务器上已安装maven,并且mvn工作正常

1. 给组件代码添加maven配置文件并配置组件的maven打包上传参数

下载pom.xml和assembly.xml模板

下载pom-template.xml和assembly-template.xml到组件分支代码根目录, 并改名为pom.xml和assembly.xml

cd <组件代码根目录>
wget -O pom.xml http://f2c-tools.oss-cn-hangzhou.aliyuncs.com/devops-wares/pom-template.xml
wget -O assembly.xml http://f2c-tools.oss-cn-hangzhou.aliyuncs.com/devops-wares/assembly-template.xml

2. 配置组件的groupId,artifactId,version,distributionManagement

  • 配置pom.xml里打包上传参数
pom.xml

<groupId>${TO_REPLACE_GROUP_ID}</groupId>
<artifactId>${TO_REPLACE_COMPONENT_ID}</artifactId>
<packaging>pom</packaging>
<name>${TO_REPLACE_COMPONENT_NAME}</name>
<version>${TO_REPLACE_COMPONENT_VERSION}</version>

替换pom.xml里的${TO_REPLACE_GROUP_ID} ${TO_REPLACE_COMPONENT_ID}, ${TO_REPLACE_COMPONENT_NAME}, ${TO_REPLACE_COMPONENT_VERSION}

例如:  
<groupId>com.fit2cloud.devops</groupId>
<artifactId>wordpress-devops-demo</artifactId>
<packaging>pom</packaging>
<name>Wordpress DevOps Demo</name>
<version>0.1</version>

配置如上后则二进制包在Nexus存放路径为: http://nexus.fit2cloud.com/content/repositories/releases/com/fit2cloud/devops/wordpress-devops-demo/0.1/wordpress-devops-demo-0.1-bin.zip
  • 配置发布Nexus库参数
替换pom.xml里的${TO_REPLACE_COMPANY_NAME},${TO_REPLACE_NEXUS_ENDPOINT}

例子:
<distributionManagement>
    <repository>
      <id>${TO_REPLACE_COMPANY_NAME}-releases</id>
      <name>${TO_REPLACE_COMPANY_NAME} Releases</name>
      <url>http://${TO_REPLACE_NEXUS_ENDPOINT}/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
      <id>${TO_REPLACE_COMPANY_NAME}-snapshots</id>
      <name>${TO_REPLACE_COMPANY_NAME} Snapshots</name>
      <url>http://${TO_REPLACE_NEXUS_ENDPOINT}/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

3. 配置打包格式及需要打入包的文件范围

在assembly.xml中的<excludes>部分,配置不需要打入组件包的文件的路径。
<?xml version="1.0" encoding="UTF-8"?>
<assembly
  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>${project.basedir}</directory>
      <outputDirectory>/</outputDirectory>
      <useDefaultExcludes>true</useDefaultExcludes>
      <excludes>
        <exclude>**/*.log</exclude>
        <exclude>**/${project.build.directory}/**</exclude>
      </excludes>
    </fileSet>
  </fileSets>
</assembly>

4. 配置settings.xml并放置到运行Jenkins的Linux用户的~/.m2/setttings.xml

这部分配置存储着Nexus发布库和开发库的用户名密码,maven deploy命令上传组件二进制包文件到Nexus时,会从该配置文件中读取Nexus用户名密码,以有权限上传。

maven deploy时,maven首先会根据version中是否有SNAPSHOT来选择Nexus的Repository,
- 如果version字符串中不包含SNAPSHOT,即为发布版本,则maven根据pom.xml里distributionManagement中的发布库Id到setting.xml查找其用户名密码, 发布库的ID为repository
  比如上面例子中pom.xml中distributionManagement中的repository库的Id为fit2cloud-releases, 则maven会到~/.m2/settings.xml中,找fit2cloud-releases的用户名密码.

- 如果version字符串中包含SNAPSHOT,即为开发版本,则maven根据pom.xml里distributionManagement中的开发库Id到setting.xml查找其用户名密码, 开发库的ID为snapshotRepository
  比如上面例子中pom.xml中distributionManagement中的snapshotRepository库的Id为fit2cloud-snapshots, 则maven会到~/.m2/settings.xml中,找fit2cloud-snapshot的用户名密码.

请把下面配置中的YOUR NEXUS USERNAME和YOUR NEXUS PASSWORD替换为您相应Nexus服务的用户名和密码。

~/.m2/setttings.xml
<settings>
    <servers>
        <server>
            <!-- this id should match the id of the repo server in pom.xml -->
            <id>fit2cloud-snapshots</id>
            <username>YOUR NEXUS USERNAME</username>
            <password>YOUR NEXUS PASSWORD</password>
        </server>
        <server>
            <!-- this id should match the id of the repo server in pom.xml -->
            <id>fit2cloud-releases</id>
            <username>YOUR NEXUS PASSWORD</username>
            <password>YOUR NEXUS PASSWORD</password>
        </server>
    </servers>
</settings>

5. 把pom.xml和assembly.xml提交到代码库,如Git,SVN的远程代码库

三、给组件分支创建并配置Jenkins Job

1. 创建Jenkins Job并配置组件分支Jenkins Job名称

Job名: 组件名-分支名-用途
例1:  wordpress-devops-demo-v0.1-release
例2:  f2c-ops-master-dev

alt

2. 配置Source Code Management

Git -> Repositories: <YOUR GIT Repo URL> 
例如: git@github.com:xxxxxxxxxxx/wordpress-devops-demo.git

alt

3. 配置Git -> Build Triggers

- Poll SCM:  Checked 
- Scheduele: * * * * *

alt

4. 配置Build脚本

Execute Shell: mvn package deploy

alt