From 3fa8e51cde06c55939a5cccb7bb2a8c190c79796 Mon Sep 17 00:00:00 2001 From: Mikhail Naletov <36846182+okgolove@users.noreply.github.com> Date: Wed, 7 Mar 2018 15:34:13 +0200 Subject: [PATCH] Release 0.1.1 (#4) Release 0.1.1 --- .gitignore | 3 +- README.md | 26 ++++++++- atest/__init__.robot | 11 ++++ atest/basic.robot | 1 + atest/builds.robot | 25 +++++---- atest/execute.robot | 39 +++++++++++--- atest/jobs.robot | 54 ++++++++++--------- atest/lib/jenkins_keywords.robot | 38 +++++++++++++ atest/templates/job_parameterized_scratch.xml | 37 +++++++++++++ setup.py | 21 ++++++-- src/JenkinsLibrary/library.py | 15 ++++-- src/JenkinsLibrary/server.py | 51 +++++++++++++++--- src/JenkinsLibrary/version.py | 2 +- 13 files changed, 263 insertions(+), 60 deletions(-) create mode 100644 atest/lib/jenkins_keywords.robot create mode 100644 atest/templates/job_parameterized_scratch.xml diff --git a/.gitignore b/.gitignore index a5f8c66..d582b3c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ dist/ downloads/ eggs/ .eggs/ -lib/ lib64/ parts/ sdist/ @@ -101,3 +100,5 @@ ENV/ .mypy_cache/ .pre-commit-config.yaml +Pipfile + diff --git a/README.md b/README.md index 41238f7..1fee755 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,7 @@ Introduction ------------ JenkinsLibrary is a Robot Framework test -library which helps you to involve Jenkins in your tests. - +library which helps you to involve Jenkins in your tests. Installation ------------ @@ -16,3 +15,26 @@ Installation Just run: pip install robotframework-jenkins + +Usage +------------ + +You need to import Jenkins library: + + *** Settings *** + Library JenkinsLibrary +Then, you need to initialize Jenkins server with keyword: + + Set Jenkins Server url=http://example.com:8080 username=admin password=admin + +Example +------------ + *** Settings *** + Library JenkinsLibrary + + *** Test Cases *** + Jenkins Create And Run Job + [Setup] Set Jenkins Server url=http://example.com:8080 username=admin password=admin + Create Jenkins Job test_job + Start Jenkins Job test_job + diff --git a/atest/__init__.robot b/atest/__init__.robot index 24bbba8..85cc03a 100644 --- a/atest/__init__.robot +++ b/atest/__init__.robot @@ -4,6 +4,12 @@ Suite Setup Global Setup *** Variables *** ${url} http://127.0.0.1:8080 +${templates_dir} templates +${job_parameterized_scratch} job_parameterized_scratch.xml +&{job_parameterized_scratch_parameters} param_string=expected_string param_bool=False +${test_job_name} test_job +${second_test_job_name} blablabla_job + *** Keywords *** Wait For Container @@ -12,4 +18,9 @@ Wait For Container Global Setup Set Global Variable ${jenkins_address} ${url} + Set Global Variable ${templates_dir} atest/${templates_dir} + Set Global Variable ${job_parameterized_scratch} ${job_parameterized_scratch} + Set Global Variable ${test_job_name} ${test_job_name} + Set Global Variable ${second_test_job_name} ${second_test_job_name} + Set Global Variable ${job_parameterized_scratch_parameters} &{job_parameterized_scratch_parameters} Wait For Container diff --git a/atest/basic.robot b/atest/basic.robot index 825452e..033d868 100644 --- a/atest/basic.robot +++ b/atest/basic.robot @@ -1,5 +1,6 @@ *** Settings *** Library JenkinsLibrary +Resource lib/jenkins_keywords.robot *** Test Cases *** Keyword Without Init diff --git a/atest/builds.robot b/atest/builds.robot index 5fd5e00..a47947c 100644 --- a/atest/builds.robot +++ b/atest/builds.robot @@ -1,10 +1,8 @@ *** Settings *** Library JenkinsLibrary +Resource lib/jenkins_keywords.robot Suite Setup Set Jenkins Server url=${jenkins_address} username=admin password=admin -*** Variables *** -${test_job_name} test_job - *** Test Cases *** Get Builds (inexistent job) [Tags] job build @@ -12,11 +10,11 @@ Get Builds (inexistent job) ... Get Jenkins Job Builds ${test_job_name} Get Builds (existent jobs, multiple builds) - [Tags] job build - [Setup] Create Job And Run Multiple Builds + [Setup] Create Job And Run Multiple Builds ${test_job_name} count=3 [Teardown] Delete Jenkins Job ${test_job_name} ${builds} = Get Jenkins Job Builds ${test_job_name} Should Be True ${builds} + Log ${builds} Should Be Equal As Integers 1 ${builds['builds'][2]['number']} Should Be Equal As Integers 2 ${builds['builds'][1]['number']} Should Be Equal As Integers 3 ${builds['builds'][0]['number']} @@ -29,9 +27,14 @@ Get Builds (existent jobs, no builds) Should Not Be True ${builds['lastBuild']} Should Be Equal As Integers 1 ${builds['nextBuildNumber']} -*** Keywords *** -Create Job And Run Multiple Builds - Create Jenkins Job ${test_job_name} - Start Jenkins Job ${test_job_name} - Start Jenkins Job ${test_job_name} - Start Jenkins Job ${test_job_name} +Get Next Build Number + [Tags] job build + [Setup] Create Jenkins Job ${test_job_name} + [Teardown] Delete Jenkins Job ${test_job_name} + ${random_int} = Evaluate random.randint(2, 10) modules=random + :FOR ${run} IN RANGE ${random_int} + \ ${next_build_before} = Get Next Build Number ${test_job_name} + \ Should Be Equal As Integers ${run + 1} ${next_build_before} + \ Start Jenkins Job ${test_job_name} + \ ${next_build_after} = Get Next Build Number ${test_job_name} + \ Should Be Equal As Integers ${run + 2} ${next_build_after} diff --git a/atest/execute.robot b/atest/execute.robot index b65566e..c9a2ebc 100644 --- a/atest/execute.robot +++ b/atest/execute.robot @@ -1,11 +1,9 @@ *** Settings *** Library Collections Library JenkinsLibrary +Resource lib/jenkins_keywords.robot Suite Setup Set Jenkins Server url=${jenkins_address} username=admin password=admin -*** Variables *** -${test_job_name} test_job - *** Test Cases *** Wrong Params Type [Tags] execute @@ -14,16 +12,41 @@ Wrong Params Type Run Keyword And Expect Error Params must be a dictionary, not *\ ... Start Jenkins Job ${test_job_name} test_string -Run Existent Job Without Params +Run Inexistent Job + [Tags] execute + Run Keyword And Expect Error Can't find specified job: ${test_job_name}\ + ... Start Jenkins Job ${test_job_name} + +Run Existent Unparameterized Job Without Params [Tags] execute [Setup] Create Jenkins Job ${test_job_name} [Teardown] Delete Jenkins Job ${test_job_name} Start Jenkins Job ${test_job_name} -Run Inexistent Job +Run Existent Unparameterized Job With Params [Tags] execute - Run Keyword And Expect Error There is no specified job in Jenkins: ${test_job_name}\ - ... Start Jenkins Job ${test_job_name} + [Setup] Create Jenkins Job ${test_job_name} + [Teardown] Delete Jenkins Job ${test_job_name} + Run Keyword And Expect Error This is not parameterized job, you don't have to no specify params dicitionary\ + ... Start Jenkins Job ${test_job_name} ${job_parameterized_scratch_parameters} +Run Existent Parameterized Job With Params + [Tags] execute + [Setup] Create Job From Template ${test_job_name} ${job_parameterized_scratch} + [Teardown] Delete Jenkins Job ${test_job_name} + ${build} = Start Jenkins Job ${test_job_name} ${job_parameterized_scratch_parameters} -# TODO: Test with params, also add functionality for methods (params) +Run Existent Parameterized Job Without Params + [Tags] execute + [Setup] Create Job From Template ${test_job_name} ${job_parameterized_scratch} + [Teardown] Delete Jenkins Job ${test_job_name} + Run Keyword And Expect Error This is parameterized job, you have to specify params dicitionary\ + ... Start Jenkins Job ${test_job_name} + +Compare Nuild Number + [Tags] execute + [Setup] Create Jenkins Job ${test_job_name} + [Teardown] Delete Jenkins Job ${test_job_name} + ${build_number} = Start Jenkins Job ${test_job_name} + ${next_build_before} = Get Next Build Number ${test_job_name} + Should Be Equal As Integers ${next_build_before} ${build_number + 1} diff --git a/atest/jobs.robot b/atest/jobs.robot index 5280e1c..19e0f24 100644 --- a/atest/jobs.robot +++ b/atest/jobs.robot @@ -1,12 +1,10 @@ *** Settings *** Library Collections +Library OperatingSystem Library JenkinsLibrary +Resource lib/jenkins_keywords.robot Suite Setup Set Jenkins Server url=${jenkins_address} username=admin password=admin -*** Variables *** -${test_job_name} test_job -${second_test_job_name} blablabla_job - *** Test Cases *** Get One Existent Job [Tags] job @@ -38,6 +36,15 @@ Create Existent Job Run Keyword And Expect Error Specified job already exists: ${test_job_name}\ ... Create Jenkins Job ${test_job_name} +Create Job From Template + [Tags] job + [Setup] Create Job From Template ${test_job_name} ${job_parameterized_scratch} + [Teardown] Delete Jenkins Job ${test_job_name} + ${parameters} = Get Jenkins Job Parameters ${test_job_name} + Should Be True ${parameters} + Should Be Equal param_string ${parameters[0]['name']} + Should Be Equal param_bool ${parameters[1]['name']} + Delete Inexistent Job [Tags] job Run Keyword And Expect Error There is no specified job in Jenkins: ${test_job_name}\ @@ -65,25 +72,24 @@ Disable Enabled Job [Teardown] Delete Jenkins Job ${test_job_name} Disable Jenkins Job ${test_job_name} -*** Keywords *** -Create And Disable Job - Create Jenkins Job ${test_job_name} - Disable Jenkins Job ${test_job_name} - -Create Multiple Jobs - Create Jenkins Job ${test_job_name} - Create Jenkins Job ${second_test_job_name} +Get Job XML + [Tags] job + [Setup] Create Jenkins Job ${test_job_name} + [Teardown] Delete Jenkins Job ${test_job_name} + ${job_xml} = Get Jenkins Job XML ${test_job_name} + Should Start With ${job_xml} + + false + + + + + param_string + + param_string + false + + + param_bool + + true + + + + + + true + false + false + false + + false + + + echo $param_shell +echo $param_bool +sleep 15 + + + + + \ No newline at end of file diff --git a/setup.py b/setup.py index 23f869e..add4384 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,5 @@ from os.path import join, dirname -from setuptools import setup +from setuptools import setup, find_packages exec(open(join(dirname(__file__), 'src', 'JenkinsLibrary', 'version.py')).read()) @@ -11,15 +11,30 @@ 'requests==2.18.4' ] +CLASSIFIERS = ''' +License :: OSI Approved :: Apache Software License +Development Status :: 5 - Production/Stable +Programming Language :: Python :: 2 +Programming Language :: Python :: 2.7 +Programming Language :: Python :: 3 +Programming Language :: Python :: 3.3 +Programming Language :: Python :: 3.4 +Programming Language :: Python :: 3.5 +Programming Language :: Python :: 3.6 +Topic :: Software Development :: Testing +Framework :: Robot Framework +''' + setup( name=PACKAGE, package_dir={'': 'src'}, - packages=['JenkinsLibrary'], + packages=find_packages('src'), version=VERSION, description=DESCRIPTION, author='Mikhail Naletov', author_email='admin@markeloff.net', url='https://github.com/okgolove/robotframework-jenkins', keywords=['jenkins', 'robotframework', 'robot', 'testing'], - install_requires=REQUIREMENTS + classifiers=CLASSIFIERS, + install_requires=REQUIREMENTS, ) diff --git a/src/JenkinsLibrary/library.py b/src/JenkinsLibrary/library.py index 82171bf..874ab65 100644 --- a/src/JenkinsLibrary/library.py +++ b/src/JenkinsLibrary/library.py @@ -32,8 +32,8 @@ def get_jenkins_jobs(self): def get_jenkins_job_by_name(self, name): return self.jenkins.get_job(name) - def create_jenkins_job(self, name): - self.jenkins.create_job(name) + def create_jenkins_job(self, name, template=None): + self.jenkins.create_job(name, template) def delete_jenkins_job(self, name): self.jenkins.delete_job(name) @@ -45,7 +45,16 @@ def enable_jenkins_job(self, name): self.jenkins.enable_job(name) def start_jenkins_job(self, name, params={}): - self.jenkins.build_job(name, params) + return self.jenkins.build_job(name, params) def get_jenkins_job_builds(self, name): return self.jenkins.get_builds(name) + + def get_jenkins_job_xml(self, name): + return self.jenkins.get_job_config(name) + + def get_jenkins_job_parameters(self, name): + return self.jenkins.get_job_parameters(name) + + def get_next_build_number(self, name): + return self.jenkins.get_next_build_number(name) diff --git a/src/JenkinsLibrary/server.py b/src/JenkinsLibrary/server.py index b50bce8..9b1ad98 100644 --- a/src/JenkinsLibrary/server.py +++ b/src/JenkinsLibrary/server.py @@ -36,9 +36,11 @@ def get_job(self, name): return job @is_server_initialized - def create_job(self, name): + def create_job(self, name, template): + if not template: + template = jenkins.EMPTY_CONFIG_XML try: - self.server.create_job(name, jenkins.EMPTY_CONFIG_XML) + self.server.create_job(name, template) except jenkins.JenkinsException: raise RuntimeError( 'Specified job already exists: {0}'.format(name)) @@ -72,18 +74,53 @@ def build_job(self, name, params={}): if not isinstance(params, dict): raise RuntimeError('Params must be a dictionary, not {0}'.format( type(params).__name__)) + job_params = self.get_job_parameters(name) + build_number = self.get_next_build_number(name) + if job_params: + if not params: + raise RuntimeError('This is parameterized job, you have to ' + 'specify params dicitionary') + self.server.build_job(name, params) + else: + if not params: + self.server.build_job(name, params) + else: + raise RuntimeError('This is not parameterized job, you don\'t ' + 'have to no specify params dicitionary') + return build_number + + @is_server_initialized + def get_next_build_number(self, name): + return self.get_builds(name)['nextBuildNumber'] + + @is_server_initialized + def get_builds(self, name): try: - self.server.build_job(name, params) + builds = self.server.get_job_info(name) except jenkins.NotFoundException: raise RuntimeError( 'There is no specified job in Jenkins: {0}'.format(name)) - # TODO: return build number + return builds @is_server_initialized - def get_builds(self, name): + def get_job_config(self, name): try: - builds = self.server.get_job_info(name) + job_xml = self.server.get_job_config(name) except jenkins.NotFoundException: raise RuntimeError( 'There is no specified job in Jenkins: {0}'.format(name)) - return builds + return job_xml + + @is_server_initialized + def get_job_parameters(self, name): + job_info = self.get_job(name) + params = [] + if job_info['property']: + for param in job_info['property'][0]['parameterDefinitions']: + params.append({ + 'name': param['name'], + 'description': param['description'], + 'type': param['type'], + 'value': param['defaultParameterValue']['value'] + }) + return params diff --git a/src/JenkinsLibrary/version.py b/src/JenkinsLibrary/version.py index d0bd79f..8d76f25 100644 --- a/src/JenkinsLibrary/version.py +++ b/src/JenkinsLibrary/version.py @@ -1 +1 @@ -VERSION = '0.1' +VERSION = '0.1.1'