forked from pete911/ecr-image-sync
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
94 lines (77 loc) · 1.91 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package main
import (
"bufio"
"fmt"
"github.com/pete911/ecr-image-sync/internal/aws"
"github.com/pete911/ecr-image-sync/internal/docker"
"github.com/pete911/ecr-image-sync/internal/sync"
"log"
"os"
"strings"
)
var Version = "dev"
func main() {
flags, err := ParseFlags()
if err != nil {
log.Fatalf("[fatal] cannot parse flags: %v", err)
}
if flags.Version {
fmt.Println(Version)
os.Exit(0)
}
log.Printf("[info] started sync with flags: %+v", flags)
syncCmd(flags)
}
func syncCmd(flags Flags) {
awsClient, err := aws.NewClient(flags.AWSAccount, flags.AWSRegion)
if err != nil {
log.Fatalf("[fatal] cannot create aws client: %v", err)
}
dockerClient, err := docker.NewClient()
if err != nil {
log.Fatalf("[fatal] cannot create docker client: %v", err)
}
syncClient, err := sync.NewClient(awsClient, dockerClient)
if err != nil {
log.Fatalf("[fatal] cannot create sync client: %v", err)
}
var errors bool
for _, image := range listImages(flags.ImagesFile) {
if err := syncClient.SyncImage(image, flags.DryRun); err != nil {
errors = true
log.Printf("[error] cannot sync image: %v", err)
}
}
// fail if one of the images fail
if errors {
os.Exit(1)
}
}
func listImages(fileName string) []string {
file, err := os.Open(fileName)
if err != nil {
log.Fatalf("[fatal] cannot open images list file: %v", err)
}
defer file.Close()
duplicateImages := make(map[string]interface{})
var images []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
image := strings.TrimSpace(scanner.Text())
// skip empty lines
if image == "" {
continue
}
// skip duplicate images
if _, ok := duplicateImages[image]; ok {
log.Printf("[warn] duplicate image %s, skipping", image)
continue
}
duplicateImages[image] = nil
images = append(images, image)
}
if err := scanner.Err(); err != nil {
log.Fatalf("[fatal] cannot list images file: %v", err)
}
return images
}