2
  • 目录
  • 前言
  • 一、配置仓库

    • (一)配置私服仓库
  • 二、创建项目

    • (一)新建代码组
    • (二)新建代码库
    • (三)拉取代码
    • (四)创建Maven项目
  • 三、镜像文件

    • (一)基础镜像
    • (二)编写Dockerfile
  • 四、构建部署

    • (一)宿主机管理
    • (二)创建流水线
  • 五、验证测试

    • (一)发布demo-domain
    • (二)部署demo-service
    • (三)访问demo-service
  • 六、最后

受篇幅限制,本文包含后三节内容,前三节内容请看《基于云效使用Docker实现持续交付(上)》

前言

阿里云发布了最新[云效2020]产品。云效提供从“需求 ->开发->测试->发布->运维->运营”端到端的协同服务和研发工具,支持公共云、专有云和混合云多种部署形态,通过人工智能、自动化 技术的应用助力开发者提升研发效能,持续快速交付有效价值。

云效2020产品包含多个模块功能,例如项目协作、知识库、流水线、代码管理、测试环境、仓库管理等功能。本文主要介绍使用Docker进行Java项目构建部署,涉及仓库管理、代码管理、流水线等功能。

阅读文本前,您需要能够熟练使用Maven构建Java项目,并了解Docker相关的一些基础概念及命令。

提示:本文图片较多,建议在wifi环境下阅读,土豪随意~

四、构建部署

(一)宿主机管理

1.点击左上角菜单按钮,找到并点击进入流水线

20200501-401.png

2.点击主机组管理,并创建主机,选择阿里云ECS

20200501-402.png

3.点击新建服务授权,授予服务器访问权限

20200501-403.png

4.进行授权

20200501-404.png

5.点击同意授权

20200501-405.png

6.授权完成后,在弹出框中,选择授权的服务器,点击下一步

20200501-406.png

7.填写服务器名称并设置主机环境,点击保存

20200501-407.png

8.查看主机组管理,服务器配置成功

20200501-408.png

(二)创建流水线

1.点击全部流水线,并新建发布demo-domain的流水线

20200501-409.png

2.选择Java,由于是发布demo-domain到私服仓库,选择测试、构建,点击创建

20200501-410.png

3.添加代码源

20200501-411.png

4.编辑流水线,选中Java构建上传环节,删除构建物上传步骤,并配置Java构建

20200501-412.png

5.修改流水线名称,修改构建命令为mvn -X versions:set -DremoveSnapshot=true && mvn -Dmaven.test.skip=true clean deploy -s settings.xml,如下所示,并保存

20200501-413.png

6.新增构建和部署demo-service的流水线,由于demo-service需要部署启动,这里选择镜像构建

20200501-414.png

7.同样添加代码源

20200501-415.png

8.编辑流水线,配置Java构建步骤,该步骤是将Java源代码打包成一个jar包

使用命令
mvn -X versions:set -DremoveSnapshot=true && mvn -Dmaven.test.skip=true clean package -s settings.xml

20200501-416.png

9.编辑流水线,配置镜像构建并推送至阿里云镜像仓库,需要新建服务授权,确保能够正常访问阿里云容器镜像服务

20200501-417.png

20200501-418.png

10.同时,还需要在容器镜像服务中创建一个镜像仓库

20200501-419.png

11.继续配置镜像构建并推送至阿里云镜像仓库

20200501-420.png

12.配置Docker部署环境

部署脚本如下

export image=$(echo $image | base64 -d);
sh /zccoder/shell/deploy.sh stop demo-service demo-service 8081 $image;
sh /zccoder/shell/deploy.sh start demo-service demo-service 8081 $image;

20200501-421.png

13.在/zccoder/shell目录下创建并编写deploy.sh脚本

#!/bin/bash

OG_NAME=$0
ACTION=$1
SERVICE_NAME=$2
SERVICE_LOG_NAME=$3
SERVICE_PORT=$4
DOCKER_URL=$5

usage() {
    echo "Not Support this operation: "${ACTION}
    echo "Usage: ${OG_NAME} {start|stop|restart} {SERVICE_NAME} {SERVICE_LOG_NAME} {SERVICE_PORT} {ENV_PROFILES}"
}

stop_application() {
    echo 'stopping......'
    CONTAINER=`docker ps -a |grep "${SERVICE_NAME}$" | awk '{print $1}'`
    if [[ -n "${CONTAINER}" ]]
        then
        docker stop ${CONTAINER}
        docker rm ${CONTAINER}
    fi
    # 删除镜像
    APP_HOME=/www/service/${SERVICE_NAME}
    if [[ -f "${APP_HOME}/docker_url" ]]
        then
        DOCKER_URL=`cat ${APP_HOME}/docker_url`
        if [[ -n "${DOCKER_URL}" ]]
            then
            TAG_NAME=`echo ${DOCKER_URL##*:}`
        fi
    fi
    if [[ -n "${TAG_NAME}" ]]
        then
        IMAGE=`docker images | grep ${SERVICE_NAME} | grep ${TAG_NAME} |awk '{print $3}'`
    else
        IMAGE=`docker images | grep ${SERVICE_NAME}|awk '{print $3}'`
    fi
    if [[ -n "${IMAGE}" ]]
        then
        docker rmi ${IMAGE}
    fi
}

create_log_dir(){
    #日志路径要真实存在
    log_path="/zccoder/logs/"${SERVICE_LOG_NAME}
    mkdir -p ${log_path}
}

start_application() {
    echo '镜像版本:'${DOCKER_URL}

    # 阿里云ECS机器
    HOST_IP=$(ifconfig eth0 | grep "inet " | awk -F: '{print $0}' | awk '{print $2}')
    # JAVA_OPTS=`eval cat /zccoder/shell/java-opts-${SERVICE_LOG_NAME}.conf`
    docker run --cap-add=SYS_PTRACE \
               -e HOST_IP=${HOST_IP} \
               -v /zccoder/logs:/zccoder/logs -v ${log_path}:/log \
               -p ${SERVICE_PORT}:${SERVICE_PORT} \
               --name ${SERVICE_NAME} \
               -d ${DOCKER_URL} \
               java -Djava.security.egd=file:/dev/./urandom -jar ${SERVICE_NAME}.jar
     CONTAINER_ID=`docker ps -a | grep -v "grep" | grep ${SERVICE_NAME} | awk -F: '{print $1}' | awk  '{print $1}' | head -n 1`
     if [[ -n "${CONTAINER_ID}" ]]
        then
        RESULT=`docker inspect -f '{{.State.Running}}' ${CONTAINER_ID}`
        if [[ ${RESULT} = 'true' ]]
           then
           echo "部署成功"
           exit
        fi
     fi
     echo "部署失败"
}

start() {
    create_log_dir
    start_application
}

stop() {
    stop_application
}

case "$ACTION" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        start
    ;;
    *)
        usage
    ;;
esac

五、验证测试

(一)发布demo-domain

1.点击demo-domain-deploy流水线

20200501-501.png

2.点击运行,弹出运行配置,再次点击运行

20200501-502.png

20200501-503.png

3.点击日志,可以查看构建日志

20200501-504.png

4.通过查看构建日志,显示构建成功

20200501-505.png

5.到Maven私服仓库验证,由于构建命令包含versions:set -DremoveSnapshot=true,所以会发布到release仓库

20200501-506.png

(二)部署demo-service

1.点击demo-service-deploy流水线

20200501-507.png

2.点击运行,查看流水线运行成功

20200501-508.png

20200501-509.png

3.到ECS服务器查看Docker容器启动状态

20200501-510.png

(三)访问demo-service

20200501-511.png

六、最后

以上就是基于云效使用Docker实现持续交付的全部内容,感谢您花费宝贵的时间进行阅读,希望您有所收获。

欢迎关注我的公众号

zccoder-wx.jpg


妙手空空
1.3k 声望370 粉丝

博观而约取,厚积而薄发