@@ -89,24 +89,50 @@ def rock():
89
89
directory = pathlib .Path (args .directory )
90
90
91
91
yaml_data = yaml .safe_load ((directory / "rockcraft.yaml" ).read_text ())
92
-
92
+ digests = []
93
93
for rock_file in directory .glob ("*.rock" ):
94
- # Example `rock_file.name`: "charmed-postgresql_14.10_amd64.rock"
95
- architecture = rock_file .name .removesuffix (".rock" ).split ("_" )[- 1 ]
96
- # Example: "14.10-22.04-amd64"
97
- tag = (
98
- f'{ yaml_data ["version" ]} -{ yaml_data ["base" ].split ("@" )[- 1 ]} -{ architecture } '
99
- )
94
+ digest = run (
95
+ [
96
+ "skopeo" ,
97
+ "inspect" ,
98
+ f"oci-archive:{ rock_file .name } " ,
99
+ "--format" ,
100
+ "{{ .Digest }}" ,
101
+ ]
102
+ ).strip ()
100
103
logging .info (f"Uploading { rock_file = } " )
101
104
run (
102
105
[
103
106
"skopeo" ,
104
107
"copy" ,
105
108
f"oci-archive:{ rock_file .name } " ,
106
- f'docker://ghcr.io/canonical/{ yaml_data ["name" ]} : { tag } ' ,
109
+ f'docker://ghcr.io/canonical/{ yaml_data ["name" ]} @ { digest } ' ,
107
110
]
108
111
)
109
- logging .info (f"Uploaded rock { tag = } " )
112
+ logging .info (f"Uploaded rock { digest = } " )
113
+ digests .append (digest )
114
+ logging .info ("Creating multi-architecture image" )
115
+ # Example: "14.10-22.04_edge"
116
+ tag = f'{ yaml_data ["version" ]} -{ yaml_data ["base" ].split ("@" )[- 1 ]} _edge'
117
+ command = [
118
+ "docker" ,
119
+ "manifest" ,
120
+ "create" ,
121
+ f'ghcr.io/canonical/{ yaml_data ["name" ]} :{ tag } ' ,
122
+ ]
123
+ for digest in digests :
124
+ command .extend (("--amend" , f'ghcr.io/canonical/{ yaml_data ["name" ]} @{ digest } ' ))
125
+ run (command )
126
+ logging .info ("Created multi-architecture image. Uploading" )
127
+ run (
128
+ [
129
+ "docker" ,
130
+ "manifest" ,
131
+ "push" ,
132
+ f'ghcr.io/canonical/{ yaml_data ["name" ]} :{ tag } ' ,
133
+ ]
134
+ )
135
+ logging .info ("Uploaded multi-architecture image" )
110
136
111
137
112
138
def charm ():
0 commit comments