Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor Copr support into modules #344

Merged
merged 2 commits into from
Jul 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .ansible-lint
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ skip_list:
- no-changed-when
- fqcn[action-core]
- name[template]
- var-naming[no-role-prefix]
5 changes: 4 additions & 1 deletion obal/data/module_utils/copr.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@ def __init__(self, message, command):
self.command = command
super(CoprCliCommandError, self).__init__(message) #pylint: disable-all

def copr_cli(command, executable=None):
def copr_cli(command, executable=None, config_file=None):
"""
Run a copr-cli command
"""
if executable is None:
executable = 'copr-cli'

if config_file:
command = ['--config', config_file] + command
ehelms marked this conversation as resolved.
Show resolved Hide resolved

try:
return check_output([executable] + command, universal_newlines=True, stderr=STDOUT)
except CalledProcessError as error:
Expand Down
59 changes: 59 additions & 0 deletions obal/data/modules/copr_build.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
Release a package to Copr
"""

import re

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.copr import copr_cli, CoprCliCommandError, full_name # pylint:disable=import-error,no-name-in-module


def main():
"""
Release a package to Copr
"""
module = AnsibleModule(
argument_spec=dict(
user=dict(type='str', required=True),
project=dict(type='str', required=True),
srpm=dict(type='path', required=True),
wait=dict(type='bool', required=False, default=False),
chroots=dict(type='list', required=False),
config_file=dict(type='str', required=False),
)
)

user = module.params['user']
project = module.params['project']
srpm = module.params['srpm']
wait = module.params['wait']
chroots = module.params['chroots']
config_file = module.params['config_file']

command = [
'build',
full_name(user, project),
srpm
]

if not wait:
command.append('--nowait')

if chroots:
for chroot in chroots:
command.extend(['--chroot', chroot])

try:
output = copr_cli(command, config_file=config_file)
except CoprCliCommandError as error:
module.fail_json(msg='Copr build failed', command=error.command, output=error.message,
repo_name=full_name(user, project), srpm=srpm)

build_urls = re.findall(r'^Build was added to.+:\n^\s+(.+)\s*', output, re.MULTILINE)
builds = re.findall(r'^Created builds:\s(\d+)', output, re.MULTILINE)

module.exit_json(changed=True, output=output, builds=builds, build_urls=build_urls)


if __name__ == '__main__':
main()
55 changes: 55 additions & 0 deletions obal/data/modules/copr_build_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"""
Retrieve a particular build for a package in Copr
"""

import json
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.copr import copr_cli, CoprCliCommandError, full_name # pylint:disable=import-error,no-name-in-module


def main():
"""
Retrieve a particular build for a package in Copr
"""
module = AnsibleModule(
argument_spec=dict(
user=dict(type='str', required=True),
project=dict(type='str', required=True),
nevr=dict(type='str', required=True),
package=dict(type='str', required=True),
config_file=dict(type='str', required=False),
)
)

user = module.params['user']
project = module.params['project']
nevr = module.params['nevr']
package = module.params['package']
config_file = module.params['config_file']

command = [
'get-package',
full_name(user, project),
'--name',
package,
'--with-all-builds'
]

try:
package_info = json.loads(copr_cli(command, config_file=config_file))
except CoprCliCommandError as error:
if "Error: No package with name {} in copr {}".format(package, project) in error.message:
module.exit_json(exists=False)
else:
module.fail_json(msg='Retrieval of package from Copr failed', command=command, output=error.message,
repo_name=full_name(user, project), package=package)

successful_builds = (build for build in package_info['builds'] if build['state'] == 'succeeded')
successful_nevrs = ("{}-{}".format(package, build['source_package']['version']) for build in successful_builds)
exists = nevr in successful_nevrs

module.exit_json(exists=exists)


if __name__ == '__main__':
main()
4 changes: 3 additions & 1 deletion obal/data/modules/copr_chroot.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def main():
external_repos=dict(type='list', required=False),
buildroot_packages=dict(type='list', required=False),
modules=dict(type='list', required=False),
config_file=dict(type='str', required=False),
)
)

Expand All @@ -27,6 +28,7 @@ def main():
external_repos = module.params['external_repos']
buildroot_packages = module.params['buildroot_packages']
modules = module.params['modules']
config_file = module.params['config_file']

command = [
'edit-chroot',
Expand All @@ -43,7 +45,7 @@ def main():
command.extend(['--modules', ','.join(modules)])

try:
output = copr_cli(command)
output = copr_cli(command, config_file=config_file)
except CoprCliCommandError as error:
module.fail_json(msg='Copr chroot edit failed', command=' '.join(error.command), output=error.message)

Expand Down
59 changes: 59 additions & 0 deletions obal/data/modules/copr_fork.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
Fork a Copr project
"""

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.copr import copr_cli, CoprCliCommandError, full_name # pylint:disable=import-error,no-name-in-module


def main():
"""
Fork a Copr project
"""
module = AnsibleModule(
argument_spec=dict(
src_user=dict(type='str', required=True),
src_project=dict(type='str', required=True),
dest_user=dict(type='str', required=True),
dest_project=dict(type='str', required=True),
delete_after_days=dict(type='str', required=False, default=None),
config_file=dict(type='str', required=False),
)
)

src_user = module.params['src_user']
src_project = module.params['src_project']
dest_user = module.params['dest_user']
dest_project = module.params['dest_project']
delete_after_days = module.params['delete_after_days']
config_file = module.params['config_file']

command = [
'fork',
full_name(src_user, src_project),
full_name(dest_user, dest_project)
]

try:
fork_output = copr_cli(command, config_file=config_file)
except CoprCliCommandError as error:
module.fail_json(msg='Copr project forking failed', command=' '.join(error.command), output=error.message)

if delete_after_days:
modify_command = [
'modify',
full_name(dest_user, dest_project),
'--delete-after-days',
delete_after_days
]

try:
copr_cli(modify_command, config_file=config_file)
except CoprCliCommandError as error:
module.fail_json(msg='Copr project forking failed', command=' '.join(error.command), output=error.message)

module.exit_json(changed=True, output=fork_output)


if __name__ == '__main__':
main()
14 changes: 10 additions & 4 deletions obal/data/modules/copr_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ansible.module_utils.copr import copr_cli, CoprCliCommandError, full_name # pylint:disable=import-error,no-name-in-module


def project_exists(user, project, module):
def project_exists(user, project, module, config_file=None):
"""
Return true if a project already exists for a user
"""
Expand All @@ -17,7 +17,7 @@ def project_exists(user, project, module):
]

try:
project_list = copr_cli(command)
project_list = copr_cli(command, config_file=config_file)
except CoprCliCommandError as error:
module.fail_json(msg='Copr project listing failed', command=' '.join(error.command), output=error.message)

Expand All @@ -35,6 +35,8 @@ def main():
description=dict(type='str', required=False),
unlisted_on_homepage=dict(type='bool', required=False, default=False),
delete_after_days=dict(type='str', required=False),
appstream=dict(type='str', required=False, default='off'),
config_file=dict(type='str', required=False),
)
)

Expand All @@ -44,11 +46,13 @@ def main():
description = module.params['description']
unlisted_on_homepage = module.params['unlisted_on_homepage']
delete_after_days = module.params['delete_after_days']
appstream = module.params['appstream']
config_file = module.params['config_file']

if not description:
description = project

if project_exists(user, project, module):
if project_exists(user, project, module, config_file=config_file):
command = ['modify']
else:
command = ['create']
Expand All @@ -59,6 +63,8 @@ def main():
description
])

command.extend(['--appstream', appstream])

for chroot in chroots:
command.extend(['--chroot', chroot])

Expand All @@ -69,7 +75,7 @@ def main():
command.extend(['--delete-after-days', delete_after_days])

try:
output = copr_cli(command)
output = copr_cli(command, config_file=config_file)
except CoprCliCommandError as error:
module.fail_json(msg='Copr project creation failed', command=' '.join(error.command), output=error.message)

Expand Down
19 changes: 19 additions & 0 deletions obal/data/playbooks/release/metadata.obal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,22 @@ variables:
action: store_false
parameter: --skip-koji-whitelist-check
help: ignore koji whitelist check and release the package anyway
build_package_copr_chroots:
action: append
parameter: --copr-chroot
help: Specify a Copr chroot to release for, can be specified multiple times
build_package_copr_rebuild:
action: store_true
parameter: --copr-rebuild
help: Forces a rebuild of a package in Copr
build_package_skip_failed_build:
action: store_true
parameter: --skip-failed-build
help: Skips failing builds and continues execution
build_package_wait:
action: store_false
parameter: --nowait
help: Do not wait on builds to complete
build_package_copr_config:
parameter: --copr-config
help: Path to a Copr config file
3 changes: 3 additions & 0 deletions obal/data/playbooks/scratch/metadata.obal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ variables:
action: store_false
parameter: --skip-koji-whitelist-check
help: ignore koji whitelist check and scratch build the package anyway
build_package_copr_config:
parameter: --copr-config
help: Path to a Copr config file
3 changes: 3 additions & 0 deletions obal/data/roles/build_package/defaults/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ build_package_waitrepo: false
build_package_koji_whitelist_check: false
build_package_tito_builder:
build_package_use_koji_build: false
build_package_copr_rebuild: false
build_package_skip_failed_build: false
build_package_archive_build_info: false
Empty file.
56 changes: 4 additions & 52 deletions obal/data/roles/build_package/tasks/copr.yml
Original file line number Diff line number Diff line change
@@ -1,53 +1,5 @@
---
- when: not build_package_scratch
block:
- name: 'Release to copr'
tito_release:
directory: "{{ inventory_dir }}/{{ package_base_dir }}/{{ inventory_hostname }}"
arguments: "{{ build_package_tito_args }}"
test: "{{ build_package_test }}"
scratch: "{{ build_package_scratch }}"
releasers: "{{ releasers }}"
releaser_arguments: "{{ build_package_tito_releaser_args }}"
register: build_package_tito_release

- name: 'Wait for tasks to finish'
include_tasks: wait.yml
when: build_package_wait|bool

- when: build_package_scratch
block:
- name: Define copr repo name
set_fact:
copr_repo_name: "{{ copr_user }}/{{ build_package_scratch_repo }}-{{ 999999999 | random | to_uuid }}"
run_once: true
when: copr_repo_name is not defined

- name: 'Write copr repo name to vars file'
copy:
content: "{{ 'copr_repo: ' + copr_repo_name | to_yaml }}"
dest: "{{ obal_tmp_dir }}/copr_repo"
mode: '0640'
run_once: true

- include_role:
name: copr_repo
run_once: true

- name: 'Build SRPM'
tito_build:
directory: "{{ inventory_dir }}/{{ package_base_dir }}/{{ inventory_hostname }}"
srpm: true
scl: "{{ scl }}"
register: srpm_build

- name: 'Run build'
command: >-
copr-cli build
{% if not build_package_wait | bool %}--nowait{% endif %}
{{ copr_repo_name }}
{{ srpm_build.path }}
register: build_status

- debug:
msg: "{{ build_status.stdout_lines | join('\n') }}"
- include_tasks: copr_build.yml
loop: "{{ copr_projects }}"
loop_control:
loop_var: copr_project
Loading
Loading