
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
95 lines
3.3 KiB
YAML
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)
|