Files
sunbeam-charms/roles/charm-publish/tasks/publish.yaml
Hemanth Nakkina 67770abb84 Upload charm before OCI images in publish charm job
Currently the publish-charm task uploads the OCI
image resources and then the charm. If a charm
introduces a new OCI image resource then this
workflow wont work as charmhub is not aware of
the new resource. Uploading charm first will
enable charmhub to understand the new resource.

Change tasks to upload charm first and then the OCI
image resources.

Change-Id: I70de4f19558c62caeaa8821a3bbd9cac1fd96c0d
2024-04-20 14:01:46 +05:30

95 lines
3.3 KiB
YAML

- name: Publish charms to charmhub
when: publish_charm
environment:
CHARMCRAFT_AUTH: "{{ charmhub_token.value }}"
block:
- name: Install snapd
apt:
name: snapd
become: true
- name: Install charmcraft
snap:
name: charmcraft
channel: "{{ charmcraft_channel | default('latest/stable') }}"
classic: true
become: true
- name: Install docker
include_role:
name: ensure-docker
- name: Install unzip
apt:
name: unzip
state: present
become: true
- name: Create charm destination folder
file:
path: "{{ zuul.project.src_dir }}/{{ charm_build_name }}"
state: directory
mode: "0755"
- name: Decompress charm
unarchive:
src: "{{ zuul.project.src_dir }}/{{ charm_build_name }}.charm"
dest: "{{ zuul.project.src_dir }}/{{ charm_build_name }}"
remote_src: true
- name: Read metadata.yaml
slurp:
src: "{{ zuul.project.src_dir }}/{{ charm_build_name }}/metadata.yaml"
register: metadata_file
- name: Parse metadata.yaml
set_fact:
metadata: "{{ metadata_file.content | b64decode | from_yaml }}"
- name: Upload charm to charmhub
register: upload_charm_output
args:
chdir: "{{ zuul.project.src_dir }}"
# TODO: The below command can error out with a message that says
# upload with that digest already exists. This case need to be handled.
# More details https://github.com/canonical/charmcraft/issues/826
command: charmcraft upload -v --name {{ charm_build_name }} {{ charm_build_name }}.charm
retries: 3
until: >
("Revision" in upload_charm_output.stdout)
- name: Extract Charm revision
set_fact:
charm_revision: "{{ upload_charm_output.stdout | regex_search('Revision ([0-9]+)', '\\1', multiline=True) | first }}"
- name: Upload oci-image to charmhub
register: upload_oci_image_output
args:
executable: /bin/bash
shell: |
set -x
image={{ item.value['upstream-source'] }}
# Remove docker.io/ in the OCI image so that docker pulls image
# from mirror if configured.
image=${image#"docker.io/"}
docker pull $image
digest=`docker inspect --format {% raw %}'{{ index .RepoDigests 0 }}' {% endraw %} $image`
charmcraft upload-resource {{ charm_build_name }} {{ item.key }} --image $digest
retries: 3
until: >
("Revision" in upload_oci_image_output.stdout)
loop: "{{ lookup('ansible.builtin.dict', metadata.resources|default({}), wantlist=True) }}"
when: "item.value.type == 'oci-image'"
- name: Extract Resource revisions
set_fact:
resource_revision_flags: "{{ resource_revision_flags | default('') + ' --resource ' + item.item.key + ':' + (item.stdout | regex_search('Revision ([0-9]+)', '\\1', multiline=True) | first) }}"
with_items: "{{ upload_oci_image_output.results }}"
- name: Release charm
register: release_charm_output
command: charmcraft release {{ charm_build_name }} --revision {{ charm_revision }} --channel {{ publish_channel }} {{ resource_revision_flags | default("") }}
retries: 3
until: >
("Revision" in release_charm_output.stdout)