)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30491,"name":"Radosław Piliszek","display_name":"Radek","email":"radek@piliszek.it","username":"yoctozepto","status":"self-employed techologist, collaborating mostly with 7bulls.com"},"change_message_id":"b43d52a3790518b67e4a60bd49841a3ac154747d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"700775d4_2206623c","updated":"2023-03-10 18:47:10.000000000","message":"Any plans to revive this gold?","commit_id":"598f4124bdcf8a6537420fdbb7aa06b6b6c43889"}],"README.rst":[{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"never again merge broken code."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"It fully automates running tests defined by projects and guarantees"},{"line_number":24,"context_line":"that changes have always passed before being committed."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Getting Help"},{"line_number":27,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_70bc556c","line":24,"range":{"start_line":24,"start_character":45,"end_line":24,"end_character":54},"updated":"2019-10-02 08:07:52.000000000","message":"Rather merged to the main/release branch, right? There are already committed in the repo.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":21,"context_line":"never again merge broken code."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"It fully automates running tests defined by projects and guarantees"},{"line_number":24,"context_line":"that changes have always passed before being committed."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Getting Help"},{"line_number":27,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_97c20ce8","line":24,"range":{"start_line":24,"start_character":45,"end_line":24,"end_character":54},"in_reply_to":"3fa7e38b_70bc556c","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"d37bec995dd9fe28a00012387f8705b70644b638","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"The first part of the story starts with the general idea of concept of"},{"line_number":92,"context_line":"automatically running CI jobs when a change is proposed to a project."},{"line_number":93,"context_line":"In Gerrit terms a change is called a \"review\", in GitHub terms it is a"},{"line_number":94,"context_line":"\"pull request\".  In modern projects there are usually many more unit"},{"line_number":95,"context_line":"and functional tests in code than are practical for a developer to run"},{"line_number":96,"context_line":"by themselves.  A subset is often run locally during development"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f5f6145d","line":93,"updated":"2019-09-30 14:39:58.000000000","message":"Actually in Gerrit it\u0027s called a \"change\".  I acknowledge some people call it a \"review\", but in fact, a \"review\" is something you leave on a \"change\".  I\u0027m not pedantic enough to correct folks in conversation, but we should avoid saying the opposite in our docs.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"The first part of the story starts with the general idea of concept of"},{"line_number":92,"context_line":"automatically running CI jobs when a change is proposed to a project."},{"line_number":93,"context_line":"In Gerrit terms a change is called a \"review\", in GitHub terms it is a"},{"line_number":94,"context_line":"\"pull request\".  In modern projects there are usually many more unit"},{"line_number":95,"context_line":"and functional tests in code than are practical for a developer to run"},{"line_number":96,"context_line":"by themselves.  A subset is often run locally during development"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_b7bf505f","line":93,"in_reply_to":"3fa7e38b_f5f6145d","updated":"2020-07-15 05:14:58.000000000","message":"done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"The first part of the story starts with the general idea of concept of"},{"line_number":92,"context_line":"automatically running CI jobs when a change is proposed to a project."},{"line_number":93,"context_line":"In Gerrit terms a change is called a \"review\", in GitHub terms it is a"},{"line_number":94,"context_line":"\"pull request\".  In modern projects there are usually many more unit"},{"line_number":95,"context_line":"and functional tests in code than are practical for a developer to run"},{"line_number":96,"context_line":"by themselves.  A subset is often run locally during development"},{"line_number":97,"context_line":"covering the feature or bug being worked on, but larger tests"},{"line_number":98,"context_line":"integrating the change across the entire code-base can be difficult"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_9066b129","line":95,"range":{"start_line":94,"start_character":64,"end_line":95,"end_character":14},"updated":"2019-10-02 08:07:52.000000000","message":"There are also other types of tests, e.g, integration tests you mention below. Maybe a term, i.e., \"automated tests\" could be used here?","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":91,"context_line":"The first part of the story starts with the general idea of concept of"},{"line_number":92,"context_line":"automatically running CI jobs when a change is proposed to a project."},{"line_number":93,"context_line":"In Gerrit terms a change is called a \"review\", in GitHub terms it is a"},{"line_number":94,"context_line":"\"pull request\".  In modern projects there are usually many more unit"},{"line_number":95,"context_line":"and functional tests in code than are practical for a developer to run"},{"line_number":96,"context_line":"by themselves.  A subset is often run locally during development"},{"line_number":97,"context_line":"covering the feature or bug being worked on, but larger tests"},{"line_number":98,"context_line":"integrating the change across the entire code-base can be difficult"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_3726a0cf","line":95,"range":{"start_line":94,"start_character":64,"end_line":95,"end_character":14},"in_reply_to":"3fa7e38b_9066b129","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"and functional tests in code than are practical for a developer to run"},{"line_number":96,"context_line":"by themselves.  A subset is often run locally during development"},{"line_number":97,"context_line":"covering the feature or bug being worked on, but larger tests"},{"line_number":98,"context_line":"integrating the change across the entire code-base can be difficult"},{"line_number":99,"context_line":"for each individual developer to setup and run consistently.  Who has"},{"line_number":100,"context_line":"not made a \"small\" change that turned out to have unexpected"},{"line_number":101,"context_line":"side-effects!"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f05da548","line":99,"range":{"start_line":98,"start_character":51,"end_line":99,"end_character":59},"updated":"2019-10-02 08:07:52.000000000","message":"not only difficult to run consistently but more also the issue may be the time requirements on the run of the whole test set.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":95,"context_line":"and functional tests in code than are practical for a developer to run"},{"line_number":96,"context_line":"by themselves.  A subset is often run locally during development"},{"line_number":97,"context_line":"covering the feature or bug being worked on, but larger tests"},{"line_number":98,"context_line":"integrating the change across the entire code-base can be difficult"},{"line_number":99,"context_line":"for each individual developer to setup and run consistently.  Who has"},{"line_number":100,"context_line":"not made a \"small\" change that turned out to have unexpected"},{"line_number":101,"context_line":"side-effects!"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_772c98ab","line":99,"range":{"start_line":98,"start_character":51,"end_line":99,"end_character":59},"in_reply_to":"3fa7e38b_f05da548","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":111,"context_line":"Any non-trivial code-base requires a considerable amount of setup even"},{"line_number":112,"context_line":"before testing can be done.  You need various packages installed,"},{"line_number":113,"context_line":"databases configured, networking setup or container environments"},{"line_number":114,"context_line":"configured.  As a bonus, wouldn\u0027t it be great if your CI jobs set"},{"line_number":115,"context_line":"themselves up using the same deployment methods you use in production,"},{"line_number":116,"context_line":"so testing wasn\u0027t a special case?"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"One of the most popular ways to deploy complex (and not so complex)"},{"line_number":119,"context_line":"software is `Ansible \u003chttps://www.ansible.com\u003e\u003e`__, which provides a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_7018d583","line":116,"range":{"start_line":114,"start_character":13,"end_line":116,"end_character":33},"updated":"2019-10-02 08:07:52.000000000","message":"I know your goal is more conversational approach, which I really like, but from this sentence I feel a bit in a sales pitch :)","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":111,"context_line":"Any non-trivial code-base requires a considerable amount of setup even"},{"line_number":112,"context_line":"before testing can be done.  You need various packages installed,"},{"line_number":113,"context_line":"databases configured, networking setup or container environments"},{"line_number":114,"context_line":"configured.  As a bonus, wouldn\u0027t it be great if your CI jobs set"},{"line_number":115,"context_line":"themselves up using the same deployment methods you use in production,"},{"line_number":116,"context_line":"so testing wasn\u0027t a special case?"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"One of the most popular ways to deploy complex (and not so complex)"},{"line_number":119,"context_line":"software is `Ansible \u003chttps://www.ansible.com\u003e\u003e`__, which provides a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_490f3c2d","line":116,"range":{"start_line":114,"start_character":13,"end_line":116,"end_character":33},"in_reply_to":"3fa7e38b_7018d583","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"themselves up using the same deployment methods you use in production,"},{"line_number":116,"context_line":"so testing wasn\u0027t a special case?"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"One of the most popular ways to deploy complex (and not so complex)"},{"line_number":119,"context_line":"software is `Ansible \u003chttps://www.ansible.com\u003e\u003e`__, which provides a"},{"line_number":120,"context_line":"complete environment for software provisioning, configuration"},{"line_number":121,"context_line":"management and application deployment.  For those with no prior"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f00b6528","line":118,"range":{"start_line":118,"start_character":39,"end_line":118,"end_character":67},"updated":"2019-10-02 08:07:52.000000000","message":"I would consider removing that, since you are negating it right away.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":115,"context_line":"themselves up using the same deployment methods you use in production,"},{"line_number":116,"context_line":"so testing wasn\u0027t a special case?"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"One of the most popular ways to deploy complex (and not so complex)"},{"line_number":119,"context_line":"software is `Ansible \u003chttps://www.ansible.com\u003e\u003e`__, which provides a"},{"line_number":120,"context_line":"complete environment for software provisioning, configuration"},{"line_number":121,"context_line":"management and application deployment.  For those with no prior"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_a91a586b","line":118,"range":{"start_line":118,"start_character":39,"end_line":118,"end_character":67},"in_reply_to":"3fa7e38b_f00b6528","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":120,"context_line":"complete environment for software provisioning, configuration"},{"line_number":121,"context_line":"management and application deployment.  For those with no prior"},{"line_number":122,"context_line":"exposure to Ansible, it is in essence a tool to run commands on a"},{"line_number":123,"context_line":"remote host.  A \"playbook\" is a series of commands to run; think of a"},{"line_number":124,"context_line":"structured shell-script.  A \"role\" is analogous to a function that"},{"line_number":125,"context_line":"encapsulates some common task.  Operators have long since realised"},{"line_number":126,"context_line":"that bespoke random scripts can only go so far in orchestrating the"},{"line_number":127,"context_line":"deployment of modern, complex systems, and tools like Ansible are"},{"line_number":128,"context_line":"purpose built for the task."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_b602c608","line":125,"range":{"start_line":123,"start_character":14,"end_line":125,"end_character":30},"updated":"2019-10-02 08:07:52.000000000","message":"For brevity I think referencing Ansible is enough. You are mentioning 2 Ansible terms while ignoring others, e.g., tasks.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":120,"context_line":"complete environment for software provisioning, configuration"},{"line_number":121,"context_line":"management and application deployment.  For those with no prior"},{"line_number":122,"context_line":"exposure to Ansible, it is in essence a tool to run commands on a"},{"line_number":123,"context_line":"remote host.  A \"playbook\" is a series of commands to run; think of a"},{"line_number":124,"context_line":"structured shell-script.  A \"role\" is analogous to a function that"},{"line_number":125,"context_line":"encapsulates some common task.  Operators have long since realised"},{"line_number":126,"context_line":"that bespoke random scripts can only go so far in orchestrating the"},{"line_number":127,"context_line":"deployment of modern, complex systems, and tools like Ansible are"},{"line_number":128,"context_line":"purpose built for the task."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_092384a8","line":125,"range":{"start_line":123,"start_character":14,"end_line":125,"end_character":30},"in_reply_to":"3fa7e38b_b602c608","updated":"2020-07-15 05:14:58.000000000","message":"the thing is a big part of it is zuul-jobs with it\u0027s array of roles to help you out.  So I want someone who isn\u0027t familiar to sort of understand that roles are like functions you call where you don\u0027t really care how they do what they do, but that you get the result you want.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":132,"context_line":"the details.  To start simply, your Ansible job playbook could consist"},{"line_number":133,"context_line":"of nothing but calling an existing shell-script and returning if it"},{"line_number":134,"context_line":"passed or failed.  But quickly you realise the things the script are"},{"line_number":135,"context_line":"likely doing are much better handled by Ansible itself.  Maybe you add"},{"line_number":136,"context_line":"a user for testing using calls to \"adduser\" or \"useradd\" -- who can"},{"line_number":137,"context_line":"remember.  Ansible has inbuilt roles to do that.  Then you install"},{"line_number":138,"context_line":"some packages, making calls to \"apt-get\" or \"dnf\".  Ansible has"},{"line_number":139,"context_line":"generic package installation routines to cover that.  Maybe you setup"},{"line_number":140,"context_line":"a config file, using sed and awk calls to modify some parts.  Ansible"},{"line_number":141,"context_line":"has a complete Jinja2 based template system to make this simple.  As"},{"line_number":142,"context_line":"your complexity grows, you will start to realise that Ansible is"},{"line_number":143,"context_line":"taking away the pain of ad-hoc scripts and your jobs are consisting of"},{"line_number":144,"context_line":"well-tested, portable and compontentised building blocks."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"If you use Ansible in production, the components you are using in the"},{"line_number":147,"context_line":"testing environment can work exactly the same on live servers.  This"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_964b0a5e","line":144,"range":{"start_line":135,"start_character":57,"end_line":144,"end_character":55},"updated":"2019-10-02 08:07:52.000000000","message":"IMHO this goes too far into Ansible - scope?","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":132,"context_line":"the details.  To start simply, your Ansible job playbook could consist"},{"line_number":133,"context_line":"of nothing but calling an existing shell-script and returning if it"},{"line_number":134,"context_line":"passed or failed.  But quickly you realise the things the script are"},{"line_number":135,"context_line":"likely doing are much better handled by Ansible itself.  Maybe you add"},{"line_number":136,"context_line":"a user for testing using calls to \"adduser\" or \"useradd\" -- who can"},{"line_number":137,"context_line":"remember.  Ansible has inbuilt roles to do that.  Then you install"},{"line_number":138,"context_line":"some packages, making calls to \"apt-get\" or \"dnf\".  Ansible has"},{"line_number":139,"context_line":"generic package installation routines to cover that.  Maybe you setup"},{"line_number":140,"context_line":"a config file, using sed and awk calls to modify some parts.  Ansible"},{"line_number":141,"context_line":"has a complete Jinja2 based template system to make this simple.  As"},{"line_number":142,"context_line":"your complexity grows, you will start to realise that Ansible is"},{"line_number":143,"context_line":"taking away the pain of ad-hoc scripts and your jobs are consisting of"},{"line_number":144,"context_line":"well-tested, portable and compontentised building blocks."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"If you use Ansible in production, the components you are using in the"},{"line_number":147,"context_line":"testing environment can work exactly the same on live servers.  This"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_096ee4fe","line":144,"range":{"start_line":135,"start_character":57,"end_line":144,"end_character":55},"in_reply_to":"3fa7e38b_964b0a5e","updated":"2020-07-15 05:14:58.000000000","message":"Zuul is so closely tied to ansible now that I really feel to that to understand what zuul is getting at you need to understand why you\u0027d use an orchestration tool like ansible.  I feel like it needs to be pretty deeply explained if you don\u0027t know what it even is.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"taking away the pain of ad-hoc scripts and your jobs are consisting of"},{"line_number":144,"context_line":"well-tested, portable and compontentised building blocks."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"If you use Ansible in production, the components you are using in the"},{"line_number":147,"context_line":"testing environment can work exactly the same on live servers.  This"},{"line_number":148,"context_line":"is the DevOps \"Holy Grail\" of infrastructure-as-code.  There are no"},{"line_number":149,"context_line":"Zuul-specific custom configuration files or niche languages to come to"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_b650860c","line":146,"range":{"start_line":146,"start_character":11,"end_line":146,"end_character":18},"updated":"2019-10-02 08:07:52.000000000","message":"\"Zuul\" :) (would fit too, right?)","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":168,"context_line":"is done, it is only useful if you can see what it did.  Zuul comes"},{"line_number":169,"context_line":"preconfigured with roles to collect and store logs, and interfaces to"},{"line_number":170,"context_line":"show job results.  You can copy logs to a central file-server, upload"},{"line_number":171,"context_line":"them to object storage or write your own roles to send them wherever"},{"line_number":172,"context_line":"you want."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"As your jobs grow, you will greatly benefit from Zuul\u0027s \"implement"},{"line_number":175,"context_line":"once and share\" approach throughout the design.  Zuul jobs are"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_566ef2c9","line":172,"range":{"start_line":171,"start_character":50,"end_line":172,"end_character":8},"updated":"2019-10-02 08:07:52.000000000","message":"I would maybe consider reformulating it:\n- \" ... transfer them to any desired destination.\"\n- \" ...\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":168,"context_line":"is done, it is only useful if you can see what it did.  Zuul comes"},{"line_number":169,"context_line":"preconfigured with roles to collect and store logs, and interfaces to"},{"line_number":170,"context_line":"show job results.  You can copy logs to a central file-server, upload"},{"line_number":171,"context_line":"them to object storage or write your own roles to send them wherever"},{"line_number":172,"context_line":"you want."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"As your jobs grow, you will greatly benefit from Zuul\u0027s \"implement"},{"line_number":175,"context_line":"once and share\" approach throughout the design.  Zuul jobs are"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_4c474a1e","line":172,"range":{"start_line":171,"start_character":50,"end_line":172,"end_character":8},"in_reply_to":"3fa7e38b_566ef2c9","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":171,"context_line":"them to object storage or write your own roles to send them wherever"},{"line_number":172,"context_line":"you want."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"As your jobs grow, you will greatly benefit from Zuul\u0027s \"implement"},{"line_number":175,"context_line":"once and share\" approach throughout the design.  Zuul jobs are"},{"line_number":176,"context_line":"hierarchical; a child job can inherit from a parent.  That means, for"},{"line_number":177,"context_line":"example, if you have a custom log collection role that runs after all"},{"line_number":178,"context_line":"testing, you can put that in your site\u0027s \"base\" job.  Every other job"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_36aa56d2","line":175,"range":{"start_line":174,"start_character":57,"end_line":175,"end_character":14},"updated":"2019-10-02 08:07:52.000000000","message":"..., an extended well established DRY principle","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":171,"context_line":"them to object storage or write your own roles to send them wherever"},{"line_number":172,"context_line":"you want."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"As your jobs grow, you will greatly benefit from Zuul\u0027s \"implement"},{"line_number":175,"context_line":"once and share\" approach throughout the design.  Zuul jobs are"},{"line_number":176,"context_line":"hierarchical; a child job can inherit from a parent.  That means, for"},{"line_number":177,"context_line":"example, if you have a custom log collection role that runs after all"},{"line_number":178,"context_line":"testing, you can put that in your site\u0027s \"base\" job.  Every other job"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_cc64fabb","line":175,"range":{"start_line":174,"start_character":57,"end_line":175,"end_character":14},"in_reply_to":"3fa7e38b_36aa56d2","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"run jobs.  The node types are defined by administrators and jobs"},{"line_number":204,"context_line":"request from those predefined types.  Usually nodes are named for the"},{"line_number":205,"context_line":"distribution, and/or size of the instance and other similar"},{"line_number":206,"context_line":"parameters.  Nodepool has \"drivers\" to talk to a range of resource"},{"line_number":207,"context_line":"providers like OpenStack, Kubernetes, Openshift and AWS."},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"Nodepool manages the life-cycle of the testing resources.  With"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_369336a6","line":206,"range":{"start_line":206,"start_character":22,"end_line":206,"end_character":25},"updated":"2019-10-02 08:07:52.000000000","message":"suggestion: \"implements\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":203,"context_line":"run jobs.  The node types are defined by administrators and jobs"},{"line_number":204,"context_line":"request from those predefined types.  Usually nodes are named for the"},{"line_number":205,"context_line":"distribution, and/or size of the instance and other similar"},{"line_number":206,"context_line":"parameters.  Nodepool has \"drivers\" to talk to a range of resource"},{"line_number":207,"context_line":"providers like OpenStack, Kubernetes, Openshift and AWS."},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"Nodepool manages the life-cycle of the testing resources.  With"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_2c5816f8","line":206,"range":{"start_line":206,"start_character":22,"end_line":206,"end_character":25},"in_reply_to":"3fa7e38b_369336a6","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":209,"context_line":"Nodepool manages the life-cycle of the testing resources.  With"},{"line_number":210,"context_line":"OpenStack, for example, it will manage the building and uploading of"},{"line_number":211,"context_line":"the images to the cloud, starting the VM, setting up basic networking"},{"line_number":212,"context_line":"(such as floating IP\u0027s), passing it over to Zuul for use and its"},{"line_number":213,"context_line":"eventual removal.  It is aware of the cloud limits and makes smart"},{"line_number":214,"context_line":"scheduling decisions about how to provide resources (e.g. I\u0027m needing"},{"line_number":215,"context_line":"a lot of this type of node, I\u0027ll pre-emptively start some; or we\u0027re"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f68cbe80","line":212,"range":{"start_line":212,"start_character":0,"end_line":212,"end_character":23},"updated":"2019-10-02 08:07:52.000000000","message":"superfluous","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":209,"context_line":"Nodepool manages the life-cycle of the testing resources.  With"},{"line_number":210,"context_line":"OpenStack, for example, it will manage the building and uploading of"},{"line_number":211,"context_line":"the images to the cloud, starting the VM, setting up basic networking"},{"line_number":212,"context_line":"(such as floating IP\u0027s), passing it over to Zuul for use and its"},{"line_number":213,"context_line":"eventual removal.  It is aware of the cloud limits and makes smart"},{"line_number":214,"context_line":"scheduling decisions about how to provide resources (e.g. I\u0027m needing"},{"line_number":215,"context_line":"a lot of this type of node, I\u0027ll pre-emptively start some; or we\u0027re"},{"line_number":216,"context_line":"over capacity, I need to remove these unused nodes I started that"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_56f11201","line":213,"range":{"start_line":212,"start_character":49,"end_line":213,"end_character":16},"updated":"2019-10-02 08:07:52.000000000","message":"suggestion: \"... to run the jobs on and eventual removal when job run finishes.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":211,"context_line":"the images to the cloud, starting the VM, setting up basic networking"},{"line_number":212,"context_line":"(such as floating IP\u0027s), passing it over to Zuul for use and its"},{"line_number":213,"context_line":"eventual removal.  It is aware of the cloud limits and makes smart"},{"line_number":214,"context_line":"scheduling decisions about how to provide resources (e.g. I\u0027m needing"},{"line_number":215,"context_line":"a lot of this type of node, I\u0027ll pre-emptively start some; or we\u0027re"},{"line_number":216,"context_line":"over capacity, I need to remove these unused nodes I started that"},{"line_number":217,"context_line":"aren\u0027t being allocated)."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"From Zuul\u0027s view, it simply asks for nodes and, eventually, gets them."},{"line_number":220,"context_line":"If you enjoy excess capacity, likely instantly.  If not, nodes are"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_d6e4223f","line":217,"range":{"start_line":214,"start_character":58,"end_line":217,"end_character":22},"updated":"2019-10-02 08:07:52.000000000","message":"I would reformulate that 1st person speech","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":211,"context_line":"the images to the cloud, starting the VM, setting up basic networking"},{"line_number":212,"context_line":"(such as floating IP\u0027s), passing it over to Zuul for use and its"},{"line_number":213,"context_line":"eventual removal.  It is aware of the cloud limits and makes smart"},{"line_number":214,"context_line":"scheduling decisions about how to provide resources (e.g. I\u0027m needing"},{"line_number":215,"context_line":"a lot of this type of node, I\u0027ll pre-emptively start some; or we\u0027re"},{"line_number":216,"context_line":"over capacity, I need to remove these unused nodes I started that"},{"line_number":217,"context_line":"aren\u0027t being allocated)."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"From Zuul\u0027s view, it simply asks for nodes and, eventually, gets them."},{"line_number":220,"context_line":"If you enjoy excess capacity, likely instantly.  If not, nodes are"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_6c75ee63","line":217,"range":{"start_line":214,"start_character":58,"end_line":217,"end_character":22},"in_reply_to":"3fa7e38b_d6e4223f","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":220,"context_line":"If you enjoy excess capacity, likely instantly.  If not, nodes are"},{"line_number":221,"context_line":"allocated as nodepool manages to balance out the incoming requests."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Zuul then starts Ansible and runs the job playbooks against these"},{"line_number":224,"context_line":"testing nodes.  Zuul does this via it\u0027s \"executor\"; a sandboxed"},{"line_number":225,"context_line":"environment that Ansible runs within.  Each job gets its own sandbox"},{"line_number":226,"context_line":"environment; executor hosts can scale horizontally and as you scale up"},{"line_number":227,"context_line":"the number of concurrent jobs you can add more hosts to handle more"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_16c4fa91","line":224,"range":{"start_line":223,"start_character":10,"end_line":224,"end_character":13},"updated":"2019-10-02 08:07:52.000000000","message":"Suggestion: \"... starts the jobs, using Ansible playbooks, agains these integration nodes\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":221,"context_line":"allocated as nodepool manages to balance out the incoming requests."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Zuul then starts Ansible and runs the job playbooks against these"},{"line_number":224,"context_line":"testing nodes.  Zuul does this via it\u0027s \"executor\"; a sandboxed"},{"line_number":225,"context_line":"environment that Ansible runs within.  Each job gets its own sandbox"},{"line_number":226,"context_line":"environment; executor hosts can scale horizontally and as you scale up"},{"line_number":227,"context_line":"the number of concurrent jobs you can add more hosts to handle more"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_d6bd0203","line":224,"range":{"start_line":224,"start_character":31,"end_line":224,"end_character":34},"updated":"2019-10-02 08:07:52.000000000","message":"suggestion: \"using\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":236,"context_line":"Submit a change, run some CI jobs, report back.  That\u0027s a good start"},{"line_number":237,"context_line":"for a CI system, but when you start to examine modern high-volume,"},{"line_number":238,"context_line":"multi-hundred developer, multi-hundred project workflows you start to"},{"line_number":239,"context_line":"see a range of traps that Zuul completely insulates you from."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"Never again should we hear \"it worked for me!\".  You can have 100%"},{"line_number":242,"context_line":"test coverage of your code; but if the tests did not run it\u0027s all for"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f616fef1","line":239,"range":{"start_line":239,"start_character":42,"end_line":239,"end_character":51},"updated":"2019-10-02 08:07:52.000000000","message":"If Zuul insulates them from you, how can you start to see them? :)","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":236,"context_line":"Submit a change, run some CI jobs, report back.  That\u0027s a good start"},{"line_number":237,"context_line":"for a CI system, but when you start to examine modern high-volume,"},{"line_number":238,"context_line":"multi-hundred developer, multi-hundred project workflows you start to"},{"line_number":239,"context_line":"see a range of traps that Zuul completely insulates you from."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"Never again should we hear \"it worked for me!\".  You can have 100%"},{"line_number":242,"context_line":"test coverage of your code; but if the tests did not run it\u0027s all for"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_8c6682ba","line":239,"range":{"start_line":239,"start_character":42,"end_line":239,"end_character":51},"in_reply_to":"3fa7e38b_f616fef1","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":241,"context_line":"Never again should we hear \"it worked for me!\".  You can have 100%"},{"line_number":242,"context_line":"test coverage of your code; but if the tests did not run it\u0027s all for"},{"line_number":243,"context_line":"nothing.  A developer submits a change, tests run, pass and it now"},{"line_number":244,"context_line":"waits for peer review.  In the mean time, 3 other things are committed"},{"line_number":245,"context_line":"to the branch.  All too often, some days later we see this original"},{"line_number":246,"context_line":"change has passed all tests and commit it.  Just because those other 3"},{"line_number":247,"context_line":"changes didn\u0027t create a merge conflict (i.e. directly touch the same"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_96d1ca32","line":244,"range":{"start_line":244,"start_character":42,"end_line":244,"end_character":44},"updated":"2019-10-02 08:07:52.000000000","message":"I would remove the example number, just keep: \"..., other things ...\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":243,"context_line":"nothing.  A developer submits a change, tests run, pass and it now"},{"line_number":244,"context_line":"waits for peer review.  In the mean time, 3 other things are committed"},{"line_number":245,"context_line":"to the branch.  All too often, some days later we see this original"},{"line_number":246,"context_line":"change has passed all tests and commit it.  Just because those other 3"},{"line_number":247,"context_line":"changes didn\u0027t create a merge conflict (i.e. directly touch the same"},{"line_number":248,"context_line":"code as being committed) does *not* mean it is safe to merge!  Maybe"},{"line_number":249,"context_line":"the change obsoletes some API that the prior changes are now using."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_16e5da0a","line":246,"range":{"start_line":246,"start_character":32,"end_line":246,"end_character":38},"updated":"2019-10-02 08:07:52.000000000","message":"merge?","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":243,"context_line":"nothing.  A developer submits a change, tests run, pass and it now"},{"line_number":244,"context_line":"waits for peer review.  In the mean time, 3 other things are committed"},{"line_number":245,"context_line":"to the branch.  All too often, some days later we see this original"},{"line_number":246,"context_line":"change has passed all tests and commit it.  Just because those other 3"},{"line_number":247,"context_line":"changes didn\u0027t create a merge conflict (i.e. directly touch the same"},{"line_number":248,"context_line":"code as being committed) does *not* mean it is safe to merge!  Maybe"},{"line_number":249,"context_line":"the change obsoletes some API that the prior changes are now using."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_0c10b2ff","line":246,"range":{"start_line":246,"start_character":32,"end_line":246,"end_character":38},"in_reply_to":"3fa7e38b_16e5da0a","updated":"2020-07-15 05:14:58.000000000","message":"removed","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":245,"context_line":"to the branch.  All too often, some days later we see this original"},{"line_number":246,"context_line":"change has passed all tests and commit it.  Just because those other 3"},{"line_number":247,"context_line":"changes didn\u0027t create a merge conflict (i.e. directly touch the same"},{"line_number":248,"context_line":"code as being committed) does *not* mean it is safe to merge!  Maybe"},{"line_number":249,"context_line":"the change obsoletes some API that the prior changes are now using."},{"line_number":250,"context_line":"The only way to really be safe is to run the testing again, against"},{"line_number":251,"context_line":"the current top-of-tree."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_76b9aee7","line":248,"range":{"start_line":248,"start_character":55,"end_line":248,"end_character":60},"updated":"2019-10-02 08:07:52.000000000","message":"\"... it is save to merge them on top of each other!\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":245,"context_line":"to the branch.  All too often, some days later we see this original"},{"line_number":246,"context_line":"change has passed all tests and commit it.  Just because those other 3"},{"line_number":247,"context_line":"changes didn\u0027t create a merge conflict (i.e. directly touch the same"},{"line_number":248,"context_line":"code as being committed) does *not* mean it is safe to merge!  Maybe"},{"line_number":249,"context_line":"the change obsoletes some API that the prior changes are now using."},{"line_number":250,"context_line":"The only way to really be safe is to run the testing again, against"},{"line_number":251,"context_line":"the current top-of-tree."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_6cfa0ebd","line":248,"range":{"start_line":248,"start_character":55,"end_line":248,"end_character":60},"in_reply_to":"3fa7e38b_76b9aee7","updated":"2020-07-15 05:14:58.000000000","message":"removed","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":246,"context_line":"change has passed all tests and commit it.  Just because those other 3"},{"line_number":247,"context_line":"changes didn\u0027t create a merge conflict (i.e. directly touch the same"},{"line_number":248,"context_line":"code as being committed) does *not* mean it is safe to merge!  Maybe"},{"line_number":249,"context_line":"the change obsoletes some API that the prior changes are now using."},{"line_number":250,"context_line":"The only way to really be safe is to run the testing again, against"},{"line_number":251,"context_line":"the current top-of-tree."},{"line_number":252,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f6c4be61","line":249,"range":{"start_line":249,"start_character":0,"end_line":249,"end_character":10},"updated":"2019-10-02 08:07:52.000000000","message":"\"one change\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":246,"context_line":"change has passed all tests and commit it.  Just because those other 3"},{"line_number":247,"context_line":"changes didn\u0027t create a merge conflict (i.e. directly touch the same"},{"line_number":248,"context_line":"code as being committed) does *not* mean it is safe to merge!  Maybe"},{"line_number":249,"context_line":"the change obsoletes some API that the prior changes are now using."},{"line_number":250,"context_line":"The only way to really be safe is to run the testing again, against"},{"line_number":251,"context_line":"the current top-of-tree."},{"line_number":252,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_4cf58aca","line":249,"range":{"start_line":249,"start_character":0,"end_line":249,"end_character":10},"in_reply_to":"3fa7e38b_f6c4be61","updated":"2020-07-15 05:14:58.000000000","message":"remvoed","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":251,"context_line":"the current top-of-tree."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"It quickly becomes impractical for developers to manage this workflow"},{"line_number":254,"context_line":"manually.  You have to implement locks where you ensure others don\u0027t"},{"line_number":255,"context_line":"commit while you\u0027re testing.  People forget and commit anyway.  One"},{"line_number":256,"context_line":"person is fixing while another is reverting and things get even worse."},{"line_number":257,"context_line":"Experience has proven the *only* practical way to manage a"},{"line_number":258,"context_line":"multi-developer, CI-based workflow is to have tools test and merge"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_76ae8e99","line":255,"range":{"start_line":254,"start_character":49,"end_line":255,"end_character":27},"updated":"2019-10-02 08:07:52.000000000","message":"\"... ensure others don\u0027t test test their commits on top-of-tree before previous changes are tested and merged\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"It quickly becomes impractical for developers to manage this workflow"},{"line_number":254,"context_line":"manually.  You have to implement locks where you ensure others don\u0027t"},{"line_number":255,"context_line":"commit while you\u0027re testing.  People forget and commit anyway.  One"},{"line_number":256,"context_line":"person is fixing while another is reverting and things get even worse."},{"line_number":257,"context_line":"Experience has proven the *only* practical way to manage a"},{"line_number":258,"context_line":"multi-developer, CI-based workflow is to have tools test and merge"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f6727e49","line":255,"range":{"start_line":255,"start_character":30,"end_line":255,"end_character":62},"updated":"2019-10-02 08:07:52.000000000","message":"You are using here a lot \"commit\" here. I believe that the issue is actually the testing and merging. It is IMHO a common use of other CIs too that you actually build-test your commit (PR, change) on top of HEAD/Trunk/... not on top of the origin of the branch.\n\nMaybe it should be explained above more what is meant. Example of a typical CI workflow and than go from there with the examples in this text. \n\nThe big innovation I understand you want to promote here is gating/speculative merging of changes on top of each other instead on top of HEAD, which gives the parallel testing in best case (without gate reset) a huge performance advantage.\n\nA typical check pipeline tests the change against the HEAD (also common for other CIs), a typical gate pipeline lines up changes which are then build/tested on top of each other.\n\nJust a suggestion.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"It quickly becomes impractical for developers to manage this workflow"},{"line_number":254,"context_line":"manually.  You have to implement locks where you ensure others don\u0027t"},{"line_number":255,"context_line":"commit while you\u0027re testing.  People forget and commit anyway.  One"},{"line_number":256,"context_line":"person is fixing while another is reverting and things get even worse."},{"line_number":257,"context_line":"Experience has proven the *only* practical way to manage a"},{"line_number":258,"context_line":"multi-developer, CI-based workflow is to have tools test and merge"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_8c14c2ea","line":255,"range":{"start_line":255,"start_character":30,"end_line":255,"end_character":62},"in_reply_to":"3fa7e38b_f6727e49","updated":"2020-07-15 05:14:58.000000000","message":"a good point, i\u0027ve reworked things to highlight more the speculative testing","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":259,"context_line":"code safely for you.  This is a shift in thinking, but a very valuable"},{"line_number":260,"context_line":"one."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"People don\u0027t commit code any more.  People give the systems"},{"line_number":263,"context_line":"*permission* to commit code.  In Gerrit, this might be a \"workflow\""},{"line_number":264,"context_line":"tag added to the review.  In GitHub this can be a comment or tag.  In"},{"line_number":265,"context_line":"both cases you use the inbuilt authentication tools of your code"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_76b52ecd","line":262,"range":{"start_line":262,"start_character":13,"end_line":262,"end_character":19},"updated":"2019-10-02 08:07:52.000000000","message":"\"merge\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":259,"context_line":"code safely for you.  This is a shift in thinking, but a very valuable"},{"line_number":260,"context_line":"one."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"People don\u0027t commit code any more.  People give the systems"},{"line_number":263,"context_line":"*permission* to commit code.  In Gerrit, this might be a \"workflow\""},{"line_number":264,"context_line":"tag added to the review.  In GitHub this can be a comment or tag.  In"},{"line_number":265,"context_line":"both cases you use the inbuilt authentication tools of your code"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_2c82d600","line":262,"range":{"start_line":262,"start_character":13,"end_line":262,"end_character":19},"in_reply_to":"3fa7e38b_76b52ecd","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":278,"context_line":"pass, and run our testing including those changes.  To say this"},{"line_number":279,"context_line":"another way, if change A is currently testing for merge, and change B"},{"line_number":280,"context_line":"is approved for merge, it is valid for change B to first apply change"},{"line_number":281,"context_line":"A, then itself (change B) and test.  This reflects the future state of"},{"line_number":282,"context_line":"the tree at the time B will merge."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"If A and B pass (as is common), they can be committed and we saved"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_f6c03e2d","line":281,"range":{"start_line":281,"start_character":55,"end_line":281,"end_character":61},"updated":"2019-10-02 08:07:52.000000000","message":"\"possible/probable future\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":278,"context_line":"pass, and run our testing including those changes.  To say this"},{"line_number":279,"context_line":"another way, if change A is currently testing for merge, and change B"},{"line_number":280,"context_line":"is approved for merge, it is valid for change B to first apply change"},{"line_number":281,"context_line":"A, then itself (change B) and test.  This reflects the future state of"},{"line_number":282,"context_line":"the tree at the time B will merge."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"If A and B pass (as is common), they can be committed and we saved"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_0c855207","line":281,"range":{"start_line":281,"start_character":55,"end_line":281,"end_character":61},"in_reply_to":"3fa7e38b_f6c03e2d","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":281,"context_line":"A, then itself (change B) and test.  This reflects the future state of"},{"line_number":282,"context_line":"the tree at the time B will merge."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"If A and B pass (as is common), they can be committed and we saved"},{"line_number":285,"context_line":"considerable time by testing them in parallel.  If change A fails,"},{"line_number":286,"context_line":"then change B should automatically re-test itself against the head of"},{"line_number":287,"context_line":"the branch and have a chance to commit.  If change B fails while A is"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_b6e086ce","line":284,"range":{"start_line":284,"start_character":16,"end_line":284,"end_character":30},"updated":"2019-10-02 08:07:52.000000000","message":"This really depends on project\u0027s jobs and \"flakyness\" of each project\u0027s tests. I would suggest to reformulate or remove this.","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":281,"context_line":"A, then itself (change B) and test.  This reflects the future state of"},{"line_number":282,"context_line":"the tree at the time B will merge."},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"If A and B pass (as is common), they can be committed and we saved"},{"line_number":285,"context_line":"considerable time by testing them in parallel.  If change A fails,"},{"line_number":286,"context_line":"then change B should automatically re-test itself against the head of"},{"line_number":287,"context_line":"the branch and have a chance to commit.  If change B fails while A is"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_4c7aaa23","line":284,"range":{"start_line":284,"start_character":16,"end_line":284,"end_character":30},"in_reply_to":"3fa7e38b_b6e086ce","updated":"2020-07-15 05:14:58.000000000","message":"People don\u0027t write tests to fail, however.  I mean you expect them to pass an flakyness is a bug, hopefully to be eliminated.  It think it\u0027s probably fair to say that tests are expected to pass","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":285,"context_line":"considerable time by testing them in parallel.  If change A fails,"},{"line_number":286,"context_line":"then change B should automatically re-test itself against the head of"},{"line_number":287,"context_line":"the branch and have a chance to commit.  If change B fails while A is"},{"line_number":288,"context_line":"running, or after A has merged, then clearly it conflicts with change"},{"line_number":289,"context_line":"A and should not be merged.  Zuul manages all these complex"},{"line_number":290,"context_line":"interactions to ensure that all changes are tested correctly but with"},{"line_number":291,"context_line":"as much parallelism as possible."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_16cf1a58","line":288,"range":{"start_line":288,"start_character":24,"end_line":288,"end_character":30},"updated":"2019-10-02 08:07:52.000000000","message":"suggestion: \"passed\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":286,"context_line":"then change B should automatically re-test itself against the head of"},{"line_number":287,"context_line":"the branch and have a chance to commit.  If change B fails while A is"},{"line_number":288,"context_line":"running, or after A has merged, then clearly it conflicts with change"},{"line_number":289,"context_line":"A and should not be merged.  Zuul manages all these complex"},{"line_number":290,"context_line":"interactions to ensure that all changes are tested correctly but with"},{"line_number":291,"context_line":"as much parallelism as possible."},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_96046a80","line":289,"range":{"start_line":289,"start_character":2,"end_line":289,"end_character":13},"updated":"2019-10-02 08:07:52.000000000","message":"... and change B should ...","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":286,"context_line":"then change B should automatically re-test itself against the head of"},{"line_number":287,"context_line":"the branch and have a chance to commit.  If change B fails while A is"},{"line_number":288,"context_line":"running, or after A has merged, then clearly it conflicts with change"},{"line_number":289,"context_line":"A and should not be merged.  Zuul manages all these complex"},{"line_number":290,"context_line":"interactions to ensure that all changes are tested correctly but with"},{"line_number":291,"context_line":"as much parallelism as possible."},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_ac754634","line":289,"range":{"start_line":289,"start_character":2,"end_line":289,"end_character":13},"in_reply_to":"3fa7e38b_96046a80","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"Zuul\u0027s operation encourages developers to create better focused,"},{"line_number":294,"context_line":"encapsulated changes by handling dependencies wisely.  If you submit a"},{"line_number":295,"context_line":"\"stack\" of changes; three separate commits building on each other, for"},{"line_number":296,"context_line":"example, Zuul ensures that each is tested in order.  What does this"},{"line_number":297,"context_line":"mean practically?"},{"line_number":298,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_b6096696","line":295,"range":{"start_line":295,"start_character":20,"end_line":295,"end_character":25},"updated":"2019-10-02 08:07:52.000000000","message":"multiple","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"Zuul\u0027s operation encourages developers to create better focused,"},{"line_number":294,"context_line":"encapsulated changes by handling dependencies wisely.  If you submit a"},{"line_number":295,"context_line":"\"stack\" of changes; three separate commits building on each other, for"},{"line_number":296,"context_line":"example, Zuul ensures that each is tested in order.  What does this"},{"line_number":297,"context_line":"mean practically?"},{"line_number":298,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_ec90de45","line":295,"range":{"start_line":295,"start_character":20,"end_line":295,"end_character":25},"in_reply_to":"3fa7e38b_b6096696","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":300,"context_line":"has done for you in a known local source directory.  So, for example,"},{"line_number":301,"context_line":"a job conceptually might be as simple as ``cd"},{"line_number":302,"context_line":"/home/zuul/src/opendev.org/project/tree \u0026\u0026 tox``.  Zuul has sorted out"},{"line_number":303,"context_line":"all the dependencies ahead of you and that source tree represents the"},{"line_number":304,"context_line":"state you should be testing against.  But it gets even better!  You"},{"line_number":305,"context_line":"can trivially do cross-project testing.  Say you depend on another"},{"line_number":306,"context_line":"Python project; you can configure your jobs to *also* check-out this"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_36f57684","line":303,"range":{"start_line":303,"start_character":27,"end_line":303,"end_character":33},"updated":"2019-10-02 08:07:52.000000000","message":"not sure if they are \"ahead of you\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":301,"context_line":"a job conceptually might be as simple as ``cd"},{"line_number":302,"context_line":"/home/zuul/src/opendev.org/project/tree \u0026\u0026 tox``.  Zuul has sorted out"},{"line_number":303,"context_line":"all the dependencies ahead of you and that source tree represents the"},{"line_number":304,"context_line":"state you should be testing against.  But it gets even better!  You"},{"line_number":305,"context_line":"can trivially do cross-project testing.  Say you depend on another"},{"line_number":306,"context_line":"Python project; you can configure your jobs to *also* check-out this"},{"line_number":307,"context_line":"project alongside your own code.  What this means is, in your job,"},{"line_number":308,"context_line":"instead of doing say ``pip install project`` and getting the code from"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_56335263","line":305,"range":{"start_line":304,"start_character":38,"end_line":305,"end_character":39},"updated":"2019-10-02 08:07:52.000000000","message":"Maybe this part needs its own (sub-)section?","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":308,"context_line":"instead of doing say ``pip install project`` and getting the code from"},{"line_number":309,"context_line":"PyPi, you would do ``pip install"},{"line_number":310,"context_line":"/home/zuul/src/github.com/foo/project`` to use the source-tree Zuul"},{"line_number":311,"context_line":"has checked out.  If you wish to test against another, uncommitted"},{"line_number":312,"context_line":"change in ``project`` too, simply add ``Depends-On:"},{"line_number":313,"context_line":"https://github.com/foo/project/pull-request`` that points to the pull"},{"line_number":314,"context_line":"request for the other project you wish to test against.  Now Zuul will"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_363a5634","line":311,"range":{"start_line":311,"start_character":55,"end_line":311,"end_character":66},"updated":"2019-10-02 08:07:52.000000000","message":"\"unmerged\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":332,"context_line":"automated testing).  Errors here are the first flag for a developer if"},{"line_number":333,"context_line":"something is wrong with their change."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"When Zuul sees a change is updated with approval tags, it can go into"},{"line_number":336,"context_line":"a *gate* pipeline that is setup to ensure strict ordering of commits"},{"line_number":337,"context_line":"as described above.  Once the change passes in this pipeline, it is"},{"line_number":338,"context_line":"merged in order; note Zuul does not merge the change directly, but"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_36233608","line":335,"updated":"2019-10-02 08:07:52.000000000","message":"I would consider moving this paragraph down to \"Project gating\"","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":332,"context_line":"automated testing).  Errors here are the first flag for a developer if"},{"line_number":333,"context_line":"something is wrong with their change."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"When Zuul sees a change is updated with approval tags, it can go into"},{"line_number":336,"context_line":"a *gate* pipeline that is setup to ensure strict ordering of commits"},{"line_number":337,"context_line":"as described above.  Once the change passes in this pipeline, it is"},{"line_number":338,"context_line":"merged in order; note Zuul does not merge the change directly, but"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_7f2e2e8c","line":335,"in_reply_to":"3fa7e38b_36233608","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"dbca1baa0737089e8f4093b13bcbcfd54c566f2b","unresolved":false,"context_lines":[{"line_number":335,"context_line":"When Zuul sees a change is updated with approval tags, it can go into"},{"line_number":336,"context_line":"a *gate* pipeline that is setup to ensure strict ordering of commits"},{"line_number":337,"context_line":"as described above.  Once the change passes in this pipeline, it is"},{"line_number":338,"context_line":"merged in order; note Zuul does not merge the change directly, but"},{"line_number":339,"context_line":"signals to the code review system (via API or similar) the change"},{"line_number":340,"context_line":"should be merged.  Usually projects configure the same jobs to run in"},{"line_number":341,"context_line":"the gate pipeline as the check pipeline, although they do not have to."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa7e38b_560cb293","line":338,"range":{"start_line":338,"start_character":36,"end_line":338,"end_character":41},"updated":"2019-10-02 08:07:52.000000000","message":"see here you use \"merge\" not \"commit\" :)","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"4b43c12d2dedc26044f2f5c3c260dc14190aeff5","unresolved":false,"context_lines":[{"line_number":335,"context_line":"When Zuul sees a change is updated with approval tags, it can go into"},{"line_number":336,"context_line":"a *gate* pipeline that is setup to ensure strict ordering of commits"},{"line_number":337,"context_line":"as described above.  Once the change passes in this pipeline, it is"},{"line_number":338,"context_line":"merged in order; note Zuul does not merge the change directly, but"},{"line_number":339,"context_line":"signals to the code review system (via API or similar) the change"},{"line_number":340,"context_line":"should be merged.  Usually projects configure the same jobs to run in"},{"line_number":341,"context_line":"the gate pipeline as the check pipeline, although they do not have to."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_df4e5a6d","line":338,"range":{"start_line":338,"start_character":36,"end_line":338,"end_character":41},"in_reply_to":"3fa7e38b_560cb293","updated":"2020-07-15 05:14:58.000000000","message":"Done","commit_id":"93f6803bfcb7686b4e607d14cfd21124a8e58b20"}],"doc/source/zen.rst":[{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":108,"context_line":"\"if it\u0027s not tested it\u0027s broken\"."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"So on one hand we want as much and extensive testing as possible."},{"line_number":111,"context_line":"However, in modern projects there are usually many more tests code"},{"line_number":112,"context_line":"than are practical for a developer to run by themselves.  A subset is"},{"line_number":113,"context_line":"often run locally during development covering the feature or bug being"},{"line_number":114,"context_line":"worked on, but larger tests integrating the change across the entire"}],"source_content_type":"text/x-rst","patch_set":4,"id":"5345c54f_63fc6766","line":111,"updated":"2023-03-10 23:52:40.000000000","message":"\"many more tests code\" doesn\u0027t parse for me, not sure exactly what phrasing you were going for though.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":135,"context_line":"Zuul manages the entire life-cycle of a change; it monitors projects"},{"line_number":136,"context_line":"for incoming changes and runs pre-configured testing against them,"},{"line_number":137,"context_line":"captures relevant logs and debugging info and reports back so that"},{"line_number":138,"context_line":"reviewers know the code has passed testing.  Once approved Zuul will"},{"line_number":139,"context_line":"handle re-testing, merge and any post-merge tasks required."},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Running tests"}],"source_content_type":"text/x-rst","patch_set":4,"id":"cb0a4051_b0fa4089","line":138,"updated":"2023-03-10 23:52:40.000000000","message":"It also notifies the developer who proposed the change, which is fairly important to the process, since this may cause them to iterate on further improvements before wasting reviewers\u0027 time.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":150,"context_line":"``.zuul.yaml`` configuration file defines a series of jobs.  Each job"},{"line_number":151,"context_line":"defines the tasks to run, the resources it requires to run on and"},{"line_number":152,"context_line":"other `well documented"},{"line_number":153,"context_line":"\u003chttps://zuul-ci.org/docs/zuul/reference/jobs.html\u003e`__ options"},{"line_number":154,"context_line":"(e.g. filters that might run documentation jobs only when files in"},{"line_number":155,"context_line":"``docs/`` are touched)."},{"line_number":156,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"a2d824d1_67a64be4","line":153,"updated":"2023-03-10 23:52:40.000000000","message":"This URL will need correcting to something that works now.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":169,"context_line":"Zuul provides a bridge for this gap between testing and production by"},{"line_number":170,"context_line":"leveraging the power of `Ansible \u003chttps://www.ansible.com\u003e`__ in its"},{"line_number":171,"context_line":"jobs.  So when we say Zuul runs a job, this largely means that Zuul"},{"line_number":172,"context_line":"runs an Ansible against the hosts defined in the job."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"For those with no prior exposure to Ansible, it is in essence a tool"},{"line_number":175,"context_line":"to run commands on a remote host.  Operators have long since realised"}],"source_content_type":"text/x-rst","patch_set":4,"id":"e8907ed3_0abe008f","line":172,"updated":"2023-03-10 23:52:40.000000000","message":"Nit: \"runs an Ansible\" seems a bit idiomatic, maybe \"runs Ansible play(book)s?\" Something like that anyway. Introducing readers to accurate terminology could be part of this document\u0027s purpose.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":178,"context_line":"purpose built for the task.  A \"playbook\" is a series of commands to"},{"line_number":179,"context_line":"run; think of a structured shell-script.  A \"role\" is analogous to a"},{"line_number":180,"context_line":"function call that encapsulates some common task.  Roles are designed"},{"line_number":181,"context_line":"to be self-encapsulated, idempotent and shared."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"The power of this approach is that a job can grow from Ansible being"},{"line_number":184,"context_line":"used to call an existing shell script and get out of the way, to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"35aa2b9e_0f337f92","line":181,"updated":"2023-03-10 23:52:40.000000000","message":"Nit: This paragraph starts talking about playbooks and roles without really introducing the terms, just jumps straight to definitions. Maybe preface with something along the lines of, \"Ansible orchestrates tasks with the use of plays, playbooks and roles.\"","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"Using Ansible you can build jobs that consist of of well-tested,"},{"line_number":214,"context_line":"portable and compontentised building blocks; but retain the ability to"},{"line_number":215,"context_line":"just call out to an ad-hoc or existing scripts if you need it.  If"},{"line_number":216,"context_line":"you\u0027re familiar with basic Ansible concepts everything is natural, and"},{"line_number":217,"context_line":"if you\u0027re not, any time invested means you are acquiring broadly"},{"line_number":218,"context_line":"applicable Ansible skills."}],"source_content_type":"text/x-rst","patch_set":4,"id":"472cfa3e_9e98dc8f","line":215,"updated":"2023-03-10 23:52:40.000000000","message":"Nit: You don\u0027t really need \"an\" here as it\u0027s singular while \"scripts\" is plural. Alternatively, maybe you meant \"an ad-hoc script or existing scripts?\"","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":220,"context_line":"Test jobs benefit from the Ansible ecosystem providing you with a huge"},{"line_number":221,"context_line":"array of common components.  Zuul itself comes with a `constantly"},{"line_number":222,"context_line":"growing collection of roles"},{"line_number":223,"context_line":"\u003chttps://opendev.org/zuul/zuul-jobs/src/branch/master/roles\u003e`__ to"},{"line_number":224,"context_line":"make the complex seem trivial.  Perhaps your job has two hosts to use"},{"line_number":225,"context_line":"during testing, and need to configure the firewalls and ssh"},{"line_number":226,"context_line":"authorisation between them -- there\u0027s roles for that.  Perhaps you"}],"source_content_type":"text/x-rst","patch_set":4,"id":"45bc4125_19c4ed58","line":223,"updated":"2023-03-10 23:52:40.000000000","message":"Could point to https://zuul-ci.org/docs/zuul-jobs/roles.html instead as it\u0027s more approachable and maybe less overwhelming.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":222,"context_line":"growing collection of roles"},{"line_number":223,"context_line":"\u003chttps://opendev.org/zuul/zuul-jobs/src/branch/master/roles\u003e`__ to"},{"line_number":224,"context_line":"make the complex seem trivial.  Perhaps your job has two hosts to use"},{"line_number":225,"context_line":"during testing, and need to configure the firewalls and ssh"},{"line_number":226,"context_line":"authorisation between them -- there\u0027s roles for that.  Perhaps you"},{"line_number":227,"context_line":"want to trigger `readthedocs \u003chttps://readthedocs.org\u003e`__ to update"},{"line_number":228,"context_line":"your documentation when a change is merged -- there\u0027s a role for that!"}],"source_content_type":"text/x-rst","patch_set":4,"id":"20ffe815_10c0bb24","line":225,"updated":"2023-03-10 23:52:40.000000000","message":"s/need/needs/ (job is singular)","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":230,"context_line":"things that can be surprisingly tricky) -- there\u0027s roles for that!"},{"line_number":231,"context_line":"Roles for building documentation, uploading releases to PyPi and"},{"line_number":232,"context_line":"related environments and interacting with container environments are"},{"line_number":233,"context_line":"all provided -- and you are welcome to contribute more!"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"When your test is done, it is only useful if you can see what it did."},{"line_number":236,"context_line":"Zuul comes preconfigured with roles to collect and store logs to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"92f6359c_3ff90882","line":233,"updated":"2023-03-10 23:52:40.000000000","message":"Nit: I like this paragraph, though it\u0027s a bit heavy on exclamation marks! Exclamation marks are great, but ending three sentences in a row with them feels over the top! Sometimes less is more! ;)","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":281,"context_line":"and passing the details over to Zuul to run the jobs and the eventual"},{"line_number":282,"context_line":"removal when the job finishes.  It is aware of the cloud limits and"},{"line_number":283,"context_line":"makes smart scheduling decisions about how to provide resources"},{"line_number":284,"context_line":"(e.g. pre-emptively starting nodes when it can see their is increasing"},{"line_number":285,"context_line":"demand for them, or removing unused nodes when over capacity)."},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"From Zuul\u0027s view, it simply asks for nodes and, eventually, gets them."}],"source_content_type":"text/x-rst","patch_set":4,"id":"2eb6b596_5a164a55","line":284,"updated":"2023-03-10 23:52:40.000000000","message":"s/their/there/","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":291,"context_line":"Zuul then starts Ansible and runs the job playbooks against these"},{"line_number":292,"context_line":"testing nodes.  Zuul does this using it\u0027s \"executor\"; a sandboxed"},{"line_number":293,"context_line":"environment that Ansible runs within.  Each job gets its own sandbox"},{"line_number":294,"context_line":"environment; executor hosts can scale horizontally and as you scale up"},{"line_number":295,"context_line":"the number of concurrent jobs you can add more hosts to handle more"},{"line_number":296,"context_line":"executor processes."},{"line_number":297,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"694b3c44_3a0724d3","line":294,"updated":"2023-03-10 23:52:40.000000000","message":"\"Like every service in Zuul, executors can scale horizontally...\" (wasn\u0027t the case when you first wrote this, but great to underscore the recent progress)","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":304,"context_line":"As discussed above, Zuul handles the sequential merging of changes to"},{"line_number":305,"context_line":"ensure correctness by ensuring there is never a merge window where"},{"line_number":306,"context_line":"untested code is committed.  You can have 100% test coverage of your"},{"line_number":307,"context_line":"code; but if the tests did not run before the code was merged it is"},{"line_number":308,"context_line":"ultimately futile."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"It is impractical for developers to manage this work-flow manually."}],"source_content_type":"text/x-rst","patch_set":4,"id":"722cad42_141870e3","line":307,"updated":"2023-03-10 23:52:40.000000000","message":"Nit: Verb tense disagreement you want either \"if the tests do not run before the code is merged\" or \"it was ultimately futile.\"","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":315,"context_line":"rather people give Zuul *permission* to try and merge the code.  In"},{"line_number":316,"context_line":"Gerrit, this might be a \"workflow\" tag added to the review.  In GitHub"},{"line_number":317,"context_line":"this can be a comment or tag.  In both cases you use the inbuilt"},{"line_number":318,"context_line":"authentication tools of your code review tools to say who can add the"},{"line_number":319,"context_line":"flags that mark a change as \"good to merge\"."},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"At that point, you want your CI system to pick up the change, base it"}],"source_content_type":"text/x-rst","patch_set":4,"id":"4a39ccd4_0e197560","line":318,"updated":"2023-03-10 23:52:40.000000000","message":"Nit: \"tools of your tools\" is mildly repetitive.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":322,"context_line":"on the current state of the code, *run the testing again*, and, if it"},{"line_number":323,"context_line":"passes, merge."},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"Merging to the current tree and testing eliminates one class of"},{"line_number":326,"context_line":"problems; for example where a change was proposed an initially tested"},{"line_number":327,"context_line":"several days ago, and is then accepted for merge and needs to be"},{"line_number":328,"context_line":"re-tested with the current state of the tree.  However, unless you"}],"source_content_type":"text/x-rst","patch_set":4,"id":"384a3ef0_9a619820","line":325,"updated":"2023-03-10 23:52:40.000000000","message":"This could be misconstrued as implying that Zuul merges to the public repository before final tests are run, in contrast to the sequence you explain in the previous paragraph.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":323,"context_line":"passes, merge."},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"Merging to the current tree and testing eliminates one class of"},{"line_number":326,"context_line":"problems; for example where a change was proposed an initially tested"},{"line_number":327,"context_line":"several days ago, and is then accepted for merge and needs to be"},{"line_number":328,"context_line":"re-tested with the current state of the tree.  However, unless you"},{"line_number":329,"context_line":"lock out any other changes from merging while you test, you risk"}],"source_content_type":"text/x-rst","patch_set":4,"id":"25b01b47_606b9a87","line":326,"updated":"2023-03-10 23:52:40.000000000","message":"s/an/and/","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":348,"context_line":"considerable time by testing them in parallel.  If change A fails,"},{"line_number":349,"context_line":"then change B should automatically re-test itself against the head of"},{"line_number":350,"context_line":"the branch and have a chance to commit.  If change B fails while A is"},{"line_number":351,"context_line":"running, or after A has merged, then clearly it conflicts with change"},{"line_number":352,"context_line":"A and change B should not be merged.  Zuul manages all these complex"},{"line_number":353,"context_line":"interactions to ensure that all changes are tested correctly but with"},{"line_number":354,"context_line":"as much parallelism as possible."}],"source_content_type":"text/x-rst","patch_set":4,"id":"7aebd89e_55d32ac5","line":351,"updated":"2023-03-10 23:52:40.000000000","message":"I don\u0027t think this is true, nor how Zuul works. If B fails while A is running, Zuul doesn\u0027t assume anything about what that means until it sees whether A passes or fails. Maybe you wanted to say \"If change B fails and then A merges successfully?\"","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":398,"context_line":"For example, it is common to configure a *check* pipeline that"},{"line_number":399,"context_line":"captures new changes that are uploaded but not yet authorized for"},{"line_number":400,"context_line":"merge.  Jobs in this pipeline run against the current top-of-tree;"},{"line_number":401,"context_line":"Zuul reports back with the results (usually via a comment, although"},{"line_number":402,"context_line":"some code review systems have special reporting mechanisms for"},{"line_number":403,"context_line":"automated testing).  Errors here are the first flag for a developer if"},{"line_number":404,"context_line":"something is wrong with their change."}],"source_content_type":"text/x-rst","patch_set":4,"id":"e656ea74_f86ddec3","line":401,"updated":"2023-03-10 23:52:40.000000000","message":"Since this was originally written, it\u0027s now the case that Zuul might leave inline comments too, pointing out exactly where something went wrong. Not sure if you want to include that, just an idea that came to mind.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"When Zuul sees a change is updated with approval tags, it can go into"},{"line_number":407,"context_line":"a *gate* pipeline that is setup to ensure strict ordering of commits"},{"line_number":408,"context_line":"as described above.  Once the change passes in this pipeline, it is"},{"line_number":409,"context_line":"merged in order; note Zuul does not merge the change directly, but"},{"line_number":410,"context_line":"signals to the code review system (via API or similar) the change"},{"line_number":411,"context_line":"should be merged.  Usually projects configure the same jobs to run in"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ebadd9e8_41d15d4e","line":408,"updated":"2023-03-10 23:52:40.000000000","message":"What\u0027s described immediately above is an independent pipeline. The prior section starts out with \"as described above\" too, but the mention of \"strict ordering\" here is already pretty clear so you could just drop this \"as described above\" altogether.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a26074c4e14e3738cd6248e151b9aa18875da9f1","unresolved":false,"context_lines":[{"line_number":407,"context_line":"a *gate* pipeline that is setup to ensure strict ordering of commits"},{"line_number":408,"context_line":"as described above.  Once the change passes in this pipeline, it is"},{"line_number":409,"context_line":"merged in order; note Zuul does not merge the change directly, but"},{"line_number":410,"context_line":"signals to the code review system (via API or similar) the change"},{"line_number":411,"context_line":"should be merged.  Usually projects configure the same jobs to run in"},{"line_number":412,"context_line":"the gate pipeline as the check pipeline, although they do not have to."},{"line_number":413,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"8fb31390_11ca19ff","line":410,"updated":"2023-03-10 23:52:40.000000000","message":"I would describe what Zuul does as commanding or instructing the code management system to merge the change, not merely signalling that it should be merged.","commit_id":"c18f9c9a9ca4276e13c2a8d9bdc72a50c4f6c5f9"}]}
