Skip to content

Commit 37cbdd0

Browse files
committed
Add support for tagging / pushing default architecture based images
1 parent 2905496 commit 37cbdd0

File tree

3 files changed

+73
-16
lines changed

3 files changed

+73
-16
lines changed

Documentation/Build Process.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ Below is an example process to add Swift 5.0.1 for aarch64 devices:
1414
- Run `swift run Run build --swiftVersion 5.0.1` to build all of the new images
1515
- If you want to test the new device images, you can run `swift run Run test --swiftVersion 5.0.1` again
1616
- Once all of the images are built and tested, time to push: `swift run Run push --swiftVersion 5.0.1`
17-
- Run `swift run Run tag-default-images --swiftVersion 5.0.1` to tag default images (images without an OS specified)
18-
- Run `swift run Run push-default-images --swiftVersion 5.0.1` to push these default images
17+
- Run `swift run Run tag-default-images --swiftVersion 5.0.1 --buildVariant build` to tag (build) default images (images without an OS specified)
18+
- Run `swift run Run tag-default-images --swiftVersion 5.0.1 --buildVariant run` to tag (run) default images (images without an OS specified)
19+
- Run `swift run Run push-default-images --swiftVersion 5.0.1 --buildVariant build` to push these (build) default images
20+
- Run `swift run Run push-default-images --swiftVersion 5.0.1 --buildVariant run` to push these (run) default images
21+
- Note that the tag / push default images requires manually specifying build / run variants. We should fix that.
1922
- Commit these Dockerfiles and update readme with latest release info
2023

2124
Sometimes the build or test scripts will hang. If docker appears idle, try to stop and re-run the script.

Sources/Run/main.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ let tagDefaultImages = command(
120120
baseName: baseName,
121121
buildVariant: buildVariant)
122122
builder = Builder()
123-
try builder?.tagDefaultDeviceDockerImages(filter: filter)
123+
try builder?.tagDefaultDockerImages(filter: filter)
124124
}
125125

126126
let pushDefaultImages = command(
@@ -138,7 +138,7 @@ let pushDefaultImages = command(
138138
baseName: baseName,
139139
buildVariant: buildVariant)
140140
builder = Builder()
141-
try builder?.pushDefaultDeviceDockerImages(filter: filter)
141+
try builder?.pushDefaultDockerImages(filter: filter)
142142
}
143143

144144
let main = Group {

Sources/SwiftOnBalena/Builder.swift

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,41 @@ public class Builder {
201201
try command.finish()
202202
}
203203

204-
public func tagDefaultDeviceDockerImages(filter: ImageDescriptionFilter) throws {
205-
let defaultImages = try defaultDeviceDockerImageDescriptions(filter: filter)
206-
204+
public func tagDefaultDockerImages(filter: ImageDescriptionFilter) throws {
205+
if filter.baseType == nil {
206+
let defaultDeviceImages = try defaultDeviceDockerImageDescriptions(filter: filter)
207+
try tagDefaultDockerImages(defaultDeviceImages)
208+
209+
let defaultArchitectureImages = try defaultArchitectureDockerImageDescriptions(filter: filter)
210+
try tagDefaultDockerImages(defaultArchitectureImages)
211+
} else {
212+
let defaultImages = try defaultDockerImageDescriptions(filter: filter)
213+
try tagDefaultDockerImages(defaultImages)
214+
}
215+
}
216+
217+
private func tagDefaultDockerImages(_ images: [ImageDescription], pullImages: Bool = false) throws {
207218
let context = CustomContext(main)
208219

209-
defaultImages.forEach { imageDescription in
220+
print("Tag Manifest")
221+
images.forEach { imageDescription in
222+
print(" - \(imageDescription.defaultOSDockerTag)")
223+
}
224+
print()
225+
226+
images.forEach { imageDescription in
227+
if pullImages {
228+
let pullCommand = context.runAsyncAndPrint(bash: "docker pull \(imageDescription.dockerTag)")
229+
currentCommand = pullCommand
230+
do {
231+
try pullCommand.finish()
232+
print("Pulled \(imageDescription.dockerTag)")
233+
} catch {
234+
print("ERROR: Failed to pull \(imageDescription.dockerTag). Skipping this tag.")
235+
return
236+
}
237+
}
238+
210239
let tagCommand = context.runAsyncAndPrint(bash: "docker tag \(imageDescription.dockerTag) \(imageDescription.defaultOSDockerTag)")
211240
currentCommand = tagCommand
212241
do {
@@ -218,20 +247,31 @@ public class Builder {
218247
}
219248
}
220249

221-
public func pushDefaultDeviceDockerImages(filter: ImageDescriptionFilter) throws {
222-
let defaultImages = try defaultDeviceDockerImageDescriptions(filter: filter)
223-
250+
public func pushDefaultDockerImages(filter: ImageDescriptionFilter) throws {
251+
if filter.baseType == nil {
252+
let defaultDeviceImages = try defaultDeviceDockerImageDescriptions(filter: filter)
253+
try pushDefaultDockerImages(defaultDeviceImages)
254+
255+
let defaultArchitectureImages = try defaultArchitectureDockerImageDescriptions(filter: filter)
256+
try pushDefaultDockerImages(defaultArchitectureImages)
257+
} else {
258+
let defaultImages = try defaultDockerImageDescriptions(filter: filter)
259+
try pushDefaultDockerImages(defaultImages)
260+
}
261+
}
262+
263+
public func pushDefaultDockerImages(_ images: [ImageDescription]) throws {
224264
let context = CustomContext(main)
225265

226266
print("Push Manifest")
227-
defaultImages.forEach { imageDescription in
267+
images.forEach { imageDescription in
228268
print(" - \(imageDescription.defaultOSDockerTag)")
229269
}
230270
print()
231271

232272
var failedImages = [ImageDescription]()
233273

234-
defaultImages.forEach { imageDescription in
274+
images.forEach { imageDescription in
235275
let tagCommand = context.runAsyncAndPrint(bash: "docker push \(imageDescription.defaultOSDockerTag)")
236276
currentCommand = tagCommand
237277
do {
@@ -261,16 +301,30 @@ public class Builder {
261301
}
262302

263303
func defaultDeviceDockerImageDescriptions(filter: ImageDescriptionFilter) throws -> [ImageDescription] {
264-
let deviceImageDescriptions = try ImageDescription.imageDescriptions(for: filter).filter { $0.isDeviceBase }
304+
var filter = filter
305+
filter.baseType = .device
306+
return try defaultDockerImageDescriptions(filter: filter)
307+
}
308+
309+
func defaultArchitectureDockerImageDescriptions(filter: ImageDescriptionFilter) throws -> [ImageDescription] {
310+
var filter = filter
311+
filter.baseType = .architecture
312+
return try defaultDockerImageDescriptions(filter: filter)
313+
}
314+
315+
private func defaultDockerImageDescriptions(filter: ImageDescriptionFilter) throws -> [ImageDescription] {
316+
precondition(filter.baseType != nil)
317+
318+
let deviceImageDescriptions = try ImageDescription.imageDescriptions(for: filter)
265319

266320
let groupedByVersion = Dictionary(grouping: deviceImageDescriptions) { $0.swiftVersion }
267321

268322
var defaultImages = [ImageDescription]()
269323

270324
groupedByVersion.forEach { _, imageDescriptions in
271-
let groupedByDevice = Dictionary(grouping: imageDescriptions) { $0.base }
325+
let groupedByBase = Dictionary(grouping: imageDescriptions) { $0.base }
272326

273-
groupedByDevice.forEach { _, imageDescriptions in
327+
groupedByBase.forEach { _, imageDescriptions in
274328

275329
var defaultImage: ImageDescription?
276330
for os in preferredOperatingSystems() {

0 commit comments

Comments
 (0)