【流水线入门】解放运维,一键部署

本文涉及的产品
云效 DevOps 流水线,基础版人数 不受限
云效 DevOps 代码管理,基础版人数 不受限
云效 DevOps 测试管理,基础版人数 不受限
简介: 阿里云云效流水线,降低运维工作量,让运维解放出来做更有意义的事

本文只涉及到云效流水线的配置及部署,前提是linux服务器已经装好java环境。
云效提供任务、日程、统计、流水线等功能,丰富多样。由于文章篇幅有限,本文只涉及到流水线功能。

准备项目

小白写一个简单的springboot项目,功能是打印请求IP,写好后上传到github远程仓库(也可以是Gitlab,自建Gitlab,码云,Codeup等外网可以访问的代码托管平台)。这里注意一定要有空URL的映射,因为启动脚本要检测项目是否启动成功。或者可以自行修改启动脚本

@RestController
@RequestMapping("/")
public class ShowIpController {

    @GetMapping("/")
    public String index(HttpServletRequest request){
        String ip = getIp(request);
        System.out.println("ip:[" + ip + "]");
        return "thanks";
    }

    @GetMapping("/ip/show")
    public String show(HttpServletRequest request){
        String ip = getIp(request);
        System.out.println("ip:[" + ip + "]");
        return "thanks";
    }

    private static String getIp(HttpServletRequest request) {
        if (request == null) {
            return "unknown";
        }
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }
}

创建启动脚本 deploy.sh 并放入resources目录下,下文能用得到,有了启动脚本我们就不需要手动去启动构建的项目

#!/bin/bash

# 修改APP_NAME为云效上的应用名
APP_NAME=ip
VERSION=1.0


PROG_NAME=$0
ACTION=$1
APP_START_TIMEOUT=20    # 等待应用启动的时间
APP_PORT=8080          # 应用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}  # 应用健康检查URL
APP_HOME=/home/devops/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下
JAR_NAME=${APP_HOME}/${APP_NAME}-${VERSION}.jar # jar包的名字
JAVA_OUT=${APP_HOME}/logs/start.log  #应用的启动日志

# 创建出相关目录
mkdir -p ${APP_HOME}
mkdir -p ${APP_HOME}/logs
usage() {
    echo "Usage: $PROG_NAME {start|stop|restart}"
    exit 2
}

health_check() {
    exptime=0
    echo "checking ${HEALTH_CHECK_URL}"
    while true
        do
            status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`
            if [ "$?" != "0" ]; then
               echo -n -e "\rapplication not started"
            else
                echo "code is $status_code"
                if [ $status_code -eq 200 ];then
                    break
                fi
            fi
            sleep 1
            ((exptime++))

            echo -e "\rWait app to pass health check: $exptime..."

            if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
                echo 'app start failed'
               exit 1
            fi
        done
    echo "check ${HEALTH_CHECK_URL} success"
}
start_application() {
    echo "starting java process"
    nohup java -jar ${JAR_NAME} > ${JAVA_OUT} 2>&1 &
    echo "started java process"
}

stop_application() {
   checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
   
   if [[ ! $checkjavapid ]];then
      echo -e "\rno java process"
      return
   fi

   echo "stop java process"
   times=60
   for e in $(seq 60)
   do
        sleep 1
        COSTTIME=$(($times - $e ))
        checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
        if [[ $checkjavapid ]];then
            kill -9 $checkjavapid
            echo -e  "\r        -- stopping java lasts `expr $COSTTIME` seconds."
        else
            echo -e "\rjava process has exited"
            break;
        fi
   done
   echo ""
}
start() {
    start_application
    health_check
}
stop() {
    stop_application
}
case "$ACTION" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        start
    ;;
    *)
        usage
    ;;
esac

开始配置

新建项目

登录阿里云云效。进到云效管理后台后,点击新建项目,云效提供产品研发,游戏研发等多种企业模板。此处我选择了空白模板,大家可以根据自己的需要选择不同的模板。输入项目名ip,选择ip项目分组,点击创建即可创建成功,操作十分简单。
image.png

新建流水线

创建完成后就自动跳转到了我们刚刚创建的ip项目,切到"流水线"TAB,点击新建流水线。选择第一项
Java · 构建、部署到阿里云ECS/自有主机 点击创建按钮创建成功。
image.png

关联远程仓库并设置代码源

代码源选择你已经上传的外网远程仓库,我关联github,完成授权后依次选择命名空间,仓库,填入分支名"master"。
image.png

编辑java构建上传

单工程项目直接默认的就可以了,如果是有父子层级的项目就需要配置 构建物上传-打包路径,有几个需要发布的工程就需要几条打包路径,需要注意的是开头没有/,结尾有/。例如app/target/
还可以选择任务插件,将成功,失败等状态直接发送到你自定义的邮箱或者是钉钉群
image.png

编辑主机部署

制品选择我们刚刚构建时创建的制品,新建主机组,选择 自有主机 ,将页面中的命令复制到你的远程主机上运行一下,等待安装成功即可。注意此命令15分钟有效,超出后需要重新获取。
image.png
这样我们的列表中就出现了一台机器,这台机器已经与这条流水线关联了。代码会自动部署到这台机器上。主机组就选择刚刚创建的主机,你想把构建好的jar包放在哪,下载路径就填入你想放的路径,这里我填入/home/devops/ip/ip.tgz。部署脚本填入解压缩命令及运行 启动脚本
*tar zxvf /home/devops/ip/ip.tgz -C /home/devops/ip/
sh /home/devops/ip/classes/deploy.sh start*
关于部署脚本例子的详细解释
至此点击右上角保存并运行,然后静静的等待项目运行即可。

image.png

运行成功后效果

image.png


【云效官网】https://www.aliyun.com/product/yunxiao?channel=zhibo
【云效开发者俱乐部】钉群:34532418

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
SVN版本控制系统
SVN是现在软件开发之中的主流软件版本控制工具,在工作之中利用SVN可以有效的解决多人开发的代码管理问题,本课程将为读者讲解SVN服务器的配置以及基于MyEclipse的SVN客户端插件的配置与使用,并且在讲解之中着重讲解了冲突的产生于解决。
相关文章
|
26天前
|
人工智能 运维 自然语言处理
对话蚂蚁开源蒋炜:让 Agent 把运维人员从 24 小时的待命中解放出来
当整个行业的智慧都集中在一件事情上时,比起闭门造车,开源一定能带来更好的技术迭代和发展。CodeFuse 「编码挑战季」活动火热进行中,诚邀广大开发者们参与编码挑战
100 3
对话蚂蚁开源蒋炜:让 Agent 把运维人员从 24 小时的待命中解放出来
|
16天前
|
运维 负载均衡 Ubuntu
自动化运维的利器:Ansible入门与实践
【10月更文挑战第31天】在当今快速发展的信息技术时代,高效的运维管理成为企业稳定运行的关键。本文将引导读者了解自动化运维工具Ansible的基础概念、安装步骤、基本使用,以及如何通过实际案例掌握其核心功能,从而提升工作效率和系统稳定性。
|
26天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【10月更文挑战第21天】在现代IT基础设施的管理中,自动化运维已成为提升效率、降低错误率的关键。Ansible,作为一种简单而强大的自动化工具,正被广泛应用于配置管理、应用部署和任务自动化等领域。本文将引导你了解Ansible的基本概念,通过实际案例展示如何利用Ansible简化日常运维工作,并探讨其在现代IT运维中的应用价值。无论你是新手还是有经验的系统管理员,这篇文章都将为你开启Ansible的高效之旅提供指导。
|
1月前
|
运维 监控 网络协议
IT专业入门,高考假期预习指南:运维方向
IT专业入门,高考假期预习指南:运维方向
|
2月前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【9月更文挑战第28天】在追求高效、稳定的IT运维时代,自动化工具Ansible凭借其简洁性、易用性和强大的功能脱颖而出。本文旨在通过实际案例引导读者理解Ansible的核心概念和操作流程,并分享如何通过Ansible简化日常运维任务,提升工作效率。从基础安装到高级应用,我们将一步步揭开Ansible的神秘面纱,让初学者也能轻松掌握自动化运维的要诀。
|
2月前
|
运维 关系型数据库 MySQL
自动化运维工具:Ansible入门与实践
【9月更文挑战第23天】本文将带你进入自动化运维的世界,以Ansible为例,从基础概念到实际操作,让你轻松掌握自动化运维技能。我们将一起探索如何通过代码实现批量部署、配置管理和任务执行等功能,提高运维效率,减轻工作压力。让我们一起开启自动化运维之旅吧!
|
2月前
|
运维 Unix 关系型数据库
运维入门相关知识介绍
运维入门从最低的说起
33 8
|
2月前
|
存储 运维 网络安全
自动化运维工具:Ansible入门与实践
【9月更文挑战第17天】本文将介绍Ansible的基本概念、安装和简单使用,以及如何编写一个简单的Ansible playbook。通过本文,您可以了解到Ansible的基本原理和使用方法,以及如何在实际工作中应用Ansible进行自动化运维。
|
2月前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
205 3
|
2月前
|
运维 应用服务中间件 nginx
自动化运维的利器:Ansible入门与实践
【9月更文挑战第13天】在这个快速发展的IT时代,自动化运维已成为提升效率、减少失误的关键。本文将带你了解Ansible,一个强大的自动化工具,它简化了配置管理、应用部署和任务自动化。通过实际案例,我们将探索Ansible的基本概念、安装步骤、关键组件以及如何编写Playbook来自动化日常任务。无论你是新手还是有经验的运维专家,这篇文章都将为你提供宝贵的见解和技巧,让你在自动化运维的道路上更进一步。
下一篇
无影云桌面