• 【华为云实战开发】10.经典的C++项目怎么在云端开发?【华为云技术分享】


    1 概述

    1.1 文章目的

    本文主要想为研发C++项目的企业或个人提供上云指导,通过本文中的示例项目 “音频解析器”,为开发者提供包括项目管理,代码托管,代码检查,编译构建,测试管理的操作指导,覆盖软件开发全生命周期。

    1.2 项目详情

    项目简介:音频采样器是一个C++应用程序,它可以从MP3、WAV、FLAC或Ogg Vorbis格式的音频文件中生成波形数据,波形数据可用于生成音频的可视化呈现,外观类似于音频编辑应用程序;除此之外,该应用程序还可以进行音频格式转换等功能,为音频处理者提供多种服务。

    图片1.png

    项目周期:3周(敏捷迭代开发)

    构建环境:Ubuntu 16.04+GNU 5.4.0+Cmake3.5.1

    部署环境:Ubuntu 14.04.5 LTS

    华为云服务:软件开发服务 DevCloud

    容器镜像服务 SWR

    弹性云服务器 ECS

    1.3 前提条件

    注册华为云账号:华为云官网注册华为云账号,此账号适用于所有华为云产品。

    弹性云服务器:部署将使用带有公网IP的ECS(ubuntu16.04),centos系统由于静态库不兼容会导致不确定的错误。

    2 项目管理

    2.1 创建项目

    新建项目的开发流程包含两种类型:scrum流程、看板流程。Scrum流程是标准的敏捷开发流程,工作项层级为传统的scrum划分方法Epic->Feature->Story->Task&Bug,本项目为把工作划分的层级更清晰,选择了scrum流程。

    图片2.png

    2.2 创建迭代

    本项目研发周期短,只有一次release,划分成三个迭代,迭代周期为一周。

    图片3.png

    2.3 梳理产品需求清单

    项目规划是以思维导图的形式将工作项的层级结构展示出来,更直观的看到父子关系,在项目规划中新建工作项后,会自动生成到后面的Epic,Feature,Backlog和迭代页面,在迭代开始前,项目经理将从客户获取的所有需求信息,逐一落实到项目规划中,分解成story,并为工作项设置优先级。

    图片4.png

    2.4 输出迭代清单

    在迭代开始前,在Backlog页面过滤出优先级“高”且重要程度为“关键”的工作项,纳入迭代1,与开发人员进行需求澄清。其余迭代,均可根据组内实际情况,按照优先级从高到低,重要程度减弱的顺序进行开发。

    图片5.png

    3 代码托管

    3.1 创建仓库

    新建代码仓库时,选择“模板新建”,在搜索框中输入已经被公开为示例模板的仓库名称,选择该模板。

    图片6.png

    输入新的仓库名称(可以和模板仓库同名),即可创建代码仓

    图片7.png

    4 构建&发布

    4.1 构建工具

    “CMake”是“cross platform make”的缩写,是一个跨平台的编译工具, 它比我们常用的“make”更高级,可以在CmakeLists.txt用简单的语句来描述所有平台的编译过程。为了说明CMake给编译带来的简化和优点,我们来简述一下C++语言从简单到复杂项目,涉及不同平台时编译的变化:单文件编译,仅仅一条g++ main.cpp命令即可生成可执行文件;当源文件越来越多,无法一条一条命令执行时,就需要make自动编译工具,开发人员需要做的就是写make执行时所需要依据的脚本——makefile;但是makefile抽象程度不高,对windows OS也不友好,cmake完美解决了这种多平台编译的问题。

    Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。本项目使用的构建工具就是Cmake+gcc

    4.2 镜像类型

    镜像类型有三种,既可以选择DevCloud预定义的镜像,也可以选择Docker Hub或华为容器镜像服务SWR(SoftWare Repository for Container)中的公共镜像进行构建。

    DevCloud推荐镜像,包含多种版本的Cmake和gcc工具供选择使用,目前最高支持cmake3.10.1-gcc7.3.0,这些推荐镜像仅仅安装了简单的构建工具和常用的软件包,对于大型、专业性较强的C++项目,需要在构建前安装大量的依赖包,这样如果在每次构建时都在推荐的构建环境中进行安装显然是不可取的,所以,我们可以自己创建包含工程依赖包的镜像,上传到SWR服务中,构建时直接使用。本项目中使用的就是SWR中自己上传的自有ubuntu镜像。

    4.3 SWR镜像上传

    在SWR服务中,点击“客户端上传”,会显示上传指导说明,本小节通过具体步骤辅助大家实践。

    图片8.png

    图片.png

    图片.png

    ③ 查看构建镜像

    图片9.png

    ④ 上传镜像

    图片9.1.png

    其中,org-pj为镜像所属组织,可以在SWR的“组织管理”创建。

    ⑤ 在SWR中查看上传镜像

    图片10.png

    ⑥将镜像权限设置成“公开”,才能在构建任务中使用

    图片.png

    ⑦获取该镜像地址(docker pull后面内容),在构建任务中使用

    图片11.png

    4.4 创建构建任务

    新建任务,输入任务名,选择源码仓库

    图片12.png

    不使用模板,直接创建任务

    图片13.png

    点击左侧“+”,选择“使用SWR公共镜像”操作类型

    图片14.png

    输入构建详细信息

    图片15.png

    5 发布

    本项目中发布服务有两个作用,其一,将构建生成的可执行文件上传到发布仓库,便于软件包管理;其二,将部署中用到的mp3文件,预先手动上传至发布仓库,部署中将直接使用。

    5.1 发布软件包

    将可执行文件和启动脚本startup.sh使用shell命令打成压缩包

    图片.png

    图片.png

    将压缩包上传到软件发布仓库

    图片17.png

    5.2 上传依赖文件

    点击“上传”按钮,将一个压缩好的MP3压缩文件上传至软件发布库,在部署时,将使用生成的可执行文件解析该音频文件,该文件可以用任意MP3文件替代。

    图片18.png

    6 部署

    6.1 C++可执行文件

    该项目生成了一个可执行文件audiowaveform, 在linux系统中可以通过命令查看详细信息。

    如果发现自己的文件无法执行,可以通过chmod 777 audiowaveform命令将文件置成可执行(r:读,w:写,x:可执行)。

    如果发现直接执行audiowaveform失败,可能是由于环境变量导致的,可以通过./ audiowaveform来执行

    图片19.png

    该可执行文件应用于linux系统上,不同于可视化窗口操作,它是通过终端命令进行交互,操作命令可以查看帮助信息:

    图片20.png

    6.2主机授信

    将服务器主机授信到DevCloud里,用于部署网站。

    点击“设置-通用设置-主机组管理”,将服务器以主机组的形式授信到项目当中。

    图片.png

    在主机组中添加主机:

    图片.png

     

    6.3模板部署任务

    Ø 新建部署任务,部署类型选择“模板任务”

    Ø 填写部署任务名称,不使用模板直接创建。

    Ø 添加以下部署步骤:

    选择部署来源(部署软件包)、选择部署来源(MP3文件)、解压文件、删除文件、执行shell命令

    (1) 选择部署来源。

    图片.png

    (2) 解压文件。(解压路径应与启动脚本startup.sh中的路径匹配)

    图片.png

    (3)删除文件。

    图片.png

    (4)执行shell命令:startup.sh启动脚本已经在解压文件步骤中解压到相应路径下了。

    图片.png

    图片.png

    6.4 查看部署效果

    根据startup.sh中的执行命令,最终生成了test.png音频采样图片,可以通过FTP将图片从远端ECS服务器上下载到本地查看。

    图片17.png

    至此,恭喜您打通了DevCloud的各服务,完成了C++云上开发环境的搭建

    华为云DevCloud,5人以下额度范围内,可以免费使用,并且可以预约免费的产品演示和技术交流,详情查看华为云官网

    HDC.Cloud 华为开发者大会2020 即将于2020年2月11日-12日在深圳举办,是一线开发者学习实践鲲鹏通用计算、昇腾AI计算、数据库、区块链、云原生、5G等ICT开放能力的最佳舞台。

    欢迎报名参会

  • 相关阅读:
    Python--day68--ORM内容回顾
    Python--day67--include包含其他的url和反向解析URL
    Python--day67--Django的路由系统
    Python--day67--Jsonresponse响应介绍和路由系统的分组命名匹配方式(简单介绍)
    Python--day67--CBV和FBV、Request对象及上传文件示例
    Python--day66--Django模板语言关于静态文件路径的灵活写法
    GET和POST两种基本请求方法的区别
    ASP.NET中使用UpdatePanel实现局部异步刷新方法和攻略(转)
    GridView中实现DropDownList联动
    .NET string字符串的截取、移除、替换、插入
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/12017544.html
Copyright © 2020-2023  润新知