持续集成JenkinsAPI常见用法
持续集成JenkinsAPI常见用法
jenkins(持续集成开源工具)提供了丰富的api接口,基本上所有的操作都可以使用curl来从后台调度,包括:创建项目,禁用项目,启用项目,获取项目描述,获取配置文件,普通触发,scm触发,带参数触发,带补丁触发。
【背景】:部门在搞持续集成,使用jenkins作为核心调度,要再其基础上进行二次封装,所以需要研究下jenkins的api。
笔者主要负责搭建平台,在研究用法也花费了些时间,本文主要做个简要的记录,希望能为各位朋友节省时间。
【环境】:(默认读者已经具备了基本的持续集成经验和jenkins用法)
1. Jenkins1.455
2. 系统Suse
3. Tomcat 6.0.37
4. Java 1.6.0_26
5. patch-parameter
【API介绍】
Jenkins提供了html、json、python API,实质都是以http get/post方式调用的。
查看http://www.xxx.xxx/jenkins/api/ 即可得到相应的说明,如图:
【API实践】
1.创建
curl -X POST http://www.xxx.xxx/jenkins/createItem?name=JavaStd --user peterguo:peterguo --data-binary "@javastd.config.xml" -H "Content-Type: text/xml"
2.禁用
curl -X POST http://www.xxx.xxx/jenkins/job/JavaStd/disable --user
peterguo:peterguo
3.启用
curl -X POST http://www.xxx.xxx/jenkins/job/JavaStd/enable --user
peterguo:peterguo
4.删除
curl -X POST http://www.xxx.xxx/jenkins/job/JavaStd/doDelete --user
peterguo:peterguo
5.获取项目描述
curl -X GET http://www.xxx.xxx/jenkins/job/JavaStd/description --user
peterguo:peterguo
6.获取配置文件
curl -X GET http://www.xxx.xxx/jenkins/job/JavaStd/config.xml --user
peterguo:peterguo
7.触发SCM检查
curl -X GET http://www.xxx.xxx/jenkins/job/JavaStd/polling --user
peterguo:peterguo
8.普通触发
curl -X GET http://www.xxx.xxx/jenkins/job/JavaStd/build --user peterguo:peterguo 9.带参数触发
curl -X GET
"http://www.xxx.xxx/jenkins/job/helloworld-freestyle/buildWithParameters?bAllTest =&Choices=2&strParam=abc" --user peterguo:peterguo
10.带参数和补丁触发
curl -X POST
"http://www.xxx.xxx/jenkins/job/helloworld-freestyle/buildWithParameters?bAllTest
=&Choices=2&strParam=abc" --user peterguo:peterguo -F "action=upload" -F "patch.diff=@OtherTest.java.patch"
注:带补丁触发需要先安装补丁插件,并设置项目的补丁参数
【Python调用】
提供python使用pycurl调用的例子片段,实际和curl调用一样,优点是易整合。
view source
print?
01 import pycurl
02 url = "http://10.129.145.112:8081/jenkins/job/helloworld-freestyle/config.xml"
03 crl = pycurl.Curl()
04 crl.setopt(pycurl.VERBOSE,1)
05 crl.setopt(pycurl.FOLLOWLOCATION, 1)
06 crl.setopt(pycurl.MAXREDIRS, 5)
07 crl.setopt(ERPWD, "peterguo:peterguo")
08
09 crl.setopt(pycurl.CONNECTTIMEOUT, 60)
10 crl.setopt(pycurl.TIMEOUT, 300)
11 crl.setopt(pycurl.HTTPPROXYTUNNEL,1)
12 crl.fp = StringIO.StringIO()
13
14 crl.setopt(pycurl.URL, url)
15 crl.setopt(crl.WRITEFUNCTION, crl.fp.write)
16 crl.perform()
17 ret = crl.fp.getvalue()。
持续集成:JenkinsAPI简单使用
持续集成:JenkinsAPI简单使⽤Jenkins具有丰富的API接⼝,可以通过调⽤API接⼝实现对Job的触发、删除、查看任务状态等操作,⽀持HTTP协议,⽀持⽤户名、密码认证,提供的这些接⼝可以实现对 Jenkins 的控制。
下⾯介绍Jenkins API的使⽤实例。
先创建⼀个有Job任务运⾏和状态查询权限的⽤户,可使⽤admin⽤户;新建⼀个项⽬(可参考)Jenkins API调⽤⽰例远程调⽤ Jenkins API返回最新任务编号GET请求URL::port/job/任务名/lastBuild/buildNumberimport requestsurl = "http://admin:admin@192.168.30.8:8080/job/demo/lastBuild/buildNumber"ret = requests.get(url)print(ret.text)输出:17远程调⽤ Jenkins API查询任务状态GET请求URL::port/job/任务名/<build number>/api/jsonimport jsonimport requestsurl = "http://admin:admin@192.168.30.8:8080/job/demo/17/api/json"ret = requests.get(url)print(json.dumps(ret.json(),indent=2))返回的⽇志{"_class": "hudson.model.FreeStyleBuild","actions": [{"_class": "hudson.model.CauseAction","causes": [{"_class": "hudson.model.Cause$UserIdCause","shortDescription": "Started by user anonymous","userId": null,"userName": "anonymous"}]},{},{"_class": "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"}],"artifacts": [],"building": false,"description": null,"displayName": "#17","duration": 109,"estimatedDuration": 222,"executor": null,"fullDisplayName": "demo #17","id": "17","keepLog": false,"number": 17,"queueId": 3,"result": "SUCCESS","timestamp": 1615705287802,"url": "http://192.168.30.8:8080/job/demo/17/","builtOn": "","changeSet": {"_class": "hudson.scm.EmptyChangeLogSet","items": [],"kind": null},"culprits": []}远程调⽤ Jenkins API启动任务使⽤POST请求⽅法:URL::port/job/任务名/buildimport requestsurl = "http://admin:admin@192.168.30.8:8080/job/demo/build"ret = requests.post(url)print(ret.text)Jenkins 跨站请求伪造保护采取 Crumb(碎⽚⽣成器),可以使⽤jenkinsapi库来调⽤api Python jenkinsapi库jenkinsapi库封装了Jenkins api 的调⽤⽅法安装:$ pip install jenkinsapi下⾯代码实现启动job名为demo的任务from jenkinsapi.jenkins import Jenkinsjk = Jenkins('http://192.168.30.8:8080', username='admin', password='admin', useCrumb=True) # print(jk.keys())job_name = 'demo'if jk.has_job(job_name):my_job = jk.get_job(job_name)if not my_job.is_queued_or_running():try:last_build = my_job.get_last_buildnumber()except:last_build = 0build_num = last_build + 1# 启动任务try:jk.build_job(job_name)except Exception as e:print(str(e))while True:if not my_job.is_queued_or_running():print("Finished")print(f"build_num:{build_num}")break输出:Finishedbuild_num:20--THE END--欢迎关注公众号:「测试开发⼩记」及时接收最新技术⽂章!。
使用Jenkins实现持续集成(十)
Jenkins是一个开源的持续集成工具,它可以帮助开发团队自动化构建、测试和部署软件项目。
在当今快节奏的软件开发环境中,持续集成已经成为提高软件质量和开发效率的关键实践之一。
本文将探讨如何使用Jenkins实现持续集成,并介绍一些常用的Jenkins插件和最佳实践。
Jenkins的核心功能是构建和测试软件项目。
通过Jenkins的web 界面,开发团队可以创建一个或多个构建任务,这些构建任务可以根据触发条件自动执行。
通常,这些触发条件可以是代码库的提交或定期执行。
一旦构建任务开始执行,Jenkins将自动下载代码,编译源代码,并运行测试用例。
如果构建任务成功完成,Jenkins将生成可部署的软件包。
否则,Jenkins将通知开发团队有错误发生,并提供构建日志以便进行故障排除。
除了构建和测试,Jenkins还可以扩展到更多的软件开发活动。
例如,Jenkins可以与版本控制系统(如Git)集成,以实现自动化的代码部署。
开发团队可以配置Jenkins在代码库的特定分支上进行触发,每次有新的代码提交时,Jenkins将自动将代码部署到测试环境。
如果测试通过,Jenkins还可以将代码部署到生产环境。
这种自动化部署的方式大大提高了软件发布的效率和可靠性。
为了更好地管理和监控Jenkins的构建任务,开发团队可以使用一些常用的Jenkins插件。
例如,Jenkins的“任务调度”插件可以帮助开发团队设定构建任务的定时执行。
这对于周期性的集成测试和部署非常有用。
Jenkins的“邮件通知”插件可以在构建任务失败时自动发送邮件通知给相关人员,使得开发团队可以及时响应和解决问题。
Jenkins的“代码覆盖率”插件和“静态代码分析”插件可以帮助开发团队评估和改进软件质量。
这些插件提供了重要的信息和指导,以便开发团队做出更好的决策。
除了使用插件,还有一些最佳实践可以帮助开发团队更好地使用Jenkins进行持续集成。
首先,开发团队应该使用版本控制系统来管理源代码,并且保持代码库的干净和一致。
jenkins的用法
jenkins的用法Jenkins是一个开源的持续集成工具,用于自动化构建、测试和部署软件项目。
它提供了丰富的功能和灵活性,使得团队能够更加高效地进行软件开发和交付。
下面将介绍Jenkins的几种常见用法。
1. 自动化构建:Jenkins可以持续监测代码版本库,一旦发现代码有更新,就会自动触发构建过程。
开发人员可以在Jenkins上配置构建任务,指定构建时要执行的操作,如编译代码、运行单元测试、生成文档等。
通过自动化构建,团队能够快速检测代码错误并提供可靠的构建结果。
2. 自动化测试:Jenkins可以集成各种测试工具,例如JUnit、Selenium等,实现自动化测试的自动触发和执行。
团队可以通过在Jenkins上配置测试任务,指定要运行的测试用例和测试环境,从而提高测试的自动化程度和覆盖率。
自动化测试可以帮助团队快速发现和修复代码中的缺陷,并确保软件质量。
3. 持续部署:Jenkins可以与版本控制系统和部署工具集成,实现持续集成和持续部署的自动化流程。
一旦代码通过了构建和测试阶段,Jenkins可以自动将代码部署到目标环境中,并进行必要的配置和发布步骤。
持续部署可以大大缩短软件的交付周期,提高团队协作效率。
4. 插件扩展:Jenkins提供了丰富的插件生态系统,支持各种扩展和定制功能。
团队可以根据自己的需求,在Jenkins上安装和配置相应的插件,以满足特定的项目要求。
这些插件可以包括构建工具、代码质量分析工具、通知插件等,使得团队能够根据自己的需要定制和扩展Jenkins的功能。
总之,Jenkins作为一个持续集成工具,在软件开发和交付过程中起到了至关重要的作用。
通过自动化构建、测试和部署,团队能够提高软件质量、加快交付速度,并更好地组织和管理项目。
使用Jenkins可以帮助团队构建高效的软件交付流水线,实现持续集成和自动化的目标。
掌握Android测试的持续集成和持续交付使用Jenkins进行自动化
掌握Android测试的持续集成和持续交付使用Jenkins进行自动化持续集成和持续交付是软件开发中非常重要的流程,通过自动化测试来实现质量保证和快速交付。
在Android应用程序开发中,掌握Android测试的持续集成和持续交付使用Jenkins进行自动化是非常关键的。
本文将介绍如何使用Jenkins进行Android测试的持续集成和持续交付。
一、什么是持续集成和持续交付持续集成(Continuous Integration,简称CI)是指开发者将代码频繁地合并到共享代码仓库,并通过自动化构建和测试工具对代码进行验证和测试,以确保开发过程中产生的新代码与原有代码的兼容性和一致性。
持续交付(Continuous Delivery,简称CD)是指在持续集成的基础上,自动化地将软件部署到测试环境、预发布环境甚至生产环境中,并进行自动化测试和验证,从而实现更快速、更可靠的软件交付流程。
二、Jenkins简介Jenkins是一个开源的、用Java编写的持续集成工具,可以帮助我们构建和测试软件项目。
Jenkins提供了丰富的插件和可扩展性,可以适应各种不同的项目需求,并支持自动化构建、测试和发布。
三、Android测试的持续集成要实现Android测试的持续集成,需要使用以下工具和技术:1. 版本控制工具首先,我们需要选择一种版本控制工具,如Git或Subversion,以便开发者能够共享和管理代码。
2. 自动化构建工具在Android应用程序开发中,我们可以使用Gradle作为自动化构建工具。
Gradle可以帮助我们配置和管理项目的依赖项,并自动化地构建和编译项目。
3. 单元测试框架为了保证代码的质量和可靠性,我们需要使用合适的单元测试框架,如JUnit或Robolectric,编写并运行单元测试用例。
4. 集成测试框架除了单元测试,我们还需要进行集成测试来验证不同模块之间的交互和兼容性。
Android提供了自带的Instrumentation框架来进行集成测试。
如何使用Jenkins进行持续集成和部署
如何使用Jenkins进行持续集成和部署一、Jenkins的介绍Jenkins是一个开源的持续集成工具,可用于自动执行软件构建、测试和部署等任务。
它具有灵活的插件扩展能力,可以与各种开发工具和平台无缝集成。
使用Jenkins可以大大减轻开发人员的工作负担,提高软件交付的效率和质量。
二、为什么使用持续集成和部署持续集成和部署是现代软件开发流程中的重要环节。
通过持续集成,可以将开发者提交的代码自动构建、编译和运行测试,及时发现和修复错误。
而持续部署则可以自动将经过测试的代码部署到生产环境中,实现软件的快速交付和更新。
这样可以大大缩短软件的开发周期,减少人力资源的投入,提高软件的质量和稳定性。
三、配置Jenkins环境1. 安装Jenkins:在服务器上安装Jenkins,并启动Jenkins服务。
2. 安装必要插件:根据项目需求,安装适当的插件,如Git插件、Maven插件等。
3. 配置全局工具:配置JDK、Maven等开发工具的路径,确保能够在构建过程中正确调用。
四、创建Jenkins项目1. 新建一个项目:在Jenkins中创建一个新的项目,并设置好项目的名称和描述。
2. 配置源码管理:选择适合的源码管理工具,如Git,配置仓库地址和访问凭证。
3. 设置触发器:设置项目的触发方式,可以是定时触发、代码提交触发或者其他方式。
4. 构建环境配置:配置项目的构建环境,如设置构建所需的环境变量或者其他必要的执行条件。
5. 构建步骤配置:配置项目的构建步骤,如代码拉取、编译、运行测试等。
6. 构建后操作配置:配置项目构建完成后的操作,如生成构建报告、发送邮件通知等。
五、使用Jenkins进行持续集成1. 源码管理和拉取:在Jenkins项目配置中选择Git作为源码管理工具,并配置仓库地址和访问凭证。
设置好触发器后,Jenkins 会定时检查代码仓库,发现有新代码提交后自动拉取最新代码。
2. 构建过程:配置构建步骤,可以通过调用Maven或者其他构建工具来编译代码。
软件开发中持续集成工具的使用方法
软件开发中持续集成工具的使用方法在软件开发过程中,持续集成工具是一种非常重要的工具,它能够帮助开发团队实现代码的集成、持续构建和自动化测试。
本文将介绍几种常用的持续集成工具,以及它们的使用方法。
1. JenkinsJenkins是一个开源的持续集成工具,它广泛应用于各种软件开发项目中。
使用Jenkins可以轻松地构建、测试和部署代码。
首先,你需要安装Jenkins并启动它。
安装完成后,你可以通过访问Jenkins的用户界面来配置和管理项目。
在Jenkins中,你可以创建一个新的项目并配置它的构建过程。
你可以指定代码仓库的URL,设置触发构建的条件(如代码提交或定时触发),然后配置构建过程中所需的构建步骤,例如编译代码、运行测试等。
一旦项目配置完成,Jenkins将会自动执行构建过程并提供相应的构建报告。
你可以查看构建日志、测试报告和其他相关的构建结果。
2. Travis CITravis CI是一种持续集成工具,它主要用于构建和测试GitHub仓库中的代码。
它的配置非常简单,只需要在你的GitHub仓库中添加一个.travis.yml文件即可。
在.travis.yml文件中,你可以指定构建的环境、编译命令和测试命令。
Travis CI会根据这些配置自动构建、测试和部署你的代码。
Travis CI支持多种编程语言和构建工具,你可以根据自己项目的需要选择合适的配置。
3. GitLab CI/CDGitLab CI/CD是GitLab提供的一个集成式持续集成和部署工具。
它与GitLab的代码库紧密集成,通过配置文件来定义和管理构建过程。
与其他持续集成工具相比,GitLab CI/CD具有更强大的功能。
它支持并行构建、使用自定义的构建环境、自动触发构建和部署等。
你可以在代码库的根目录下创建一个.gitlab-ci.yml文件,并在其中配置构建和部署的过程。
GitLab CI/CD会自动读取该文件,并根据配置执行相关任务。
使用Jenkins实现持续集成(八)
使用Jenkins实现持续集成在软件开发领域,持续集成是一种旨在改进团队协作和软件质量的实践方法。
它通过频繁地将代码集成到共享代码仓库中,以便快速、自动化地构建、测试和部署软件。
Jenkins是一个流行的开源工具,它允许开发人员实现持续集成的自动化过程。
本文将探讨使用Jenkins实现持续集成的方法和优势。
一、安装和配置Jenkins要开始使用Jenkins,首先需要将其安装在本地或服务器上。
可以在Jenkins官方网站上找到适合不同操作系统的安装包。
安装后,通过访问Jenkins的Web界面来配置其基本设置,如管理用户、配置插件和设置构建环境等。
二、创建Jenkins任务在Jenkins中,任务是指对源代码进行编译、测试和部署的逻辑单元。
通过Jenkins的Web界面,可以创建不同类型的任务,如自由风格项目、多配置项目和流水线项目等。
选择适合的任务类型,根据项目需求配置相关的参数和构建步骤。
三、配置源代码管理持续集成的核心是对源代码管理的支持。
Jenkins支持多种版本控制系统,如Git、SVN和Mercurial等。
在任务配置中,需要选择正确的版本控制系统,并提供仓库URL和凭据等信息。
这样,Jenkins才能自动从版本控制系统中拉取代码进行构建。
四、设置构建触发器Jenkins支持多种触发器来驱动持续集成的自动化过程。
常见的触发器包括定时触发、代码提交触发和远程触发等。
根据项目需求,选择合适的构建触发器并进行配置。
例如,可以设置每天固定时间触发构建,或在代码提交到版本控制系统时自动触发构建。
五、配置构建过程在任务配置中,需要定义构建的具体步骤。
这包括编译代码、运行单元测试、生成文档、打包和部署等。
使用Jenkins提供的插件和工具,可以轻松地配置这些构建过程。
例如,可以使用Maven插件管理项目依赖并自动构建项目,或使用Docker插件将应用程序部署到容器中。
六、设置测试框架持续集成的另一个重要方面是自动化测试。
Jenkins持续集成工具配置与使用教学
Jenkins持续集成工具配置与使用教学第一章:介绍Jenkins持续集成工具Jenkins是一个开源的持续集成工具,它可以帮助开发团队自动化构建、测试和部署软件项目。
通过Jenkins,开发团队可以更快速、更频繁地发布新的软件版本,提高软件开发过程的效率和质量。
第二章:安装和配置Jenkins2.1 安装Jenkins安装Jenkins非常简单,只需要在官方网站下载Jenkins的安装包,然后按照提示一步一步进行安装即可。
安装完成后,Jenkins 将会在本地的8080端口上运行。
2.2 配置Jenkins安装完成后,打开浏览器,输入http://localhost:8080,进入Jenkins的Web界面。
首次进入时,需要输入管理员账号和密码进行配置。
配置完成后,可以进入Jenkins的控制面板。
第三章:理解和使用Jenkins的核心概念3.1 任务(Job)在Jenkins中,任务是指一个特定的构建项目。
开发团队可以根据自己的需求创建不同类型的任务,比如构建源码、进行单元测试、打包部署等。
3.2 构建(Build)构建是指在Jenkins中对任务进行编译、测试和部署等操作的过程。
每次构建可以生成一个独立的构建号,用于唯一标识该构建的版本。
3.3 流水线(Pipeline)流水线是Jenkins中的一个核心概念,它可以定义并管理整个构建过程。
通过在流水线中配置不同的阶段和步骤,开发团队可以实现自动化构建、测试和部署等操作。
第四章:配置Jenkins任务4.1 创建任务在Jenkins中,可以通过点击控制面板上的“新建任务”按钮来创建一个新的任务。
在创建任务时,需要选择任务类型和配置相关参数,比如源码地址、构建触发条件等。
4.2 配置任务参数在创建任务后,还可以配置任务的参数,以便在每次构建时自定义不同的参数。
比如,可以配置构建参数、环境变量等。
4.3 配置触发器可以根据需要配置不同的触发器来触发任务的构建。
使用Jenkins实现持续集成(五)
使用Jenkins实现持续集成在软件开发过程中,持续集成是一种重要的实践方法,它可以确保代码在不断改进的同时保持稳定并具有高质量。
而Jenkins作为一个开源的持续集成工具,可以帮助开发团队更好地实现持续集成的目标。
本文将探讨使用Jenkins实现持续集成的过程和优势。
一、Jenkins简介Jenkins是一款由Java编写的开源软件工具,它提供了一种易于使用的方式来实现持续集成和持续交付。
Jenkins的核心特点包括支持插件扩展、可编写的脚本和可视化界面。
开发人员可以使用Jenkins 来自动构建、测试和部署软件,从而提高开发效率和软件质量。
二、安装和配置Jenkins使用Jenkins实现持续集成首先需要安装和配置Jenkins。
首先,我们需要下载适用于操作系统的Jenkins安装包,并进行安装。
安装完成后,我们可以通过访问Jenkins的Web界面来进行配置。
在配置过程中,我们需要设置Jenkins的管理员账号和密码,以及指定Jenkins的工作目录等事项。
同时,还可以选择安装一些常用的插件,例如Git插件、Maven插件等,以支持特定的开发需求。
完成配置后,我们就可以开始使用Jenkins进行持续集成了。
三、Jenkins的持续集成流程Jenkins的持续集成流程是通过任务(Job)来完成的。
每个任务代表了一个特定的构建过程,可以根据项目的需求进行配置。
通常,一个常见的持续集成流程包括以下几个步骤:1. 获取代码:Jenkins会从代码库中获取最新的代码,并进行编译等操作之前,确保代码的准确性和一致性。
2. 构建项目:Jenkins会执行预定义的构建脚本或命令,根据项目的需求来完成项目的构建过程。
例如,可以进行编译、打包、生成文档等操作。
3. 进行单元测试:在构建完成后,Jenkins会自动运行预定义的单元测试来验证代码的正确性。
如果测试失败,Jenkins会提供详细的错误报告,开发人员可以针对问题进行修复。
使用Jenkins进行持续集成和部署的步骤和方法
使用Jenkins进行持续集成和部署的步骤和方法随着软件开发的不断发展,持续集成和部署已经成为了现代软件开发中不可或缺的环节。
Jenkins作为一款广泛使用的开源工具,为开发者提供了便捷的持续集成和部署解决方案。
本文将介绍使用Jenkins进行持续集成和部署的步骤和方法,帮助读者更好地理解和应用这一工具。
1. 安装和配置Jenkins首先,我们需要在服务器或本地机器上安装Jenkins。
Jenkins支持多种操作系统,可以根据自己的需求选择合适的版本进行安装。
安装完成后,通过访问Jenkins的URL来启动Jenkins服务。
在首次启动Jenkins时,需要进行一些基本的配置。
首先,根据提示找到默认的管理员密码,并输入到相应的字段中。
然后,选择安装推荐的插件,这些插件将为后续的操作提供支持。
等待插件安装完成后,创建一个管理员用户,并设置相应的用户名和密码。
最后,根据自己的需求进行其他配置,如选择时区、设置邮件通知等。
2. 创建Jenkins任务在Jenkins中,任务是指一个具体的构建或部署过程。
创建任务是使用Jenkins 进行持续集成和部署的基础。
点击Jenkins首页上的“新建任务”按钮,进入任务创建页面。
在任务创建页面中,首先需要给任务起一个名称,并选择任务类型。
Jenkins支持多种任务类型,如构建一个软件项目、执行一个Shell脚本等。
根据自己的需求选择合适的任务类型,并填写相应的配置信息。
3. 配置源代码管理持续集成和部署的核心是对源代码的管理和控制。
在任务配置页面的“源代码管理”部分,我们可以选择使用Git、SVN等版本控制系统来管理源代码。
配置源代码管理需要填写代码仓库的URL、认证信息等。
我们还可以设置代码分支、轮询间隔等参数,以实现自动触发构建的功能。
4. 设置构建触发器持续集成的一个重要特点是能够自动触发构建过程。
在任务配置页面的“构建触发器”部分,我们可以设置构建的触发条件。
