From 9b9cf25bf98057b3278ede396e3560b350dddcc8 Mon Sep 17 00:00:00 2001 From: Chamhaw Date: Thu, 29 Dec 2022 12:15:05 +0800 Subject: [PATCH 1/6] support ecr --- cmd/manifest-ecr/main.go | 140 ++++++++++++++++++++++++++++++ docker/ecr/Dockerfile.linux.amd64 | 4 + go.mod | 5 ++ go.sum | 39 +++++++++ util/plugin.go | 11 +++ 5 files changed, 199 insertions(+) create mode 100644 cmd/manifest-ecr/main.go create mode 100644 docker/ecr/Dockerfile.linux.amd64 create mode 100644 util/plugin.go diff --git a/cmd/manifest-ecr/main.go b/cmd/manifest-ecr/main.go new file mode 100644 index 0000000..c8b9028 --- /dev/null +++ b/cmd/manifest-ecr/main.go @@ -0,0 +1,140 @@ +package main + +import ( + "encoding/base64" + "fmt" + "github.com/drone-plugins/drone-manifest/util" + "log" + "os" + "os/exec" + "strconv" + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials/stscreds" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ecr" + "github.com/joho/godotenv" + "github.com/sirupsen/logrus" +) + +const defaultRegion = "us-east-1" + +func main() { + // Load env-file if it exists first + if env := os.Getenv("PLUGIN_ENV_FILE"); env != "" { + godotenv.Load(env) + } + + var ( + registry = getenv("PLUGIN_REGISTRY") + spec = getenv("PLUGIN_SPEC") + region = getenv("PLUGIN_REGION", "ECR_REGION", "AWS_REGION") + key = getenv("PLUGIN_ACCESS_KEY", "ECR_ACCESS_KEY", "AWS_ACCESS_KEY_ID") + secret = getenv("PLUGIN_SECRET_KEY", "ECR_SECRET_KEY", "AWS_SECRET_ACCESS_KEY") + assumeRole = getenv("PLUGIN_ASSUME_ROLE") + externalId = getenv("PLUGIN_EXTERNAL_ID") + ) + + // set the region + if region == "" { + region = defaultRegion + } + + os.Setenv("AWS_REGION", region) + + if key != "" && secret != "" { + os.Setenv("AWS_ACCESS_KEY_ID", key) + os.Setenv("AWS_SECRET_ACCESS_KEY", secret) + } + + sess, err := session.NewSession(&aws.Config{Region: ®ion}) + if err != nil { + log.Fatal(fmt.Sprintf("error creating aws session: %v", err)) + } + + svc := getECRClient(sess, assumeRole, externalId) + username, password, defaultRegistry, err := getAuthInfo(svc) + + if registry == "" { + registry = defaultRegistry + } + + if err != nil { + log.Fatal(fmt.Sprintf("error getting ECR auth: %v", err)) + } + + os.Setenv("PLUGIN_REGISTRY", registry) + os.Setenv("DOCKER_USERNAME", username) + os.Setenv("DOCKER_PASSWORD", password) + os.Setenv("PLUGIN_SPEC", spec) + + // invoke the base docker plugin binary + cmd := exec.Command(util.GetDroneManifestExecCmd()) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + logrus.Fatal(err) + } +} + +func getAuthInfo(svc *ecr.ECR) (username, password, registry string, err error) { + var result *ecr.GetAuthorizationTokenOutput + var decoded []byte + + result, err = svc.GetAuthorizationToken(&ecr.GetAuthorizationTokenInput{}) + if err != nil { + return + } + + auth := result.AuthorizationData[0] + token := *auth.AuthorizationToken + decoded, err = base64.StdEncoding.DecodeString(token) + if err != nil { + return + } + + registry = strings.TrimPrefix(*auth.ProxyEndpoint, "https://") + creds := strings.Split(string(decoded), ":") + username = creds[0] + password = creds[1] + return +} + +func parseBoolOrDefault(defaultValue bool, s string) (result bool) { + var err error + result, err = strconv.ParseBool(s) + if err != nil { + result = false + } + + return +} + +func getenv(key ...string) (s string) { + for _, k := range key { + s = os.Getenv(k) + if s != "" { + return + } + } + return +} + +func getECRClient(sess *session.Session, role string, externalId string) *ecr.ECR { + if role == "" { + return ecr.New(sess) + } + if externalId != "" { + return ecr.New(sess, &aws.Config{ + Credentials: stscreds.NewCredentials(sess, role, func(p *stscreds.AssumeRoleProvider) { + p.ExternalID = &externalId + }), + }) + } else { + return ecr.New(sess, &aws.Config{ + Credentials: stscreds.NewCredentials(sess, role), + }) + } +} diff --git a/docker/ecr/Dockerfile.linux.amd64 b/docker/ecr/Dockerfile.linux.amd64 new file mode 100644 index 0000000..3e250b8 --- /dev/null +++ b/docker/ecr/Dockerfile.linux.amd64 @@ -0,0 +1,4 @@ +FROM --platform=linux/amd64 plugins/manifest + +ADD release/linux/amd64/manifest-ecr /bin/ +ENTRYPOINT ["/bin/manifest-ecr"] diff --git a/go.mod b/go.mod index feddfe0..a4f6bab 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,12 @@ module github.com/drone-plugins/drone-manifest go 1.19 require ( + github.com/aws/aws-sdk-go v1.44.167 github.com/coreos/go-semver v0.3.0 github.com/drone/drone-template-lib v1.0.1-0.20201006172840-a58a3f26ebca + github.com/joho/godotenv v1.4.0 github.com/pkg/errors v0.9.1 + github.com/sirupsen/logrus v1.9.0 github.com/urfave/cli v1.22.10 ) @@ -18,12 +21,14 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.13 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/cast v1.3.1 // indirect github.com/stretchr/testify v1.8.1 // indirect golang.org/x/crypto v0.4.0 // indirect + golang.org/x/sys v0.3.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 38f87cc..888e434 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvo github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig/v3 v3.1.0 h1:j7GpgZ7PdFqNsmncycTHsLmVPf5/3wJtlgW9TNDYD9Y= github.com/Masterminds/sprig/v3 v3.1.0/go.mod h1:ONGMf7UfYGAbMXCZmQLy8x3lCDIPrEZE/rU8pmrbihA= +github.com/aws/aws-sdk-go v1.44.167 h1:kQmBhGdZkQLU7AiHShSkBJ15zr8agy0QeaxXduvyp2E= +github.com/aws/aws-sdk-go v1.44.167/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= @@ -27,6 +29,12 @@ github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -41,6 +49,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -48,22 +58,51 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/util/plugin.go b/util/plugin.go new file mode 100644 index 0000000..ea3fa87 --- /dev/null +++ b/util/plugin.go @@ -0,0 +1,11 @@ +package util + +import "runtime" + +func GetDroneManifestExecCmd() string { + if runtime.GOOS == "windows" { + return "C:/bin/drone-manifest.exe" + } + + return "drone-manifest" +} From 89dfed42057459d10a7145a66bc630d1c593caa9 Mon Sep 17 00:00:00 2001 From: Chamhaw Date: Thu, 29 Dec 2022 12:26:56 +0800 Subject: [PATCH 2/6] update dockerfile and readme --- README.md | 6 ++++ docker/ecr/Dockerfile.linux.amd64 | 2 +- docker/ecr/Dockerfile.linux.arm | 4 +++ docker/ecr/Dockerfile.linux.arm64 | 4 +++ docker/ecr/Dockerfile.windows.amd64.1809 | 5 +++ docker/ecr/Dockerfile.windows.amd64.ltsc2022 | 5 +++ docker/ecr/manifest.tmpl | 37 ++++++++++++++++++++ 7 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 docker/ecr/Dockerfile.linux.arm create mode 100644 docker/ecr/Dockerfile.linux.arm64 create mode 100644 docker/ecr/Dockerfile.windows.amd64.1809 create mode 100644 docker/ecr/Dockerfile.windows.amd64.ltsc2022 create mode 100644 docker/ecr/manifest.tmpl diff --git a/README.md b/README.md index 54bc568..072f5b0 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ export CGO_ENABLED=0 export GO111MODULE=on go build -v -a -tags netgo -o release/linux/amd64/drone-manifest +go build -v -a -tags netgo -o release/linux/amd64/manifest-ecr ``` ## Docker @@ -32,6 +33,11 @@ docker build \ --label org.label-schema.build-date=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \ --label org.label-schema.vcs-ref=$(git rev-parse --short HEAD) \ --file docker/Dockerfile.linux.amd64 --tag plugins/manifest . + +docker build \ + --label org.label-schema.build-date=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \ + --label org.label-schema.vcs-ref=$(git rev-parse --short HEAD) \ + --file docker/ecr/Dockerfile.linux.amd64 --tag plugins/manifest-ecr . ``` ## Usage diff --git a/docker/ecr/Dockerfile.linux.amd64 b/docker/ecr/Dockerfile.linux.amd64 index 3e250b8..8324fbd 100644 --- a/docker/ecr/Dockerfile.linux.amd64 +++ b/docker/ecr/Dockerfile.linux.amd64 @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 plugins/manifest +FROM plugins/manifest:linux-amd64 ADD release/linux/amd64/manifest-ecr /bin/ ENTRYPOINT ["/bin/manifest-ecr"] diff --git a/docker/ecr/Dockerfile.linux.arm b/docker/ecr/Dockerfile.linux.arm new file mode 100644 index 0000000..170dcc1 --- /dev/null +++ b/docker/ecr/Dockerfile.linux.arm @@ -0,0 +1,4 @@ +FROM plugins/manifest:linux-arm + +ADD release/linux/arm/manifest-ecr /bin/ +ENTRYPOINT ["/bin/manifest-ecr"] diff --git a/docker/ecr/Dockerfile.linux.arm64 b/docker/ecr/Dockerfile.linux.arm64 new file mode 100644 index 0000000..8776ac7 --- /dev/null +++ b/docker/ecr/Dockerfile.linux.arm64 @@ -0,0 +1,4 @@ +FROM plugins/manifest:linux-arm64 + +ADD release/linux/amd64/manifest-ecr /bin/ +ENTRYPOINT ["/bin/manifest-ecr"] diff --git a/docker/ecr/Dockerfile.windows.amd64.1809 b/docker/ecr/Dockerfile.windows.amd64.1809 new file mode 100644 index 0000000..72deb0f --- /dev/null +++ b/docker/ecr/Dockerfile.windows.amd64.1809 @@ -0,0 +1,5 @@ +# escape=` +FROM plugins/manifest:windows-1809-amd64 + +ADD release/windows/amd64/manifest-ecr.exe C:/bin/manifest-ecr.exe +ENTRYPOINT [ "C:\\bin\\manifest-ecr.exe" ] diff --git a/docker/ecr/Dockerfile.windows.amd64.ltsc2022 b/docker/ecr/Dockerfile.windows.amd64.ltsc2022 new file mode 100644 index 0000000..42d464c --- /dev/null +++ b/docker/ecr/Dockerfile.windows.amd64.ltsc2022 @@ -0,0 +1,5 @@ +# escape=` +FROM plugins/manifest:windows-ltsc2022-amd64 + +ADD release/windows/amd64/manifest-ecr.exe C:/bin/manifest-ecr.exe +ENTRYPOINT [ "C:\\bin\\manifest-ecr.exe" ] diff --git a/docker/ecr/manifest.tmpl b/docker/ecr/manifest.tmpl new file mode 100644 index 0000000..ffb0405 --- /dev/null +++ b/docker/ecr/manifest.tmpl @@ -0,0 +1,37 @@ +image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} +{{#if build.tags}} +tags: +{{#each build.tags}} + - {{this}} +{{/each}} +{{/if}} +manifests: + - + image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64 + platform: + architecture: amd64 + os: linux + - + image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64 + platform: + architecture: arm64 + os: linux + variant: v8 + - + image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm + platform: + architecture: arm + os: linux + variant: v7 + - + image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}windows-1809-amd64 + platform: + architecture: amd64 + os: windows + version: 1809 + - + image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}windows-ltsc2022-amd64 + platform: + architecture: amd64 + os: windows + version: ltsc2022 From 498f5f1c167508115d79056603564c757481d47d Mon Sep 17 00:00:00 2001 From: Chamhaw Date: Thu, 29 Dec 2022 12:28:38 +0800 Subject: [PATCH 3/6] remove arm 32 --- docker/ecr/Dockerfile.linux.arm | 4 ---- docker/ecr/manifest.tmpl | 6 ------ 2 files changed, 10 deletions(-) delete mode 100644 docker/ecr/Dockerfile.linux.arm diff --git a/docker/ecr/Dockerfile.linux.arm b/docker/ecr/Dockerfile.linux.arm deleted file mode 100644 index 170dcc1..0000000 --- a/docker/ecr/Dockerfile.linux.arm +++ /dev/null @@ -1,4 +0,0 @@ -FROM plugins/manifest:linux-arm - -ADD release/linux/arm/manifest-ecr /bin/ -ENTRYPOINT ["/bin/manifest-ecr"] diff --git a/docker/ecr/manifest.tmpl b/docker/ecr/manifest.tmpl index ffb0405..0fd1804 100644 --- a/docker/ecr/manifest.tmpl +++ b/docker/ecr/manifest.tmpl @@ -17,12 +17,6 @@ manifests: architecture: arm64 os: linux variant: v8 - - - image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm - platform: - architecture: arm - os: linux - variant: v7 - image: plugins/manifest-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}windows-1809-amd64 platform: From af7b178f32242569812fc8c605a9ebdaaed4fd59 Mon Sep 17 00:00:00 2001 From: Chamhaw Date: Tue, 7 Feb 2023 13:54:24 +0800 Subject: [PATCH 4/6] bug fixed for ecr --- README.md | 2 +- docker/ecr/Dockerfile.linux.arm64 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 072f5b0..42008e7 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ export CGO_ENABLED=0 export GO111MODULE=on go build -v -a -tags netgo -o release/linux/amd64/drone-manifest -go build -v -a -tags netgo -o release/linux/amd64/manifest-ecr +go build -v -a -tags netgo -o release/linux/amd64/manifest-ecr ./cmd/manifest-ecr ``` ## Docker diff --git a/docker/ecr/Dockerfile.linux.arm64 b/docker/ecr/Dockerfile.linux.arm64 index 8776ac7..e520570 100644 --- a/docker/ecr/Dockerfile.linux.arm64 +++ b/docker/ecr/Dockerfile.linux.arm64 @@ -1,4 +1,4 @@ FROM plugins/manifest:linux-arm64 -ADD release/linux/amd64/manifest-ecr /bin/ +ADD release/linux/arm64/manifest-ecr /bin/ ENTRYPOINT ["/bin/manifest-ecr"] From 33d35b8f04d6076ed2138fd9e66c1d41b4450234 Mon Sep 17 00:00:00 2001 From: Chamhaw <93499036+chamhaw@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:11:06 +0800 Subject: [PATCH 5/6] Update upstream to latest (#1) rebase upstream and update go.mod --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1ff48b4..74b2bb1 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/drone/drone-go v1.7.1 github.com/drone/drone-template-lib v1.0.1-0.20201006172840-a58a3f26ebca github.com/estesp/manifest-tool/v2 v2.0.8 - github.com/joho/godotenv v1.4.0 + github.com/joho/godotenv v1.5.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/opencontainers/image-spec v1.1.0-rc2 github.com/sirupsen/logrus v1.9.0 diff --git a/go.sum b/go.sum index 5c40ac6..36bf369 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= From b440b0b9ba1f533eb05ee105dbcf2d9c318f45cc Mon Sep 17 00:00:00 2001 From: Chamhaw <93499036+chamhaw@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:44:31 +0800 Subject: [PATCH 6/6] Update upstream to latest (#4) rebase upstream and update go.mod --- cmd/manifest-ecr/main.go | 71 ++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/cmd/manifest-ecr/main.go b/cmd/manifest-ecr/main.go index c8b9028..8e3b512 100644 --- a/cmd/manifest-ecr/main.go +++ b/cmd/manifest-ecr/main.go @@ -2,14 +2,13 @@ package main import ( "encoding/base64" - "fmt" - "github.com/drone-plugins/drone-manifest/util" "log" "os" "os/exec" - "strconv" "strings" + "github.com/drone-plugins/drone-manifest/util" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials/stscreds" "github.com/aws/aws-sdk-go/aws/session" @@ -23,17 +22,20 @@ const defaultRegion = "us-east-1" func main() { // Load env-file if it exists first if env := os.Getenv("PLUGIN_ENV_FILE"); env != "" { - godotenv.Load(env) + err := godotenv.Load(env) + if err != nil { + panic(err) + } } var ( - registry = getenv("PLUGIN_REGISTRY") - spec = getenv("PLUGIN_SPEC") - region = getenv("PLUGIN_REGION", "ECR_REGION", "AWS_REGION") - key = getenv("PLUGIN_ACCESS_KEY", "ECR_ACCESS_KEY", "AWS_ACCESS_KEY_ID") - secret = getenv("PLUGIN_SECRET_KEY", "ECR_SECRET_KEY", "AWS_SECRET_ACCESS_KEY") - assumeRole = getenv("PLUGIN_ASSUME_ROLE") - externalId = getenv("PLUGIN_EXTERNAL_ID") + registry = getEnv("PLUGIN_REGISTRY") + spec = getEnv("PLUGIN_SPEC") + region = getEnv("PLUGIN_REGION", "ECR_REGION", "AWS_REGION") + key = getEnv("PLUGIN_ACCESS_KEY", "ECR_ACCESS_KEY", "AWS_ACCESS_KEY_ID") + secret = getEnv("PLUGIN_SECRET_KEY", "ECR_SECRET_KEY", "AWS_SECRET_ACCESS_KEY") + assumeRole = getEnv("PLUGIN_ASSUME_ROLE") + externalId = getEnv("PLUGIN_EXTERNAL_ID") ) // set the region @@ -41,16 +43,16 @@ func main() { region = defaultRegion } - os.Setenv("AWS_REGION", region) + setEnvOrPanic("AWS_REGION", region) if key != "" && secret != "" { - os.Setenv("AWS_ACCESS_KEY_ID", key) - os.Setenv("AWS_SECRET_ACCESS_KEY", secret) + setEnvOrPanic("AWS_ACCESS_KEY_ID", key) + setEnvOrPanic("AWS_SECRET_ACCESS_KEY", secret) } sess, err := session.NewSession(&aws.Config{Region: ®ion}) if err != nil { - log.Fatal(fmt.Sprintf("error creating aws session: %v", err)) + log.Fatalf("error creating aws session: %v", err) } svc := getECRClient(sess, assumeRole, externalId) @@ -61,13 +63,13 @@ func main() { } if err != nil { - log.Fatal(fmt.Sprintf("error getting ECR auth: %v", err)) + log.Fatalf("error getting ECR auth: %v", err) } - os.Setenv("PLUGIN_REGISTRY", registry) - os.Setenv("DOCKER_USERNAME", username) - os.Setenv("DOCKER_PASSWORD", password) - os.Setenv("PLUGIN_SPEC", spec) + setEnvOrPanic("PLUGIN_REGISTRY", registry) + setEnvOrPanic("DOCKER_USERNAME", username) + setEnvOrPanic("DOCKER_PASSWORD", password) + setEnvOrPanic("PLUGIN_SPEC", spec) // invoke the base docker plugin binary cmd := exec.Command(util.GetDroneManifestExecCmd()) @@ -102,17 +104,17 @@ func getAuthInfo(svc *ecr.ECR) (username, password, registry string, err error) return } -func parseBoolOrDefault(defaultValue bool, s string) (result bool) { - var err error - result, err = strconv.ParseBool(s) - if err != nil { - result = false - } - - return -} - -func getenv(key ...string) (s string) { +// func parseBoolOrDefault(defaultValue bool, s string) (result bool) { +// var err error +// result, err = strconv.ParseBool(s) +// if err != nil { +// result = false +// } +// +// return +// } + +func getEnv(key ...string) (s string) { for _, k := range key { s = os.Getenv(k) if s != "" { @@ -122,6 +124,13 @@ func getenv(key ...string) (s string) { return } +func setEnvOrPanic(key, value string) { + err := os.Setenv(key, value) + if err != nil { + panic(err) + } +} + func getECRClient(sess *session.Session, role string, externalId string) *ecr.ECR { if role == "" { return ecr.New(sess)