forked from ansible/ansible
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement a framework for having common code for release scripts (ans…
…ible#55893) * Implement a framework for having common code for release scripts * Release scripts will go through hacking/build-ansible. build-ansible is a pluggable script which will set a directory that has common code for non-enduser scripts. It will then invoke the plugin which implements that subcommand. Uses straight.plugin for loading each sub-command. * We're going to add tools which are needed to test ansible (the changelog generation, for instance) so we need to include the pieces relevant to that in the tarball. * Add straight.plugin to the sanity test requirements for the same reason * Skip compile test just for build-ansible plugins which won't be run as part of sanity tests.
- Loading branch information
Showing
12 changed files
with
185 additions
and
53 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
#!/usr/bin/env python3 | ||
# coding: utf-8 | ||
# PYTHON_ARGCOMPLETE_OK | ||
# Copyright: (c) 2019, Ansible Project | ||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) | ||
|
||
# Make coding more python3-ish | ||
from __future__ import (absolute_import, division, print_function) | ||
__metaclass__ = type | ||
|
||
|
||
import argparse | ||
import os.path | ||
import sys | ||
|
||
from straight.plugin import load | ||
|
||
try: | ||
import argcomplete | ||
except ImportError: | ||
argcomplete = None | ||
|
||
|
||
def set_sys_path(this_script=__file__): | ||
"""Add path to the common librarydirectory to :attr:`sys.path`""" | ||
hacking_dir = os.path.dirname(this_script) | ||
libdir = os.path.abspath(os.path.join(hacking_dir, 'build_library')) | ||
|
||
if libdir not in sys.path: | ||
sys.path.insert(0, libdir) | ||
|
||
|
||
set_sys_path() | ||
|
||
from build_ansible import commands | ||
|
||
|
||
def create_arg_parser(program_name): | ||
""" | ||
Creates a command line argument parser | ||
:arg program_name: The name of the script. Used in help texts | ||
""" | ||
parser = argparse.ArgumentParser(prog=program_name, | ||
description="Implements utilities to build Ansible") | ||
return parser | ||
|
||
|
||
def main(): | ||
""" | ||
Main entrypoint of the script | ||
"It all starts here" | ||
""" | ||
subcommands = load('build_ansible.command_plugins', subclasses=commands.Command) | ||
|
||
arg_parser = create_arg_parser(os.path.basename(sys.argv[0])) | ||
subparsers = arg_parser.add_subparsers(title='Subcommands', dest='command', | ||
help='for help use build-ansible SUBCOMMANDS -h') | ||
subcommands.pipe('init_parser', subparsers.add_parser) | ||
|
||
if argcomplete: | ||
argcomplete.autocomplete(arg_parser) | ||
|
||
args = arg_parser.parse_args(sys.argv[1:]) | ||
|
||
for subcommand in subcommands: | ||
if subcommand.name == args.command: | ||
sys.exit(subcommand.main(args)) | ||
|
||
print('Error: Select a subcommand') | ||
arg_parser.print_usage() | ||
|
||
|
||
if __name__ == '__main__': | ||
main() |
Empty file.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,3 @@ | ||
#!/usr/bin/env python3 | ||
# coding: utf-8 | ||
# Copyright: (c) 2019, Ansible Project | ||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) | ||
|
@@ -12,13 +11,18 @@ | |
import asyncio | ||
import datetime | ||
import hashlib | ||
import os.path | ||
import sys | ||
from collections import UserString | ||
from distutils.version import LooseVersion | ||
|
||
import aiohttp | ||
from jinja2 import Environment, DictLoader | ||
|
||
# Pylint doesn't understand Python3 namespace modules. | ||
from ..commands import Command # pylint: disable=relative-beyond-top-level | ||
|
||
|
||
# pylint: disable= | ||
VERSION_FRAGMENT = """ | ||
{%- if versions | length > 1 %} | ||
|
@@ -31,7 +35,7 @@ | |
""" | ||
|
||
LONG_TEMPLATE = """ | ||
{% set plural = True if versions | length == 1 else False %} | ||
{% set plural = False if versions | length == 1 else True %} | ||
{% set latest_ver = (versions | sort(attribute='ver_obj'))[-1] %} | ||
To: [email protected], [email protected], [email protected] | ||
|
@@ -66,7 +70,7 @@ | |
{{ '-' * (14 + version_str | length) }} | ||
{% filter wordwrap %} | ||
{% if plural %}This release is a{% else %}These releases are{% endif %} maintenance release{% if plural %}s{% endif %} containing numerous bugfixes. The full {% if versions | length <= 1 %} changelog is{% else %} changelogs are{% endif %} at: | ||
{% if plural %}These releases are{% else %}This release is a{% endif %} maintenance release{% if plural %}s{% endif %} containing numerous bugfixes. The full {% if plural %} changelogs are{% else %} changelog is{% endif %} at: | ||
{% endfilter %} | ||
|
@@ -116,15 +120,16 @@ | |
# proper wrapping to occur | ||
|
||
SHORT_TEMPLATE = """ | ||
{% set plural = False if versions | length == 1 else True %} | ||
@ansible | ||
{{ version_str }} | ||
{% if versions | length > 1 %} | ||
{% if plural %} | ||
have | ||
{% else %} | ||
has | ||
{% endif %} | ||
been released! Get | ||
{% if versions | length > 1 %} | ||
{% if plural %} | ||
them | ||
{% else %} | ||
it | ||
|
@@ -152,19 +157,7 @@ def __init__(self, string): | |
self.ver_obj = LooseVersion(string) | ||
|
||
|
||
def parse_args(args): | ||
parser = argparse.ArgumentParser(description="Generate email and twitter announcements" | ||
" from template") | ||
parser.add_argument("--version", dest="versions", type=str, required=True, action='append', | ||
help="Versions of Ansible to announce") | ||
parser.add_argument("--name", type=str, required=True, help="Real name to use on emails") | ||
parser.add_argument("--email-out", type=str, default="-", | ||
help="Filename to place the email announcement into") | ||
parser.add_argument("--twitter-out", type=str, default="-", | ||
help="Filename to place the twitter announcement into") | ||
|
||
args = parser.parse_args(args) | ||
|
||
def transform_args(args): | ||
# Make it possible to sort versions in the jinja2 templates | ||
new_versions = [] | ||
for version in args.versions: | ||
|
@@ -285,15 +278,29 @@ def write_message(filename, message): | |
sys.stdout.write(message) | ||
|
||
|
||
def main(): | ||
args = parse_args(sys.argv[1:]) | ||
class ReleaseAnnouncementCommand(Command): | ||
name = 'release-announcement' | ||
|
||
@classmethod | ||
def init_parser(cls, add_parser): | ||
parser = add_parser(cls.name, | ||
description="Generate email and twitter announcements from template") | ||
|
||
twitter_message = generate_short_message(args.versions) | ||
email_message = generate_long_message(args.versions, args.name) | ||
parser.add_argument("--version", dest="versions", type=str, required=True, action='append', | ||
help="Versions of Ansible to announce") | ||
parser.add_argument("--name", type=str, required=True, help="Real name to use on emails") | ||
parser.add_argument("--email-out", type=str, default="-", | ||
help="Filename to place the email announcement into") | ||
parser.add_argument("--twitter-out", type=str, default="-", | ||
help="Filename to place the twitter announcement into") | ||
|
||
write_message(args.twitter_out, twitter_message) | ||
write_message(args.email_out, email_message) | ||
@staticmethod | ||
def main(args): | ||
args = transform_args(args) | ||
|
||
twitter_message = generate_short_message(args.versions) | ||
email_message = generate_long_message(args.versions, args.name) | ||
|
||
if __name__ == '__main__': | ||
main() | ||
write_message(args.twitter_out, twitter_message) | ||
write_message(args.email_out, email_message) | ||
return 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
# coding: utf-8 | ||
# Copyright: (c) 2019, Ansible Project | ||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) | ||
|
||
# Make coding more python3-ish | ||
from __future__ import (absolute_import, division, print_function) | ||
__metaclass__ = type | ||
|
||
|
||
from abc import ABCMeta, abstractmethod, abstractproperty | ||
|
||
|
||
class Command: | ||
""" | ||
Subcommands of :program:`build-ansible`. | ||
This defines an interface that all subcommands must conform to. :program:`build-ansible` will | ||
require that these things are present in order to proceed. | ||
""" | ||
@staticmethod | ||
@abstractproperty | ||
def name(): | ||
"""Name of the command. The same as the string is invoked with""" | ||
|
||
@staticmethod | ||
@abstractmethod | ||
def init_parser(add_parser): | ||
""" | ||
Initialize and register an argparse ArgumentParser | ||
:arg add_parser: function which creates an ArgumentParser for the main program. | ||
Implementations should first create an ArgumentParser using `add_parser` and then populate | ||
it with the command line arguments that are needed. | ||
.. seealso: | ||
`add_parser` information in the :py:meth:`ArgumentParser.add_subparsers` documentation. | ||
""" | ||
|
||
@staticmethod | ||
@abstractmethod | ||
def main(arguments): | ||
""" | ||
Run the command | ||
:arg arguments: The **parsed** command line args | ||
This is the Command's entrypoint. The command line args are already parsed but from here | ||
on, the command can do its work. | ||
""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
# The following are only run by release engineers who can be asked to have newer Python3 on their systems | ||
hacking/release-announcement.py | ||
hacking/porting-guide.py | ||
hacking/build_library/build_ansible/command_plugins/porting_guide.py | ||
hacking/build_library/build_ansible/command_plugins/release_announcement.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
# The following are only run by release engineers who can be asked to have newer Python3 on their systems | ||
hacking/release-announcement.py | ||
hacking/porting-guide.py | ||
hacking/build_library/build_ansible/command_plugins/porting_guide.py | ||
hacking/build_library/build_ansible/command_plugins/release_announcement.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
# The following are only run by release engineers who can be asked to have newer Python3 on their systems | ||
hacking/release-announcement.py | ||
hacking/porting-guide.py | ||
hacking/build_library/build_ansible/command_plugins/porting_guide.py | ||
hacking/build_library/build_ansible/command_plugins/release_announcement.py |