2.6 changelog gen/version/root dir cleanup (#40421)

* patched in changelog gen stuff from stable-2.5
* Makefile updates
* release.py as single-source-of-truth
* Remove obsolete ansible-core-sitemap.xml file.
* Move ROADMAP.rst into README.rst.
* dynamic rpm changelog, zap old deb/rpm changelogs
* fix changelog in MANIFEST.in
* Remove obsolete hacking/update.sh script.
* Remove ref to deleted authors script.
* Remove ref to removed module-formatter script.
* Update headings to match script names.
* MANIFEST.in cleanup
* removed RELEASES.txt and versions.yml
* removed obsolete release generation playbook/bits (not used since 2.5)
* misc Makefile cleanup
* speculative changes to DEB versioning
* allow override of DEB_VERSION/DEB_RELEASE
This commit is contained in:
Matt Davis
2018-05-21 16:14:53 -07:00
committed by Matt Clay
parent eb818df1ec
commit e4edb2842a
49 changed files with 334 additions and 8335 deletions

View File

@@ -1,210 +0,0 @@
- hosts: localhost
gather_facts: no
vars_files:
- vars/versions.yml
vars:
release_dir: "./ansible_release"
release_date: "{{lookup('pipe', 'date +\"%m-%d-%Y\"')}}"
rpm_spec_line: |
* {{lookup('pipe', 'date +"%a %b %d %Y"')}} Ansible, Inc. <info@ansible.com> - {{ansible_release_version}}-{{ansible_release_string}}
- Release {{ansible_release_version}}-{{ansible_release_string}}
deb_changelog_line: |
ansible ({{ansible_release_version}}) unstable; urgency=low
* {{ansible_release_version}}
-- Ansible, Inc. <info@ansible.com> {{lookup('pipe', 'date -R')}}
vars_prompt:
- name: ansible_release_branch
prompt: "Enter the release branch"
private: no
- name: ansible_release_version
prompt: "Enter the release version"
private: no
- name: ansible_release_string
prompt: "Enter the release string (ie. 0.1.beta1, or just 1 for final releases)"
private: no
#- name: ansible_release_codename
# prompt: "Enter the release code name (only used if doing a final release)"
# default: ""
# private: no
- name: has_submodules
prompt: "Does this branch have git submodules?"
default: "no"
private: no
- name: is_final
prompt: "Is this a final release (not a beta/rc)?"
default: "no"
private: no
- name: do_push
prompt: "Push repositories upstream when done?"
default: "no"
private: no
tasks:
- pause:
prompt: "Has the CHANGELOG.md, versions.yml, release_and_maintenance.rst, and any other files been updated and are ready to go?"
when: is_final|bool
- name: create a combined version string from the specified values
set_fact:
new_version: "v{{ansible_release_version}}-{{ansible_release_string}}"
- name: assert certain variables are defined
assert:
that:
- ansible_release_branch is defined
- ansible_release_version is defined
- ansible_release_string is defined
- name: Remove ansible_release (if it exists)
file:
path: "{{release_dir}}/"
state: absent
- name: Clone the official repo
git:
#repo: "git@github.com:ansible/ansible.git"
repo: "https://github.com/ansible/ansible.git"
dest: "{{release_dir}}"
version: "{{ansible_release_branch}}"
recursive: yes
- name: get the latest version
shell:
_raw_params: git tag | tail -1
chdir: "{{release_dir}}"
register: latest_version
- name: "assert the specified version ({{new_version}}) is greater than the latest version ({{latest_version.stdout}})"
assert:
that:
- new_version is version(latest_version.stdout, "gt")
ignore_errors: yes
- name: Update the VERSION file for the main repo
copy:
dest: "{{release_dir}}/VERSION"
content: "{{ansible_release_version}} {{ansible_release_string}}\n"
- name: Update the library version
lineinfile:
dest: "{{release_dir}}/lib/ansible/release.py"
regexp: "^__version__ ="
line: "__version__ = '{{ansible_release_version}}'"
- block:
- name: Update the spec file release list
lineinfile:
dest: "{{release_dir}}/packaging/rpm/ansible.spec"
regexp: "^- Release {{ansible_release_version}}-{{ansible_release_string}}"
line: "{{rpm_spec_line.rstrip()}}"
insertafter: "^%changelog"
- name: Update the deb changelog file
lineinfile:
dest: "{{release_dir}}/packaging/debian/changelog"
regexp: "^ansible ({{ansible_release_version}})"
line: "{{deb_changelog_line}}"
insertafter: "-- Ansible, Inc. <info@ansible.com> %DATE%"
- name: Update RELEASES.txt
template:
dest: "{{release_dir}}/RELEASES.txt"
src: "templates/RELEASES.tmpl"
when: is_final|bool
- name: "Make sure modules are checked out to {{ansible_release_branch}}"
shell:
_raw_params: "git checkout {{ansible_release_branch}}"
chdir: "{{release_dir}}/lib/ansible/modules/{{item}}/"
with_items:
- core
- extras
when: has_submodules|bool
- name: Update the VERSION file for the modules
copy:
dest: "{{release_dir}}/lib/ansible/modules/{{item}}/VERSION"
content: "{{ansible_release_version}} {{ansible_release_string}}\n"
with_items:
- core
- extras
when: has_submodules|bool
- name: Add and commit the updated files for the core modules
shell:
_raw_params: "git add ./ && git commit -m 'New release {{new_version}}'"
chdir: "{{release_dir}}/lib/ansible/modules/{{item}}/"
with_items:
- core
- extras
when: has_submodules|bool
- name: Add and commit the updated files for the main repo
shell:
_raw_params: "git add ./ && git commit -m 'New release {{new_version}}'"
chdir: "{{release_dir}}/"
- name: Tag the release
shell:
_raw_params: "git tag -fa {{new_version}} -m 'New release {{new_version}}'"
chdir: "{{release_dir}}/"
- name: update git config for the main repo
lineinfile:
dest: "{{release_dir}}/.git/config"
regexp: "upstream"
line: |
[remote "upstream"]
url = git@github.com:ansible/ansible.git
fetch = +refs/heads/*:refs/remotes/origin/*
- name: update git config for submodules
lineinfile:
dest: "{{release_dir}}/.git/modules/lib/ansible/modules/{{item}}/config"
regexp: "submodule_upstream"
line: |
[remote "submodule_upstream"]
url = git@github.com:ansible/ansible-modules-{{item}}.git
fetch = +refs/heads/*:refs/remotes/origin/*
with_items:
- core
- extras
when: has_submodules|bool
- name: create the dist tar.gz
command:
_raw_params: make sdist
chdir: "{{release_dir}}/"
environment:
OFFICIAL: yes
- name: rename the dist tar.gz to include the full release
command:
_raw_params: "mv dist/ansible-{{ansible_release_version}}.tar.gz dist/ansible-{{ansible_release_version}}-{{ansible_release_string}}.tar.gz"
chdir: "{{release_dir}}/"
- name: generate the SHA file for the tar.gz
shell:
_raw_params: "sha256sum dist/ansible-{{ansible_release_version}}-{{ansible_release_string}}.tar.gz > dist/ansible-{{ansible_release_version}}-{{ansible_release_string}}.tar.gz.sha"
chdir: "{{release_dir}}/"
- block:
- pause:
prompt: "Ready to push, this is the last chance to abort..."
- name: Push the submodule repos
shell:
_raw_params: "git push submodule_upstream {{ansible_release_branch}}"
chdir: "{{release_dir}}/lib/ansible/modules/{{item}}/"
with_items:
- core
- extras
when: has_submodules|bool
- name: Push the updates and/or tag
shell:
_raw_params: "git push --tags upstream {{ansible_release_branch}}"
chdir: "{{release_dir}}/lib/ansible/modules/{{item}}/"
when: do_push|bool

View File

@@ -1,16 +0,0 @@
Ansible Releases at a Glance
============================
VERSION RELEASE CODE NAME
++++++++++++++++++++++++++++++
{% for version in versions %}
{% for vkey, vdata in version.items() %}
{% for release in vdata.releases %}
{% for rkey, rdata in release.items() %}
{% set major_minor = vkey + "." + rkey %}
{{"%-8s"|format(major_minor)}} {{"%-10s"|format(rdata)}} "{{vdata.code_name}}"
{% endfor %}
{% endfor %}
{% endfor %}
{% endfor %}

View File

View File

@@ -0,0 +1,42 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type
import pytest
from packaging.version import InvalidVersion
from versionhelper.version_helper import AnsibleVersionMunger
@pytest.mark.parametrize('version,revision,codename,output_propname,expected', [
('2.5.0dev1', None, None, 'raw', '2.5.0dev1'),
('2.5.0', None, None, 'raw', '2.5.0'),
('2.5.0dev1', None, None, 'major_version', '2.5'),
('2.5.0', None, None, 'major_version', '2.5'),
('2.5.0dev1', None, None, 'base_version', '2.5.0'),
('2.5.0', None, None, 'base_version', '2.5.0'),
('2.5.0dev1', None, None, 'deb_version', '2.5.0~dev1'),
('2.5.0b1', None, None, 'deb_version', '2.5.0~b1'),
('2.5.0', None, None, 'deb_version', '2.5.0'),
('2.5.0dev1', None, None, 'deb_release', '1'),
('2.5.0b1', 2, None, 'deb_release', '2'),
('2.5.0dev1', None, None, 'rpm_release', '0.1.dev1'),
('2.5.0a1', None, None, 'rpm_release', '0.101.a1'),
('2.5.0b1', None, None, 'rpm_release', '0.201.b1'),
('2.5.0rc1', None, None, 'rpm_release', '0.1001.rc1'),
('2.5.0rc1', '0.99', None, 'rpm_release', '0.99.rc1'),
('2.5.0.rc.1', None, None, 'rpm_release', '0.1001.rc.1'),
('2.5.0', None, None, 'rpm_release', '1'),
('2.5.0', 2, None, 'rpm_release', '2'),
('2.5.0', None, None, 'codename', 'UNKNOWN'),
('2.5.0', None, 'LedZeppelinSongHere', 'codename', 'LedZeppelinSongHere'),
('2.5.0x1', None, None, None, InvalidVersion)
])
def test_output_values(version, revision, codename, output_propname, expected):
try:
v = AnsibleVersionMunger(version, revision, codename)
assert getattr(v, output_propname) == expected
except Exception as ex:
if isinstance(expected, type):
assert isinstance(ex, expected)
else:
raise

View File

@@ -1,167 +0,0 @@
versions:
- "2.6":
code_name: "Heartbreaker"
releases:
- "0": TBD
- "2.5":
code_name: "Kashmir"
releases:
- "0": TBD
- "2.4":
code_name: "Dancing Days"
releases:
- "4": "04-04-2018"
- "3": "01-31.2018"
- "2": "11-29-2017"
- "1": "10-25-2017"
- "0": "09-19-2017"
- "2.3":
code_name: "Ramble On"
releases:
- "3": "12-20-2017"
- "2": "08-04-2017"
- "1": "06-01-2017"
- "0": "04-12-2017"
- "2.2":
code_name: "The Battle of Evermore"
releases:
- "3": "05-09-2017"
- "2": "03-27-2017"
- "1": "01-16-2017"
- "0": "11-01-2016"
- "2.1":
code_name: "The Song Remains the Same"
releases:
- "6": "06-01-2017"
- "5": "03-27-2017"
- "4": "01-16-2017"
- "3": "11-04-2016"
- "2": "09-29-2016"
- "1": "07-28-2016"
- "0": "05-25-2016"
- "2.0":
code_name: "Over the Hills and Far Away"
releases:
- '2': "04-19-2016"
- '1': "02-24-2016"
- '0': "01-12-2016"
- "1.9":
code_name: "Dancing In the Streets"
releases:
- '6': "04-15-2016"
- '5': "03-21-2016"
- '4': "10-09-2015"
- '3': "09-03-2015"
- '2': "06-24-2015"
- '1': "04-27-2015"
- '0': "03-25-2015"
- "1.8":
code_name: "You Really Got Me"
releases:
- '4': "02-19-2015"
- '3': "02-17-2015"
- '2': "12-04-2014"
- '1': "11-26-2014"
- '0': "11-25-2014"
- "1.7":
code_name: "Summer Nights"
releases:
- '2': "09-24-2014"
- '1': "08-14-2014"
- '0': "08-06-2014"
- "1.6":
code_name: "The Cradle Will Rock"
releases:
- '10': "07-25-2014"
- '9': "07-24-2014"
- '8': "07-22-2014"
- '7': "07-21-2014"
- '6': "07-01-2014"
- '5': "06-25-2014"
- '4': "06-25-2014"
- '3': "06-09-2014"
- '2': "05-23-2014"
- '1': "05-07-2014"
- '0': "05-05-2014"
- "1.5":
code_name: "Love Walks In"
releases:
- '5': "04-18-2014"
- '4': "04-01-2014"
- '3': "03-13-2014"
- '2': "03-11-2014"
- '1': "03-10-2014"
- '0': "02-28-2014"
- "1.4":
code_name: "Could This Be Magic?"
releases:
- '5': "02-12-2014"
- '4': "01-06-2014"
- '3': "12-20-2013"
- '2': "12-18-2013"
- '1': "11-27-2013"
- '0': "11-21-2013"
- "1.3":
code_name: "Top of the World"
releases:
- '4': "10-29-2013"
- '3': "10-09-2013"
- '2': "09-19-2013"
- '1': "09-16-2013"
- '0': "09-13-2013"
- "1.2":
code_name: "Right Now"
releases:
- '3': "08-21-2013"
- '2': "07-05-2013"
- '1': "07-04-2013"
- '0': "06-10-2013"
- "1.1":
code_name: "Mean Street"
releases:
- '0': "04-02-2013"
- "1.0":
code_name: "Eruption"
releases:
- '0': "02-01-2013"
- "0.9":
code_name: "Dreams"
releases:
- '0': "11-30-2012"
- "0.8":
code_name: "Cathedral"
releases:
- '0': "10-19-2012"
- "0.7":
code_name: "Panama"
releases:
- '0': "09-06-2012"
- "0.6":
code_name: "Cabo"
releases:
- '0': "08-06-2012"
- "0.5":
code_name: "Amsterdam"
releases:
- '0': "07-04-2012"
- "0.4":
code_name: "Unchained"
releases:
- '0': "05-23-2012"
- "0.3":
code_name: "Baluchitherium"
releases:
- '0': "04-23-2012"
- "0.2":
code_name: "Untitled"
releases:
- '0': "?"
- "0.1":
code_name: "Untitled"
releases:
- '0': "?"
- "0.0":
code_name: "Untitled"
releases:
- '2': "?"
- '1': "?"

View File

@@ -0,0 +1,182 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type
import argparse
import os
import re
import sys
from packaging.version import Version, VERSION_PATTERN
class AnsibleVersionMunger(object):
tag_offsets = dict(
dev=0,
a=100,
b=200,
rc=1000
)
# TODO: allow overrides here for packaging bump etc
def __init__(self, raw_version, revision=None, codename=None):
self._raw_version = raw_version
self._revision = revision
self._parsed_version = Version(raw_version)
self._codename = codename
self._parsed_regex_match = re.match(VERSION_PATTERN, raw_version, re.VERBOSE | re.IGNORECASE)
@property
def deb_version(self):
v = self._parsed_version
match = self._parsed_regex_match
if v.is_prerelease:
if match.group('pre'):
tag_value = match.group('pre')
tag_type = match.group('pre_l')
tag_ver = match.group('pre_n')
elif match.group('dev'):
tag_type = "dev"
tag_value = match.group('dev')
tag_ver = match.group('dev_n')
else:
raise Exception("unknown prerelease type for version {0}".format(self._raw_version))
elif v.is_postrelease:
raise Exception("post-release identifiers are not supported")
else:
tag_type = None
tag_value = ''
tag_ver = 0
# not a pre/post/dev release, just return base version
if not tag_type:
return '{base_version}'.format(base_version=self.base_version)
# it is a pre/dev release, include the tag value with a ~
return '{base_version}~{tag_value}'.format(base_version=self.base_version, tag_value=tag_value)
@property
def deb_release(self):
return '1' if self._revision is None else str(self._revision)
@property
def rpm_release(self):
v = self._parsed_version
match = self._parsed_regex_match
if v.is_prerelease:
if match.group('pre'):
tag_value = match.group('pre')
tag_type = match.group('pre_l')
tag_ver = match.group('pre_n')
elif match.group('dev'):
tag_type = "dev"
tag_value = match.group('dev')
tag_ver = match.group('dev_n')
else:
raise Exception("unknown prerelease type for version {0}".format(self._raw_version))
elif v.is_postrelease:
raise Exception("post-release identifiers are not supported")
else:
tag_type = None
tag_value = ''
tag_ver = 0
# not a pre/post/dev release, just append revision (default 1)
if not tag_type:
if self._revision is None:
self._revision = 1
return '{revision}'.format(revision=self._revision)
# cleanse tag value in case it starts with .
tag_value = tag_value.strip('.')
# coerce to int and None == 0
tag_ver = int(tag_ver if tag_ver else 0)
if self._revision is None:
tag_offset = self.tag_offsets.get(tag_type)
if tag_offset is None:
raise Exception('no tag offset defined for tag {0}'.format(tag_type))
pkgrel = '0.{0}'.format(tag_offset + tag_ver)
else:
pkgrel = self._revision
return '{pkgrel}.{tag_value}'.format(pkgrel=pkgrel, tag_value=tag_value)
@property
def raw(self):
return self._raw_version
# return the x.y.z version without any other modifiers present
@property
def base_version(self):
return self._parsed_version.base_version
# return the x.y version without any other modifiers present
@property
def major_version(self):
return re.match(r'^(\d+.\d+)', self._raw_version).group(1)
@property
def codename(self):
return self._codename if self._codename else "UNKNOWN"
def main():
parser = argparse.ArgumentParser(description='Extract/transform Ansible versions to various packaging formats')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--raw', action='store_true')
group.add_argument('--majorversion', action='store_true')
group.add_argument('--baseversion', action='store_true')
group.add_argument('--debversion', action='store_true')
group.add_argument('--debrelease', action='store_true')
group.add_argument('--rpmrelease', action='store_true')
group.add_argument('--codename', action='store_true')
group.add_argument('--all', action='store_true')
parser.add_argument('--revision', action='store', default='auto')
args = parser.parse_args()
mydir = os.path.dirname(__file__)
release_loc = os.path.normpath(mydir + '/../../../lib')
sys.path.insert(0, release_loc)
from ansible import release
rev = None
if args.revision != 'auto':
rev = args.revision
v_raw = release.__version__
codename = release.__codename__
v = AnsibleVersionMunger(v_raw, revision=rev, codename=codename)
if args.raw:
print(v.raw)
elif args.baseversion:
print(v.base_version)
elif args.majorversion:
print(v.major_version)
elif args.debversion:
print(v.deb_version)
elif args.debrelease:
print(v.deb_release)
elif args.rpmrelease:
print(v.rpm_release)
elif args.codename:
print(v.codename)
elif args.all:
props = [name for (name, impl) in vars(AnsibleVersionMunger).items() if isinstance(impl, property)]
for propname in props:
print('{0}: {1}'.format(propname, getattr(v, propname)))
if __name__ == '__main__':
main()