Skip to content

Commit

Permalink
Refactor Copr support into modules
Browse files Browse the repository at this point in the history
  • Loading branch information
ehelms authored and evgeni committed May 16, 2023
1 parent a0a1ab2 commit 7b64028
Show file tree
Hide file tree
Showing 15 changed files with 380 additions and 115 deletions.
52 changes: 52 additions & 0 deletions obal/data/modules/check_copr_build.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""
Check if a build already exists 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():
"""
Check if a build already exists in Copr
"""
module = AnsibleModule(
argument_spec=dict(
user=dict(type='str', required=True),
project=dict(type='str', required=True),
nvr=dict(type='str', required=True),
package=dict(type='str', required=True),
)
)

user = module.params['user']
project = module.params['project']
nvr = module.params['nvr']
package = module.params['package']

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

try:
package_info = json.loads(copr_cli(command))
except CoprCliCommandError as error:
if "Error: No package with name {} in copr {}".format(package, project):
module.exit_json(changed=True, 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)

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

module.exit_json(changed=not exists, exists=exists)


if __name__ == '__main__':
main()
56 changes: 56 additions & 0 deletions obal/data/modules/copr_build.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"""
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=True),
chroots=dict(type='list', required=False),
)
)

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

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)
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)

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

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


if __name__ == '__main__':
main()
17 changes: 6 additions & 11 deletions obal/data/modules/copr_chroot.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ def main():
user=dict(type='str', required=True),
project=dict(type='str', required=True),
chroot=dict(type='str', required=True),
external_repos=dict(type='list', required=False),
buildroot_packages=dict(type='list', required=False),
modules=dict(type='list', required=False),
external_repos=dict(type='list', required=False, default=[]),
buildroot_packages=dict(type='list', required=False, default=[]),
modules=dict(type='list', required=False, default=[]),
)
)

Expand All @@ -33,14 +33,9 @@ def main():
"{}/{}".format(full_name(user, project), chroot)
]

if external_repos:
command.extend(['--repos', ' '.join(external_repos)])

if buildroot_packages:
command.extend(['--packages', ' '.join(buildroot_packages)])

if modules:
command.extend(['--modules', ','.join(modules)])
command.extend(['--repos', ' '.join(external_repos)])
command.extend(['--packages', ' '.join(buildroot_packages)])
command.extend(['--modules', ','.join(modules)])

try:
output = copr_cli(command)
Expand Down
57 changes: 57 additions & 0 deletions obal/data/modules/copr_fork.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"""
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),
)
)

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']

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

try:
fork_output = copr_cli(command)
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)
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()
4 changes: 4 additions & 0 deletions obal/data/modules/copr_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ 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'),
)
)

Expand All @@ -44,6 +45,7 @@ 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']

if not description:
description = project
Expand All @@ -59,6 +61,8 @@ def main():
description
])

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

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

Expand Down
16 changes: 16 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,19 @@ 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
2 changes: 2 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,5 @@ 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
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
86 changes: 86 additions & 0 deletions obal/data/roles/build_package/tasks/copr_build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
- when:
- not build_package_scratch
- not build_package_copr_rebuild
block:
- name: "Package name"
rpm_nvr:
spec_file: "{{ spec_file_path }}"
scl: "{{ tag.scl | default(omit) }}"
dist: "{{ tag.dist | default(omit) }}"
macros: "{{ tag.macros | default(omit) }}"
register: package_nvr

- name: Check build status
check_copr_build:
user: "{{ copr_project_user }}"
project: "{{ copr_project['copr_project_name'] }}"
nvr: "{{ package_nvr.nvr }}"
package: "{{ package_nvr.name }}"
register: build_exists

- debug:
msg: "{{ build_exists.skipped is defined }}"

- name: Create temporary build directory
tempfile:
state: directory
suffix: srpms
register: srpm_directory
when: (srpm_directory is not defined and (build_exists.exists is defined and not build_exists.exists)) or build_package_copr_rebuild

- name: 'Build SRPM'
srpm:
package: "{{ inventory_dir }}/{{ package_base_dir }}/{{ inventory_hostname }}"
output: "{{ srpm_directory.path if 'path' in srpm_directory else srpm_directory }}"
source_location: "{{ source_location | default(omit) }}"
source_system: "{{ source_system | default(omit) }}"
register: srpm_build
when: (srpm_directory is defined and (build_exists.exists is defined and not build_exists.exists)) or build_package_copr_rebuild or build_package_scratch

- when: (not build_package_scratch and (build_exists.exists is defined and not build_exists.exists)) or build_package_copr_rebuild
block:
- name: 'Run build'
copr_build:
user: "{{ copr_project_user }}"
project: "{{ copr_project['copr_project_name'] }}"
srpm: "{{ srpm_build.path }}"
wait: "{{ build_package_wait }}"
chroots: "{{ build_package_copr_chroots | default(omit) }}"
register: copr_builds
ignore_errors: "{{ build_package_skip_failed_build | default(false) }}"

- when: build_package_scratch
block:
- name: Define Copr scratch project name
set_fact:
copr_scratch_project: "{{ copr_project['copr_project_name'] }}-scratch-{{ 999999999 | random | to_uuid }}"
when: copr_scratch_project is not defined

- name: Define Copr scatch user name
set_fact:
copr_scratch_user: "{{ copr_project_user }}"
when: copr_scratch_user is not defined

- include_role:
name: copr_project
vars:
copr_project_user: "{{ copr_scratch_user }}"
copr_project_name: "{{ copr_scratch_project }}"
copr_project_chroots: "{{ copr_project['copr_project_chroots'] }}"
copr_project_description: "{{ copr_project['copr_project_description'] | default(omit) }}"
copr_project_delete_after_days: "4"
copr_project_unlisted_on_homepage: "{{ copr_project['copr_project_unlisted_on_homepage'] | default(omit) }}"

- name: 'Run build'
copr_build:
user: "{{ copr_scratch_user }}"
project: "{{ copr_scratch_project }}"
srpm: "{{ srpm_build.path }}"
wait: "{{ build_package_wait }}"
chroots: "{{ build_package_copr_chroots | default(omit) }}"
register: copr_builds

- debug:
msg: "{{ copr_builds }}"
when: copr_builds is defined
1 change: 1 addition & 0 deletions obal/data/roles/copr_project/defaults/main.yaml
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
---
copr_project_chroots: []
Loading

0 comments on commit 7b64028

Please sign in to comment.