鲲鹏社区首页
中文
注册
练习:与Jenkins结合实现软件项目迁移持续集成

练习:与Jenkins结合实现软件项目迁移持续集成

开发框架

发表于 2023/04/27

0

尊敬的鲲鹏开发者你好,为了提高开发者在软件迁移过程中的开发效率,我们提供了Porting Advisor的Jenkins迁移扫描插件,帮助开发者对软件项目迁移集成化,更快更方便的实现跨平台软件的迁移,您可以阅读本文进行Jenkins迁移扫描插件的快速入门。

本文主要介绍了以下知识:

(1)为何要进行CI集成

(2)如何使用Porting Advisor的Jenkins迁移扫描插件实现软件项目迁移CI持续集成

基础技能:

(1)具备基础的C/C++语言编程能力

(2)了解常用的Linux操作命令

(3)了解CICD,Jenkins基础操作

为何要进行CI集成

处理器所支持的指令集不同,意味着开发者可能需要对代码进行跨平台的迁移。通常,代码迁移是件复杂又繁琐的工作,需要花费开发者大量精力对软件包、源代码、依赖库文件进行人工分析、检查和识别,手动修正不同指令集之间的相关差异,这些差异主要涉及语法、指令、函数和库文件支持情况。

为了解决用户代码可迁移性人工排查困难、移植经验欠缺、反复依赖编译调错定位等,投入工作量大,整体效率低的问题,Porting Advisor通过对海量代码进行快速地自动化扫描和分析,提供专业的迁移指导报告。Jenkins是一种持续集成工具,用于监控持续重复工作,Porting Advisor与Jenkins结合,即可实现工程首次配置,后续持续集成扫描,能帮助开发者实现自动化且持续性的源码迁移评估。

如何使用Porting Advisor的Jenkins迁移扫描插件实现软件项目迁移CI持续集成准备工作

(1)准备工作

步骤一:申请鲲鹏远程实验室资源

步骤二:远程服务器环境登录

步骤三:Jenkins服务启动

步骤四:工具包获取

步骤五:源码迁移扫描文件准备

步骤六:软件迁移评估扫描文件准备

(2)Jenkins工程配置

Agent管理

Jenkins迁移扫描插件安装

Jenkins凭据创建

(3)扫描任务创建

步骤一:创建pipline Project

步骤二:扫描任务配置

步骤三:扫描任务启动 

1. 准备工作

步骤一:申请鲲鹏远程实验室资源

接下来的体验过程我们会在鲲鹏远程实验室资源上进行:

云开发服务提供了在线IDE,用户申请完可以直接在页面打开在线IDE进行代码迁移、开发调试、编译、调优及诊断等功能。

云测试服务面向开发者提供基于鲲鹏云环境兼容性测试、可靠性测试、安全测试、功能测试和性能测试服务,帮助开发者快速发现和定位应用软件运行在鲲鹏环境的问题。

远程服务器预装“一站式”开发套件,包括鲲鹏代码迁移工具(含鲲鹏原生开发框架和调试器)、鲲鹏编译工具链、鲲鹏性能分析工具,动态二进制翻译工具(ExaGear)。开发者可远程便捷SSH登录,灵活使用。

Jenkins需要启动服务后在web页面中使用,无需使用在线IDE模式,所以使用远程服务器 (黑框模式)。开发者在申请远程服务器后可以直接通过MobaXterm/Xshell访问远程服务器,启动Jenkins服务,再通过本地浏览器访问web页面进行操作,降低了开发者在鲲鹏上的迁移评估门槛。

鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,点击“立即申请”后进入申请页面,在远程服务器的“立即申请”按钮申请:

之后输入自己的邮箱地址,选择openEuler 20.03 LTS-SP1(以实际可选的为准)系统,申请成功后,鲲鹏社区将环境信息发送到您填写的邮箱地址。

步骤二:远程服务器环境登录

下载并安装Uni VPN Client 客户端,下载地址见:http://www.leagsoft.com/doc/article/103107.html

双击客户端“Uni VPN”快捷方式,点击“新建连接”,选择“导入配置”,配置文件见鲲鹏社区发送的邮件中文件名为“xxx.xxx.xxx.xxx.ini”的附件。



导入完成后,点击“连接”按钮,然后输入“用户名”和“密码”,然后点击“登录”按钮,VPN用户信息见鲲鹏社区发送的邮件正文中“VPN用户名”和“VPN密码”。

可使用XShell/MobaXterm工具,输入IP地址和用户名,可远程登录服务器,“远端主机”和“用户名”见鲲鹏社区发送的邮件正文中“服务器弹性IP”和“SSH用户名”。

步骤三:Jenkins服务启动

登录远程登录服务器后开始操作:

确保8080端口防火墙开启, 请执行以下命令开启:

firewall-cmd --zone=public --add-port=8080/tcp --permanent
systemctl restart firewalld
firewall-cmd --list-ports

防火墙开启成功如下图所示:

当前环境已在/opt/cmd目录预置2.387.2版本jenkins.war,启动jenkins服务:

cd /opt/cmd; java -jar jenkins.war --httpPort=8080

FAQ:

在后续使用时,因网络中断或长时间未使用等原因可能会出现jenkins服务断连的问题,需要重新登录远程服务器后重启服务。以下为可能遇到的两种问题,可参考解决:

(1) Network error: Software caused connection abort

原因:网络原因导致远程服务器连接中断

处理方法:

重新使用XShell/MobaXterm登录远程服务器,启动jenkins服务:

cd /opt/cmd; java -jar jenkins.war --httpPort=8080

(2) Failed to start Jetty

原因:8080端口被占用

处理方法:

查询当前占用8080端口的进程并关闭,重启jenkins服务:

ps -ef | grep jenkins
kill -9 ******  //请替换为占用8080端口的实际进程id
cd /opt/cmd; java -jar jenkins.war --httpPort=8080

进程id获取示例:

启动Jenkins服务成功后,得到如下图所示信息:

复制密码信息,在本地用户桌面打开浏览器,访问jenkins服务:http://hostIP:8080(hostIP即为远程实验室资源服务器弹性IP,可以从邮件中获取)

输入密码后,点击继续。选择安装推荐的插件:此步骤为Jenkins官方推荐的基础服务插件安装,方便后续使用。

 

完成后创建管理员用户,后续可通过该账户进行Jenkins管理。使用admin账户继续。

完成后,可以访问到下图所示服务页面,保存并完成。

可得到如下所示页面,jenkins服务启动成功且配置完成。

步骤四:工具包获取

Porting Advisor插件配置所需软件包如下表所示:

鲲鹏远程服务器资源为arm架构,已在/opt/目录预置安装DevKit工具,无需用户手动上传,仅需获取porting-advisor-plugin.hpi存放用户本地目录即可。

获取Porting Advisor相关软件包:

软件包名称

软件包说明

获取方法

备注

存放路径

porting-advisor-plugin.hpi

PortingAdvisorJenkins插件

下载

需要下载到用户本地目录,后续体验环节需要使用

用户本地目录

步骤五:源码迁移待扫描文件准备

本文以smartdenovo作为迁移扫描示例,当前代码文件已预置在远程服务器/opt/DevKit/workspace/devadmin/porting/sourcecode/smartdenovo-master目录。smartdenovo是一个同时适用于pacbio和nanopore测序数据的denovo组装软件,它是一款基于C语言开发的开源软件。

步骤六:软件迁移评估待扫描文件准备

以CMake作为迁移扫描示例,当前软件包已预置在远程服务器/opt/DevKit/workspace/devadmin/porting/package/cmake-3.19.8-Linux-x86_64.tar.gz目录。CMake是一个开源、跨平台的工具系列,旨在于构建、测试和打包软件。

2.Jenkins工程配置

(1)Agent管理

说明:构建使用的机器可以通过Jenkins进行管理,统称为node,可在构建中通过label进行调用。此步骤是将jenkins运行的服务器同时配置为node,以供后续工程使用。

操作步骤

步骤 1 Jenkins首页左侧导航栏点击 构建执行状态

步骤 2 点击New Node进行节点新增。

创建Node

填写Node详细信息,如下图所示:

执行机状态和标签显示正确则配置完成。


步骤3:登陆远程服务器,修改slave节点ip地址

cd ~ # 回到root目录
ssh-keygen # 三次回车
ssh xxx.xxx.xxx.xxx  # Slave节点机的ip地址
cd .ssh/
chmod 700 known_hosts

(2)Jenkins迁移扫描插件安装

本文使用Jenkins 2.387.2版本和porting-advisor-plugin.hpi 1.0.0版本进行演示,不同版本Jenkins部分描述可能略有差异。

进入Jenkins服务页面,单击“Dashboard”,在左侧导航页面选择“系统管理”进入“Manage Jenkins”页面,在“系统配置”部分单击“插件管理”,进入“Plugin Manager”页面,如下图所示 :

在左侧导航页面选择“Advanced settings”进入高级设置页面。在“Deploy Plugin”部分单击选择,选择本地已获取的hpi类型插件包进行上传。插件包上传后单击“Deploy”完成插件安装,如下图所示。

安装HTML报告展示插件(HTML Publisher plugin),确保网络连通且插件源可用,然后在“Available plugins”页面搜索框中搜索插件名称,勾选后点单击“Install without restart”,如下图所示:

(3)Jenkins凭据创建

操作步骤

步骤一:进入Jenkins服务页面,在左侧导航栏页面单击“Manage Jenkins”,进入jenkins工程管理页面,选择“Credentials”,进入后点击“全局”,进入Credentials管理页面,如下图所示。单击“Add Credentials”添加新的凭据。

步骤二:填写账号及密码信息,添加新的凭据,当前Jenkins对应代码迁移工具23.0.T10。

步骤三:添加凭据后,返回“Credentials”页面,其中ID即为token值,请记录该值以便后续工程中配置使用。


(4)获取机器IP

ssh登陆远程实验室资源服务器弹性IP,执行以下命令查询私有IP地址,如下图所示。

ifconfig

在工程创建过程中使用该IP。

3.源码扫描任务参数说明

源码扫描参数说明如下表格所示:

参数名称

默认值

描述

serviceType

webserver

采用web模式调度PortingAdvisor工具

service

sourceCheck

源码扫描功能

webserverIp

-

PortingAdvisor工具安装时配置的Web Server IP地址(备注:远程实验室资源服务器本机IP,参考“获取机器IP”章节)

webserverPort

8087

PortingAdvisor工具安装时配置的HTTPS端口

scanpath

-

必选参数。

待扫描的文件或路径: 路径使用全路径。 可以输入多个路径,用“,”隔开。预置路径:/opt/DevKit/workspace/devadmin/porting/sourcecode/smartdenovo-master。

用户上传源码路径:/opt/DevKit/workspace/devadmin/porting/sourcecode/

targetos

openeuler20.03

必选参数。软件需要迁移的Target Linux OS的名称和版本。

可选择以下操作系统:"centos7.6", "neokylinv7u5", "neokylinv7u6", "deepinv15.2", "ubuntu18.04.x", "linxos6.0.90","debian10", "susesles15.1", "euleros2.8", "centos7.4", "centos7.5", "centos7.7", "openeuler20.03", "openeuler22.03", "openeuler20.03sp1", "openeuler20.03sp2", "openeuler20.03sp3", "centos8.0", "centos8.1", "centos8.2", "uos20sp1", "kylinv10sp1", "kylinv10sp2", "ubuntu20.04.x", "uoseuler20","uos20-1020e", "bclinux7.6", "bclinux7.7", "isoft5.1", "openeuler22.03sp1", "uos20-1050e","kylinsecos3.4"

targetkernel

5.10.0

按照targetos填写对应targetkernel版本,对应关系如下:

BC-Linux 7.6支持4.19.25

BC-Linux 7.7支持4.19.25

CentOS 7.4支持4.11.0
CentOS 7.5支持4.14.0
CentOS 7.6支持4.14.0
CentOS 7.7支持4.18.0
CentOS 8.0支持4.18.0
CentOS 8.1支持4.18.0
CentOS 8.2支持4.18.0
Deepin V15.2支持4.19.34
Debian 10支持4.14.0
EulerOS 2.8支持4.19.36
iSoft 5.1支持4.19.90
Kylin V10 SP1支持4.19.90
Kylin V10 SP2支持4.19.90
KylinSecOS 3.4 支持4.19.90
LinxOS 6.0.90支持4.19.0
NeoKylin V7U5支持4.14.0
NeoKylin V7U6支持4.14.0
openEuler 20.03支持4.19.90
openEuler 20.03 SP1支持4.19.90
openEuler 20.03 SP2支持4.19.90
openEuler 20.03 SP3支持4.19.90
openEuler 22.03 支持5.10.0
openEuler 22.03 SP1支持5.10.0
SUSE SLES 15.1支持4.12.14
Ubuntu 18.04.x支持4.15.0
Ubuntu 20.04.x支持5.4.0
UOS 20 SP1支持4.19.0
UOS20-1020e支持4.19.90
UOS20-1050e支持4.19.90
uosEuler 20支持4.19.90

constructtools

make

扫描代码为解释型语言时,可以为空。可选择以下构建工具:make、cmake、automake、go

cmd

make

扫描代码为解释型语言时,可以为空。

编译命令需根据构建工具配置文件确定。

gfortran

-

提供Fortran编译版本。

GFORTRAN 7/8/9

FLANG 2.1.0/2.3.0/2.4.0/2.5.0/2.5.0.1

interpreted

true

显示是否进行interpreted扫描。

customizedmacros

-

自定义x86宏

输入自定义宏时,多个宏之间请用分号“;”进行分隔。

4.软件包扫描任务参数说明

软件包扫描参数说明如下表格所示:

参数名称

默认值

描述

serviceType

webserver

采用web模式调度PortingAdvisor工具

service

binaryCheck

软件包扫描功能

webserverIp

-

PortingAdvisor工具安装时配置的Web Server IP地址(备注:远程实验室资源服务器本机IP,参考“获取机器IP”章节)

webserverPort

8087

PortingAdvisor工具安装时配置的HTTPS端口

scanpath

-

必选参数

待扫描的路径: 路径需使用绝对路径。

预置路径:/opt/DevKit/workspace/devadmin/porting/package/cmake-3.19.8-Linux-86_64.tar.gz,

用户上传软件包路径:/opt/DevKit/workspace/devadmin/porting/ package /

说明:

 支持使用通配符“*”,输入包含通配符“*”时必须添加双引号。

 当输入内容中不包含具体文件名,仅为路径时,工具将扫描路径下的所有的RPM、JAR、DEB、TAR、ZIP、GZIP、WAR和EAR文件。
 可以输入多个文件或多个路径,需用“,”隔开。

instpath

-

软件已安装路径。

PortingAdvisor服务在x86环境安装时可用。

targetos

-

可选参数。软件需要迁移的Target Linux OS的名称和版本。

可选择以下操作系统:

"centos7.6", "neokylinv7u5", "neokylinv7u6", "deepinv15.2", "ubuntu18.04.x", "linxos6.0.90","debian10", "susesles15.1", "euleros2.8", "centos7.4", "centos7.5", "centos7.7", "openeuler20.03", "openeuler22.03", "openeuler20.03sp1", "openeuler20.03sp2", "openeuler20.03sp3", "centos8.0", "centos8.1", "centos8.2", "uos20sp1", "kylinv10sp1", "kylinv10sp2", "ubuntu20.04.x", "uoseuler20","uos20-1020e", "bclinux7.6", "bclinux7.7", "isoft5.1", "openeuler22.03sp1", "uos20-1050e","kylinsecos3.4"

targetkernel

5.10.0

按照targetos填写对应targetkernel版本,对应关系如下:

BC-Linux 7.6支持4.19.25

BC-Linux 7.7支持4.19.25

CentOS 7.4支持4.11.0
CentOS 7.5支持4.14.0
CentOS 7.6支持4.14.0
CentOS 7.7支持4.18.0
CentOS 8.0支持4.18.0
CentOS 8.1支持4.18.0
CentOS 8.2支持4.18.0
Deepin V15.2支持4.19.34
Debian 10支持4.14.0
EulerOS 2.8支持4.19.36
iSoft 5.1支持4.19.90
Kylin V10 SP1支持4.19.90
Kylin V10 SP2支持4.19.90
KylinSecOS 3.4 支持4.19.90
LinxOS 6.0.90支持4.19.0
NeoKylin V7U5支持4.14.0
NeoKylin V7U6支持4.14.0
openEuler 20.03支持4.19.90
openEuler 20.03 SP1支持4.19.90
openEuler 20.03 SP2支持4.19.90
openEuler 20.03 SP3支持4.19.90
openEuler 22.03 支持5.10.0
openEuler 22.03 SP1支持5.10.0
SUSE SLES 15.1支持4.12.14
Ubuntu 18.04.x支持4.15.0
Ubuntu 20.04.x支持5.4.0
UOS 20 SP1支持4.19.0
UOS20-1020e支持4.19.90
UOS20-1050e支持4.19.90
uosEuler 20支持4.19.90

5. 工程任务创建

步骤一:创建pipeline Project

进入Jenkins服务页面,在左侧导航栏页面单击“新建任务”,进入工程创建页面。

如下图所示,在工程创建页面输入“testproject”并选择工程类型为“流水线”,单击“OK”跳转至Configure。

步骤二:扫描任务配置

完成script编写后填入此处并保存。


说明:Pipeline script使用模板配置,可从Jenkinsfile文件中获取了Pipeline script模板。详细模板信息如下,其中step内容是需要根据不同工程进行适配修改,可参考具体任务参数说明:

pipeline {
    agent none
    options {
        buildDiscarder(logRotator(numToKeepStr: '20'))
    }
    stages {
        stage('PortingPlugin Executing') {
            matrix {
                axes {
                    axis {
                        name 'PLATFORM'
                        // 目标slave
                        values 'slave-1'
                    }
                }
                agent { label "${PLATFORM}" }
                options {
                    timeout(time: 1, unit: 'HOURS')
                }
                stages {
                    stage('PortingPlugin Executing') {
                        environment {
                            // 引入执行用户凭据(必须提前在Jenkins管理中配置)
                            BITBUCKET_COMMON_CREDS = credentials('c25114ad-be8e-4fe4-915d-a73c15275b94')
                        }
                        steps {
                            // 运行插件
                            step([$class: 'PortingAdvisorBuilder',
                                serviceType: "webserver",
                                service: "sourceCheck",
                                webserverIp: "XXX.XXX.XXX.XXX",
                                webserverPort: "8087",
                                command: "",
                                prefix: "",
                                scantype: "",
                                scanpath: "/opt/DevKit/workspace/devadmin/porting/sourcecode/smartdenovo-master",
                                instpath: "",
                                compiler: "",
                                cmd: "make",
                                targetos: "openeuler22.03",
                                targetkernel: "5.10.0",
                                extendedparameter: "",
                                hardwareArchitecture: "",
                                constructtool: "make",
                                enableSVE: "true",
                                compilerType: "clang",
				osMappingDir: "",
                                gllvm: "true",
				autoFix: "true",
                                gfortran: "",
                                customizedmacros: "",
                                compilecommand: "make",
                                interpreted: true,
                                sourceenhancecheck: false,
                                username: "$BITBUCKET_COMMON_CREDS_USR",
                                password: "$BITBUCKET_COMMON_CREDS_PSW"
                            ])
                        }
                        post {
                            always {
                                // 测试报告(模板)
                                // junit('**/build/test-results/**/*.xml')
                                // web测试报告(模板)
                                publishHTML (target: [
                                      allowMissing: false,
                                      alwaysLinkToLastBuild: false,
                                      keepAll: true,
                                      reportDir: '.',
                                      reportFiles: '*.html',
                                      reportName: "Porting Report"
                                ])
                            }
                        }
                    }
                }
            }
        }
    }
}

Pipeline script模板配置关键操作步骤:

a.根据实际环境信息对agent label进行修改。

b.获取创建的用户凭据(可参考‘Jenkins凭据创建’章节),并填写到Jenkinsfile中。

c.选择需要使用的功能,对模板参数进行修改(对应扫描功能不涉及的参数,请保持其默认值切勿删除),完成script编写后,将内容复制粘贴至工程pipeline scripts文本框中,点击Save按钮,完成配置。


步骤三:扫描任务启动

在扫描任务左侧“Status”页面下单击“立即构建”启动任务。

工程第一次执行时,工具安装部署花费大约1min,扫描时间根据代码量会有差异,请耐心等待。

当最新一次构建任务状态为绿色时,表示扫描任务已完成。


单击“Build History”部分最新一次构建任务数字,跳转后在左侧导航栏点击“Console Output”即可查看构建过程日志。

6. 扫描报告查看

构建任务成功执行完成后,单击工程页面左侧导航栏“Porting Report”,即可查看扫描结果。


通过切换顶部页签查看不同扫描任务报告。


如果报告格式异常,在jenkins主页面,单击“系统管理”,选择“脚本命令行”。


跳转至“Script Console”页面,在输入框中输入脚本。

参考脚本如下:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "script-src 'unsafe-inline'")

点击运行,完成适配。

恭喜

到这里整个实验流程就已经结束了,通过上面的软件迁移扫描动作我们拿到了软件迁移评估报告,完成Jenkins集成Porting Advisor插件实现代码迁移。

除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏DevKit迁移工具:

鲲鹏代码迁移工具介绍(课程):

https://www.hikunpeng.com/learn/courses-list/detail/1590560841222623234

手把手带你使用代码迁移工具实现源码迁移(课程):

https://www.hikunpeng.com/learn/courses-list/detail/1556841082254745602

鲲鹏代码迁移工具-快速入门(文档):

https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps.html

本页内容