| Prepare gerrit submodules |
| |
| Gerrit has a number of repos which are submodules of the Gerrit repo, |
| and some plugins are expected to be built by being copied into the |
| Gerrit repo. This is generally compatible with the way Zuul operates, |
| but special care needs to be taken. |
| |
| Zuul prepares the git repository states for all of the projects |
| involved in testing a change. These projects may include the project |
| that the change is against, any other project if the change has a |
| "Depends-On" footer pointing to a change in that other project, and |
| any projects which the job specifies with "required-projects". These |
| git repository states represent the proposed future state of the |
| world, in all branches, with dependent changes applied. |
| |
| This matches well with Gerrit's submodule subscription system, in that |
| if a change to Gerrit "Depends-On" a change to a plugin, then as soon |
| as that plugin change merges, The submodule in the Gerrit repo will be |
| updated to the new plugin sha. In other words, we can say with high |
| confidence that the state of the world that was tested in Zuul is what |
| actually resulted after the merge. |
| |
| However, Zuul itself does not perform any actions on submodules. A |
| simple "git submodule update --init" would discard the state of the |
| repositories that Zuul prepared and would invalidate our testing. But |
| since Zuul has already prepared the repos, we don't need to use a "git |
| submodule" command, we just need to move them into the correct |
| location. That is what this role does. |
| |
| There is one edge case: if a repo does not have the branch that is |
| being tested, then Gerrit's submodule subscription does not work. |
| That means that Zuul may not have checked out the same git sha as the |
| submodule pointer in the gerrit repo, and we can not assume that if a |
| change in a plugin lands, that the submodule pointer will be updated. |
| In this case, this role falls back to performing a "git submodule |
| update --init". If, however, there is a dependent change in that |
| repo, then this role will fail the job. That is an untestable |
| situation that can only be resolved by merging the dependent change |
| and manually updating the submodule pointer in the Gerrit repo. |
| |
| The best way to avoid that situation is to ensure that all the |
| dependent projects have the same branches as Gerrit itself. |
| |
| **Role Variables** |
| |
| .. zuul:rolevar:: gerrit_project_mapping |
| :type: dict |
| |
| A dictionary to map Gerrit sub-projects to their location in the |
| gerrit repo. This role iterates over every Zuul project and |
| assumes that it should be copied into the gerrit project with its |
| full project name. For example, the `plugins/download-commands` |
| project will be copied into the ``plugins/download-commands`` |
| directory under gerrit. To specify an alternate location, add an |
| entry to this dictionary in the form ``project_name: |
| destination_dir``. To omit copying the project into the gerrit |
| repo, supply the empty string. |
| |
| The following is the default value; it instructs the role not to |
| copy the gerrit project into itself, and to copy the jgit project |
| into ``modules/jgit``: |
| |
| .. code-block:: yaml |
| |
| gerrit_project_mapping: |
| gerrit: '' |
| jgit: modules/jgit |
| |
| .. zuul:rolevar:: gerrit_project_name |
| :default: gerrit.googlesource.com/gerrit |
| |
| The canonical name of the Gerrit repository. This role uses this |
| value to look up the branch of Gerrit which is checked out in order |
| to detect whether or not sub-projects contain the same branch. |