does your jenkins speak gerrit
play

Does your Jenkins speak Gerrit? Functional testing for your - PowerPoint PPT Presentation

Does your Jenkins speak Gerrit? Functional testing for your pipelines, JobDSL and more Szymon Datko Roman Dobosz szymon.datko@corp.ovh.com rdobosz@redhat.com 5th November 2019 Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional


  1. Does your Jenkins speak Gerrit? Functional testing for your pipelines, JobDSL and more Szymon Datko Roman Dobosz szymon.datko@corp.ovh.com rdobosz@redhat.com 5th November 2019 Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 1 / 27

  2. About us Szymon Datko Roman Dobosz • DevOps & local Bash wizard • Python expert • Open Source software lover • 8 bit fan • Computer Graphics enthusiast • emerge -vaNDu world Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 2 / 27

  3. We already talked about Jenkins - twice! https://www.youtube.com/watch?v=T7rD--ZOYRQ https://www.youtube.com/watch?v=nvgeXkE65ac Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 3 / 27

  4. Short recap: what is this mysterious Jenkins thing? • One of the most popular automation servers. • Powerful, Open Source, written in Java. • Easy to start, configure, manage and use. • Heavily extensible - plenty of plugins available. • Widely used by the top IT companies! ... and many, many more! Sources: https://wiki.jenkins.io/pages/viewpage.action?pageId=58001258 , https://stackshare.io/jenkins . Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 4 / 27

  5. Short recap: solution for (nearly) all your problems There are three plug-ins that do come in handy for Jenkins configuration... Configuration as Code Job DSL Job Pipelines (Jenkinsfiles) Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 5 / 27

  6. Short recap: testing Jenkins configuration Conclusions from OpenInfra Summit Denver 2019: • testing things is important, • valid configuration is as important as valid code, • Jenkins Configuration as Code : • validate against JSON Schema, • Job DSL : • use regular Groovy parser, • Job Pipelines : • check with build-in parser, • additional things need to be launched for completeness! Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 6 / 27

  7. What are we missing? • Is the configuration doing precisely what expected? • Does the Jenkins-Gerrit integration works exactly as intended? • Are the jobs themselves doing what they really should? Image source: https://knowyourmeme.com/memes/ben-affleck-smoking Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 7 / 27

  8. What exactly is Gerrit? • A code review system / collaboration tool, • utilizes heavily the git version control system, • created as tool for development of Android, • fork of Rietveld, written in Python for svn , • currently rewritten in Java with NoteDB, • accessible via Web UI, REST API and SSH CLI. Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 8 / 27

  9. Obvious solution – add Gerrit to the testing pipeline! Just configure everything and then manage events via Gerrit API. Image source: https://www.flickr.com/photos/picofarad-org/2132206570/ Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 9 / 27

  10. Do you really need the whole Gerrit? • There are many features in Gerrit. • To install and configure everything may be very time consuming. • Some dedicated resources required to ensure it works smoothly. • What if you only want to get the events for tiggering the Jenkins? Image source: https://www.swiss-store.co.uk/medium-pocket-knives-c83/victorinox-handyman-swiss-army-knife-p649 Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 10 / 27

  11. Introducing... the Ferrit! • A F ake G errit server implementation, • created for functional testing of events in Jenkins and Gerrit Trigger ecosystem, • written in Python with bottle and paramiko , • fast and simple to deploy and use, • will not consume all your resources ;-) Image source: https://www.flickr.com/photos/picofarad-org/2132206570/ Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 11 / 27

  12. System’s architecture Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 12 / 27

  13. Dive into Gerrit – REST API, SSH CLI, Stream Events Besides Web UI, Gerrit provides following communication channels: • REST API: ◮ reference: https://gerrit-review.googlesource.com/Documentation/rest-api.html , ◮ example access: curl 'http://localhost:8080/path/to/API/resource?with=parameters' • SSH commands: ◮ reference: https://gerrit-review.googlesource.com/Documentation/cmd-index.html#_server , ◮ example access: ssh -u 'user' -p 'port' 'localhost' gerrit version Gerrit functionality can be extend by plugins, like Stream Events plugin: ◮ ref: https://gerrit-review.googlesource.com/Documentation/cmd-stream-events.html , ◮ adds SSH CLI command: stream-events Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 13 / 27

  14. Connecting Jenkins to Gerrit • Use the Gerrit Trigger plugin! • It utilizes the stream-events plugin, • can be used to react on changes in Gerrit, • recognizes various events: 1 patch-set created, 2 comment added, 3 change merged, 4 change abandoned, 5 change restored, 6 draft published, 7 reference updated. Image source: https://en.wikipedia.org/wiki/Jabba_the_Hutt Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 14 / 27

  15. Implementation of SSH server – Paramiko • Written in Python . • Implements SSH protocol. • Typically used for communicating with SSH server to execute remote commands. (not a paramiko logo) • It even allows to build your own SSH server! Image source: https://www.macworld.co.uk/how-to/mac-software/how-use-terminal-on-mac-3608274/ Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 15 / 27

  16. Implementation of SSH server – code (1/2) 1 | FIFO = 'ferrit.fifo' # path to queue file read by SSH service 2 | 3 | class SSHHandler (socketserver.StreamRequestHandler): def handle(self): 4 | transport = paramiko.Transport(self.connection) 5 | transport.add_server_key(paramiko.RSAKey(filename=KEY)) 6 | server = Server(self.client_address) 7 | transport.start_server(server=server) 8 | 9 | while True: 10 | channel = transport.accept(20) 11 | server.event.wait(10) 12 | cmd = server.command.decode('utf-8') 13 | 14 | if cmd == 'gerrit version': 15 | channel.send(GERRIT_CMD_VERSION) 16 | 17 | elif cmd == 'gerrit stream-events': 18 | with open(FIFO) as fobj: 19 | data = fobj.read() 20 | channel.send(data) 21 | 22 | channel.close() 23 | 24 | 25 | if__name__== "__main__": sshserver = socketserver.ThreadingTCPServer(('127.0.0.1', PORT), SSHHandler) 26 | sshserver.serve_forever() 27 | Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 16 / 27

  17. Implementation of SSH server – code (2/2) 1 | class Server (paramiko.ServerInterface): def __init__(self, client_address): 2 | self.command = None 3 | self.event = threading.Event() 4 | self.client_address = client_address 5 | 6 | def check_channel_request(self, kind, chanid): 7 | if kind == 'session': 8 | return paramiko.OPEN_SUCCEEDED 9 | return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED 10 | 11 | def get_allowed_auths(self, username): 12 | return "password,publickey" 13 | 14 | def check_auth_password(self, username, password): 15 | return paramiko.AUTH_SUCCESSFUL 16 | 17 | def check_auth_publickey(self, username, key): 18 | return paramiko.AUTH_SUCCESSFUL 19 | 20 | def check_channel_exec_request(self, channel, command): 21 | self.command = command 22 | self.event.set() 23 | return True 24 | Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 17 / 27

  18. Implementation of REST API – Bottle • Python module for creating web services. • Single file library, for real! • No additional dependencies required. • Built-in template engine: ◮ supports also mako, jinja2 and cheetah. • Contains various utilities, e.g.: ◮ access to POST/form data, ◮ cookies and headers setting and parsing. Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 18 / 27

  19. Implementation of REST API – code 1 | import bottle 2 | 3 | FIFO = 'ferrit.fifo' # path to queue file read by SSH service 4 | events = {} # dict with events templates 5 | 6 | class App (bottle.Bottle): def __init__(self): 7 | super(App, self).__init__() 8 | self.route('/plugins/events-log/', callback=self._events_log) 9 | self.route('/a/projects/', callback=self._projects) 10 | self.post('/make/event', callback=self._mk_event) 11 | 12 | def _events_log(self, params=None): 13 | return 14 | 15 | def _projects(params=None): 16 | return {"All-Projects": {"id": "All-Projects", ... }, ... } 17 | 18 | def _mk_event(self): 19 | data = dict(events[bottle.request.forms.get('type')]) 20 | with open(FIFO, 'w') as fobj: 21 | fobj.write(json.dumps(data) + ' \n ') 22 | 23 | 24 | if __name__ == "__main__": app = App() 25 | app.run(port=8181, host='localhost', debug=True) 26 | Sz. Datko, R. Dobosz Does your Jenkins speak Gerrit? - Functional testing 5th November 2019 19 / 27

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend