From 65ed837e31c8a6d916f73a1da78b0e87f910fbbc Mon Sep 17 00:00:00 2001 From: Jeremy Stanley Date: Fri, 2 Sep 2016 17:05:14 +0000 Subject: [PATCH] Update project rename instructions When I919ba42b0d22126719daa7ad308f75ce021720b7 merged, it introduced a few regressions into our process: * Github renaming/transferring was dropped * Switched to a very slow (for our environment) Zuul stopping method * it advocated for composing a rename parameters file very late in the process This change fixes the above issues. It also updates the documentation to note that Puppet should be stopped well in advance of the maintenance window, and updates the playbook to no longer run an offline Gerrit reindex (since online reindexing is now supported). Change-Id: Ie249214c0d1b1df6c66d4910002e35d8c17c3b69 --- doc/source/gerrit.rst | 80 ++++++++++++------------------------- playbooks/rename_repos.yaml | 63 ++++++++++++----------------- 2 files changed, 51 insertions(+), 92 deletions(-) diff --git a/doc/source/gerrit.rst b/doc/source/gerrit.rst index d1947f7fa5..09b22c482b 100644 --- a/doc/source/gerrit.rst +++ b/doc/source/gerrit.rst @@ -408,49 +408,6 @@ project in question, and about 10 minutes of downtime for all of Gerrit. All Gerrit changes, merged and open, will carry over, so in-progress changes do not need to be merged before the move. -Note that some of the steps in the process below are repetitive and -so for larger batches a script can be used to generate the command -lists for upload to and execution on their respective servers:: - - #!/bin/sh - # - # Expects a renames.list file in the current directory with: - # - # stackforge/foo -> openstack/foo - # openstack/oldbar -> openstack/newbar - - echo "\nGerrit database updates\n-----------------------" - for r in `sed 's/ -> /@/' renames.list` ; do - OLD=`echo $r | cut -d@ -f1` - NEW=`echo $r | cut -d@ -f2` - echo "update account_project_watches set project_name = \"$NEW\" where - project_name = \"$OLD\";" - echo "update changes set dest_project_name = \"$NEW\", - created_on = created_on where dest_project_name = \"$OLD\";" - done - - echo "\nGerrit filesystem updates\n-------------------------" - for r in `sed 's/ -> /@/' renames.list` ; do - OLD=`echo $r | cut -d@ -f1` ; NEW=`echo $r | cut -d@ -f2` - echo "sudo mv ~gerrit2/review_site/git/{$OLD,$NEW}.git" - echo "sudo mv /opt/lib/git/{$OLD,$NEW}.git" - done - - echo "\nGit farm filesystem updates\n---------------------------" - for r in `sed 's/ -> /@/' renames.list` ; do - OLD=`echo $r | cut -d@ -f1` - NEW=`echo $r | cut -d@ -f2` - echo "sudo mv /var/lib/git/{$OLD,$NEW}.git" - done - - echo "\nJenkins workspace cleanup\n-------------------------" - for r in `sed 's/ -> /@/' renames.list` ; do - NAME=`echo $r | cut -d@ -f1 | cut -d/ -f2` - echo "sudo ansible-playbook -f 10 \\ - /etc/ansible/playbooks/clean_workspaces.yaml \\ - --extra-vars \"project=$NAME\"" - done - To rename a project: #. Prepare a change to the project-config repo to update things like @@ -461,15 +418,6 @@ To rename a project: openstack/governance repo, and .gitmodules in the openstack/openstack repo if necessary. -#. Stop puppet runs on the puppetmaster to prevent early application - of configuration changes:: - - sudo crontab -u root -e - - Comment out the crontab entries. Use ps to make sure that a run is - not currently in progress. When it finishes, make sure the entry - has not been added back to the crontab. - #. Prepare a yaml file called repos.yaml that has a single dictionary called `repos` with a list of dictionaries each having an old and new entry. Optionally also add a `gerrit_groups` dict of the same form:: @@ -481,13 +429,37 @@ To rename a project: - old: old-core-group new: new-core-group +#. An hour in advance of the maintenance (if possible), stop puppet + runs on the puppetmaster to prevent early application of + configuration changes:: + + sudo crontab -u root -e + + Comment out the crontab entries. Use ps to make sure that a run is + not currently in progress. When it finishes, make sure the entry + has not been added back to the crontab. + +#. Export and stop Zuul on zuul.openstack.org:: + + python /opt/zuul/tools/zuul-changes.py http://zuul.openstack.org gate >gate.sh + python /opt/zuul/tools/zuul-changes.py http://zuul.openstack.org check >check.sh + sudo invoke-rc.d zuul stop + sudo rm -f /var/run/zuul/zuul.pid /var/run/zuul/zuul.listedock + #. Run the ansible rename repos playbook, passing in the path to your yaml file:: sudo ansible-playbook -f 10 /opt/system-config/production/playbooks/rename_repos.yaml -e repolist=ABSOLUTE_PATH_TO_VARS_FILE -#. Merge the prepared Puppet configuration change, removing the - original Jenkins jobs via the Jenkins WebUI later if needed. +#. Start Zuul on zuul.openstack.org:: + + sudo invoke-rc.d zuul start + sudo bash gate.sh + sudo bash check.sh + +#. Merge the prepared Puppet configuration changes. + +#. Rename the project or transfer ownership in GitHub #. Re-enable puppet runs on the puppetmaster:: diff --git a/playbooks/rename_repos.yaml b/playbooks/rename_repos.yaml index 6400949123..20b7f35471 100644 --- a/playbooks/rename_repos.yaml +++ b/playbooks/rename_repos.yaml @@ -1,74 +1,61 @@ --- -- hosts: zuul.openstack.org - gather_facts: False - remote_user: root - sudo: yes - tasks: - - shell: kill -USR1 $(cat /var/run/zuul/zuul.pid) - - shell: rm -f /var/run/zuul/zuul.pid /var/run/zuul/zuul.lock - hosts: review.openstack.org gather_facts: False remote_user: root - sudo: yes tasks: - shell: invoke-rc.d gerrit stop - include_vars: "{{ repolist }}" - shell: echo 'update account_project_watches set project_name = "{{ item.new }}" where project_name = "{{ item.old }}";' | mysql reviewdb - with_items: repos + with_items: {{ repos }} - shell: echo 'update changes set dest_project_name = "{{ item.new }}", created_on = created_on where dest_project_name = "{{ item.old }}";' | mysql reviewdb - with_items: repos - - shell: mv {{ item[0] }}{{ item[1].old }} {{ item[0] }}{{ item[1].new }} + with_items: {{ repos }} + - shell: mv {{ item[0] }}{{ item[1].old }}.git {{ item[0] }}{{ item[1].new }}.git with_nested: - - [ '~gerrit2/review_site/git/', '/opt/lib/git' ] - - repos + - [ '~gerrit2/review_site/git/', '/opt/lib/git/' ] + - {{ repos }} - hosts: 'git0*' gather_facts: False tasks: - include_vars: "{{ repolist }}" - - shell: mv {{ item[0] }}{{ item[1].old }} {{ item[0] }}{{ item[1].new }} + - shell: mv {{ item[0] }}{{ item[1].old }}.git {{ item[0] }}{{ item[1].new }}.git with_nested: - - [ '/var/lib/git' ] - - repos + - [ '/var/lib/git/' ] + - {{ repos }} - hosts: storyboard.openstack.org gather_facts: False remote_user: root - sudo: yes tasks: - include_vars: "{{ repolist }}" - - shell: echo 'update projects set name="{{ item.new }}" where name="{{ item.old }}";' | mysql storyboard - with_items: repos + - shell: echo 'update projects set name="{{ item.new }}" where name="{{ item.old }}";' | mysql --defaults-file=/root/.storyboard_db.cnf storyboard + with_items: {{ repos }} - hosts: review.openstack.org gather_facts: False - remote_user: gerrit2 - sudo: yes + remote_user: root + become: yes + become_user: gerrit2 tasks: - shell: cp -ax /home/gerrit2/review_site/index /home/gerrit2/index.backup.$(date +%s) - - shell: java -jar /home/gerrit2/review_site/bin/gerrit.war reindex -d /home/gerrit2/review_site - hosts: review.openstack.org gather_facts: False remote_user: root - sudo: yes tasks: - shell: invoke-rc.d gerrit start -- hosts: zuul.openstack.org - gather_facts: False - remote_user: root - sudo: yes - tasks: - - shell: invoke-rc.d zuul start - hosts: review.openstack.org gather_facts: False - remote_user: gerrit2 - sudo: yes - tasks: - - include_vars: "{{ repolist }}" - - shell: ssh -p 29418 review.openstack.org gerrit rename-group {{ item.old }} {{ item.new }} - with_items: "{{ gerrit_groups|default([]) }}" -- hosts: '*.slave.openstack.org' remote_user: root - sudo: yes + become: yes + become_user: gerrit2 + tasks: + - pause: prompt="Make sure that Gerrit ssh api is accepting requests. Use Enter or ^C c to continue. ^C a to abort." + - include_vars: "{{ repolist }}" + - shell: ssh -p 29418 -i /home/gerrit2/review_site/etc/ssh_project_rsa_key openstack-project-creator@review.openstack.org gerrit rename-group {{ item.old }} {{ item.new }} + with_items: "{{ gerrit_groups|default([]) }}" +# TODO: online reindex accounts +# TODO: online reindex projects +- hosts: '*.ci.openstack.org:*.slave.openstack.org' + remote_user: root gather_facts: False tasks: - include_vars: "{{ repolist }}" - shell: 'rm -rf ~jenkins/workspace/*{{ item.old | basename }}*' - with_items: repos + with_items: {{ repos }}