一、配置仓库
二、创建项目
三、镜像文件
四、构建部署
五、验证测试
受篇幅限制,本文包含前三节内容,后三节内容请看《基于云效使用Docker实现持续交付(下)》
阿里云发布了最新[云效2020]产品。云效提供从“需求 ->开发->测试->发布->运维->运营”端到端的协同服务和研发工具,支持公共云、专有云和混合云多种部署形态,通过人工智能、自动化 技术的应用助力开发者提升研发效能,持续快速交付有效价值。
云效2020产品包含多个模块功能,例如项目协作、知识库、流水线、代码管理、测试环境、仓库管理等功能。本文主要介绍使用Docker进行Java项目构建部署,涉及仓库管理、代码管理、流水线等功能。
阅读文本前,您需要能够熟练使用Maven构建Java项目,并了解Docker相关的一些基础概念及命令。
提示:本文图片较多,建议在wifi环境下阅读,土豪随意~
1.使用Maven构建Java项目,通常都会使用Maven私服仓库,以供内部二方库互相依赖及引用。这里,我们直接使用云效提供的Maven私服仓库。
2.访问阿里云官网,选择[公共云 免费使用]。
   
  
3.第一次访问需要填写企业名称,并开通服务。服务开通成功后,界面如下所示
   
  
4.点击左上角菜单按钮,找到并点击进入制品仓库
   
  
5.点击snapshot仓库地址,可以看到这个仓库下目前是空的,因为还未发布jar包到仓库。
   
  
6.找到左上角[指南]按钮,点击后切换页签,可以看到Maven配置指南。
   
  
7.这里,我们直接使用方式一,直接下载settings.xml文件,并重命名为settings-zccoder-2020.xml,放到Maven的conf目录下。
   
  
8.通常情况下,还需要配置本地仓库地址。
   
  
9.至此,Maven私服仓库配置完成。
 这里我们创建两个项目 demo-domain 和 demo-service ,用来模拟企业内部项目二方库互相依赖的场景。 
 demo-domain 用来存放一些POJO领域模型对象,单独发布jar包,以供其他项目使用。 
 demo-service 依赖于 demo-domain ,是实现业务功能的项目,下面会使用Docker来进行部署。 
1.点击左上角菜单按钮,找到并点击进入代码管理
   
  
2.为方便管理,先新建demo代码组
   
  
   
  
 1.demo代码组新建成功后,则新建 demo-domain 代码库 
   
  
   
  
 2.使用同样的方式,新建 demo-service 代码库。创建完成后如下 
   
  
 1.点击进入 demo-domain 项目,第一次需要配置SSH密钥 
   
  
   
  
 2.SSH密钥配置完成后,使用 git clone 命令,将空的代码库下载本地 
   
  
   
  
1.在创建Maven项目之前,需要设置IDE的Maven配置文件
   
  
 2.创建 demo-domain 项目,pom文件如下 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zccoder</groupId>
    <artifactId>demo-domain</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>
    </dependencies>
    <distributionManagement>
        <repository>
            <id>rdc-releases</id>
            <url>https://packages.aliyun.com/maven/repository/2001067-release-pF311P/</url>
        </repository>
        <snapshotRepository>
            <id>rdc-snapshots</id>
            <url>https://packages.aliyun.com/maven/repository/2001067-snapshot-MP1zHb/</url>
        </snapshotRepository>
    </distributionManagement>
</project> 
  3.编写 User 类 
package com.zccoder.demo.domain;
import java.io.Serializable;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 用户实体
 *
 * @author zc
 * @date 2020/04/30
 */
@Data
@NoArgsConstructor
public class User implements Serializable {
    /**
     * 用户编号
     */
    private Integer uid;
    /**
     * 用户名称
     */
    private String userName;
} 
  4.执行 mvn -X -Dmaven.test.skip=true clean deploy 将 demo-domain 发布到私服仓库 
   
  
5.通过日志,能够看到成功发布到私服仓库,再到私服仓库确认下,确实有了这个包
   
  
 6.创建 demo-service 项目,pom文件如下 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/>
    </parent>
    
    <groupId>com.zccoder</groupId>
    <artifactId>demo-service</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>com.zccoder</groupId>
            <artifactId>demo-domain</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>demo-service</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project> 
  7.编写 HelloApplication 类 
package com.zccoder.demo.service;
import com.zccoder.demo.domain.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
/**
 * 启动类
 *
 * @author zc
 * @date 2020/04/30
 */
@RestController
@RequestMapping("/hello")
@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
    @GetMapping
    public String say(@NotNull User user) {
        return "Hello " + user.toString();
    }
} 
 8.配置application.properties
server.port=8081
 9.启动 HelloApplication ,并访问 http://127.0.0.1:8081/hello?uid=1&userName=Demo ,显示成功 
   
  
 10.将之前的settings-zccoder-2020.xml文件复制到 demo-domain 和 demo-service 项目根目录,重命名为settings.xml 
   
  
 11.最后,将 demo-domain 和 demo-service 代码提交到远程代码库 
1.编写基础镜像Dockerfile,提供JDK环境、时区等基础环境
FROM centos:7
#安装wget工具
RUN yum -y install wget
#下载并且安装jdk设置环境变量
COPY jdk-8u201-linux-x64.rpm jdk-8u201-linux-x64.rpm
RUN rpm -ivh jdk-8u201-linux-x64.rpm
ENV JAVA_HOME /usr/java/latest/
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
RUN rm -rf jdk-8u201-linux-x64.rpm
#时区中文等处理
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && /
    echo 'Asia/Shanghai' >/etc/timezone
RUN yum -y install kde-l10n-Chinese
#配置显示中文
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV LC_ALL zh_CN.utf8
RUN echo "export LC_ALL=zh_CN.utf8" >> /etc/profile 
 2.在基础镜像Dockerfile文件所在目录,执行命令
 docker build -t registry.cn-shenzhen.aliyuncs.com/zccoder/zccoder-jdk1.8:v1 . 
3.构建好基础镜像,并使用下面命令推送到阿里云容器镜像服务
 docker push registry.cn-shenzhen.aliyuncs.com/zccoder/zccoder-jdk1.8:v1 
4.到阿里云容器镜像服务进行确认,可以看到基础镜像
   
  
1.构建好基础镜像后,就是编写服务层镜像。
2.在项目根目录创建Dockerfile文件,内容如下即可
# 依赖基础镜像 FROM registry.cn-shenzhen.aliyuncs.com/zccoder/zccoder-jdk1.8:v1 COPY demo-service.jar /demo-service.jar CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/demo-service.jar"]