66 "encoding/json"
77 "fmt"
88 "io/ioutil"
9+ "log/slog"
910 "net/http"
1011 "net/url"
1112 "os"
@@ -16,8 +17,6 @@ import (
1617 "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
1718 "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
1819 "github.com/joho/godotenv"
19- "github.com/pkg/errors"
20- "github.com/sirupsen/logrus"
2120
2221 docker "github.com/drone-plugins/drone-docker"
2322 azureutil "github.com/drone-plugins/drone-docker/internal/azure"
@@ -82,32 +81,35 @@ func main() {
8281 if username == "" && password == "" {
8382 // docker login credentials are not provided
8483 var err error
85- username = defaultUsername
86- if idToken != "" && clientId != "" && tenantId != "" {
87- logrus .Debug ("Using OIDC authentication flow" )
88- var aadToken string
89- aadToken , err = azureutil .GetAADAccessTokenViaClientAssertion (context .Background (), tenantId , clientId , idToken , authorityHost )
90- if err != nil {
91- logrus .Fatal (err )
92- }
84+ username = defaultUsername
85+ if idToken != "" && clientId != "" && tenantId != "" {
86+ slog .Debug ("using OIDC authentication flow" )
87+ var aadToken string
88+ aadToken , err = azureutil .GetAADAccessTokenViaClientAssertion (context .Background (), tenantId , clientId , idToken , authorityHost )
89+ if err != nil {
90+ slog .Error ("failed to get AAD access token" , "error" , err )
91+ os .Exit (1 )
92+ }
9393 var p string
9494 p , err = getPublicUrl (aadToken , registry , subscriptionId )
9595 if err == nil {
9696 publicUrl = p
9797 } else {
9898 fmt .Fprintf (os .Stderr , "failed to get public url with error: %s\n " , err )
9999 }
100- password , err = fetchACRToken (tenantId , aadToken , registry )
101- if err != nil {
102- logrus .Fatal (err )
103- }
104- } else {
105- password , publicUrl , err = getAuth (clientId , clientSecret , clientCert , tenantId , subscriptionId , registry )
106- if err != nil {
107- logrus .Fatal (err )
108- }
100+ password , err = fetchACRToken (tenantId , aadToken , registry )
101+ if err != nil {
102+ slog .Error ("failed to fetch ACR token" , "error" , err )
103+ os .Exit (1 )
104+ }
105+ } else {
106+ password , publicUrl , err = getAuth (clientId , clientSecret , clientCert , tenantId , subscriptionId , registry )
107+ if err != nil {
108+ slog .Error ("failed to get auth" , "error" , err )
109+ os .Exit (1 )
109110 }
110111 }
112+ }
111113
112114 // must use the fully qualified repo name. If the
113115 // repo name does not have the registry prefix we
@@ -133,7 +135,8 @@ func main() {
133135 cmd .Stderr = os .Stderr
134136 err := cmd .Run ()
135137 if err != nil {
136- logrus .Fatal (err )
138+ slog .Error ("command execution failed" , "error" , err )
139+ os .Exit (1 )
137140 }
138141}
139142
@@ -153,26 +156,26 @@ func getAuth(clientId, clientSecret, clientCert, tenantId, subscriptionId, regis
153156 if clientCert != "" {
154157 err := setupACRCert (clientCert , acrCertPath )
155158 if err != nil {
156- errors . Wrap ( err , "failed to push setup cert file" )
159+ slog . Warn ( "failed to push setup cert file" , "error" , err )
157160 }
158161 }
159162
160163 // Get AZ env
161164 if err := os .Setenv (clientIdEnv , clientId ); err != nil {
162- return "" , "" , errors . Wrap ( err , "failed to set env variable client Id" )
165+ return "" , "" , fmt . Errorf ( "failed to set env variable client Id: %w" , err )
163166 }
164167 if err := os .Setenv (clientSecretKeyEnv , clientSecret ); err != nil {
165- return "" , "" , errors . Wrap ( err , "failed to set env variable client secret" )
168+ return "" , "" , fmt . Errorf ( "failed to set env variable client secret: %w" , err )
166169 }
167170 if err := os .Setenv (tenantKeyEnv , tenantId ); err != nil {
168- return "" , "" , errors . Wrap ( err , "failed to set env variable tenant Id" )
171+ return "" , "" , fmt . Errorf ( "failed to set env variable tenant Id: %w" , err )
169172 }
170173 if err := os .Setenv (certPathEnv , acrCertPath ); err != nil {
171- return "" , "" , errors . Wrap ( err , "failed to set env variable cert path" )
174+ return "" , "" , fmt . Errorf ( "failed to set env variable cert path: %w" , err )
172175 }
173176 env , err := azidentity .NewEnvironmentCredential (nil )
174177 if err != nil {
175- return "" , "" , errors . Wrap ( err , "failed to get env credentials from azure" )
178+ return "" , "" , fmt . Errorf ( "failed to get env credentials from azure: %w" , err )
176179 }
177180 os .Unsetenv (clientIdEnv )
178181 os .Unsetenv (clientSecretKeyEnv )
@@ -185,7 +188,7 @@ func getAuth(clientId, clientSecret, clientCert, tenantId, subscriptionId, regis
185188 }
186189 aadToken , err := env .GetToken (context .Background (), policy )
187190 if err != nil {
188- return "" , "" , errors . Wrap ( err , "failed to fetch access token" )
191+ return "" , "" , fmt . Errorf ( "failed to fetch access token: %w" , err )
189192 }
190193
191194 // Get public URL for artifacts
@@ -198,7 +201,7 @@ func getAuth(clientId, clientSecret, clientCert, tenantId, subscriptionId, regis
198201 // Fetch token
199202 ACRToken , err := fetchACRToken (tenantId , aadToken .Token , registry )
200203 if err != nil {
201- return "" , "" , errors . Wrap ( err , "failed to fetch ACR token" )
204+ return "" , "" , fmt . Errorf ( "failed to fetch ACR token: %w" , err )
202205 }
203206 return ACRToken , publicUrl , nil
204207}
@@ -213,34 +216,34 @@ func fetchACRToken(tenantId, token, registry string) (string, error) {
213216 }
214217 jsonResponse , err := http .PostForm (fmt .Sprintf ("https://%s/oauth2/exchange" , registry ), formData )
215218 if err != nil || jsonResponse == nil {
216- return "" , errors . Wrap ( err , "failed to fetch ACR token" )
219+ return "" , fmt . Errorf ( "failed to fetch ACR token: %w" , err )
217220 }
218221
219222 // fetch token from response
220223 var response map [string ]interface {}
221224 err = json .NewDecoder (jsonResponse .Body ).Decode (& response )
222225 if err != nil {
223- return "" , errors . Wrap ( err , "failed to decode oauth exchange response" )
226+ return "" , fmt . Errorf ( "failed to decode oauth exchange response: %w" , err )
224227 }
225228
226229 // Parse the refresh_token from the response
227230 if t , found := response ["refresh_token" ]; found {
228231 if refreshToken , ok := t .(string ); ok {
229232 return refreshToken , nil
230233 }
231- return "" , errors . New ("failed to cast refresh token from acr" )
234+ return "" , fmt . Errorf ("failed to cast refresh token from acr" )
232235 }
233- return "" , errors . Wrap ( err , "refresh token not found in response of oauth exchange call" )
236+ return "" , fmt . Errorf ( "refresh token not found in response of oauth exchange call: %w" , err )
234237}
235238
236239func setupACRCert (cert , certPath string ) error {
237240 decoded , err := base64 .StdEncoding .DecodeString (cert )
238241 if err != nil {
239- return errors . Wrap ( err , "failed to base64 decode ACR certificate" )
242+ return fmt . Errorf ( "failed to base64 decode ACR certificate: %w" , err )
240243 }
241244 err = ioutil .WriteFile (certPath , decoded , 0644 )
242245 if err != nil {
243- return errors . Wrap ( err , "failed to write ACR certificate" )
246+ return fmt . Errorf ( "failed to write ACR certificate: %w" , err )
244247 }
245248 return nil
246249}
@@ -262,24 +265,24 @@ func getPublicUrl(token, registryUrl, subscriptionId string) (string, error) {
262265 req , err := http .NewRequest ("GET" , url , nil )
263266 if err != nil {
264267 fmt .Println (err )
265- return "" , errors . Wrap ( err , "failed to create request for getting container registry setting" )
268+ return "" , fmt . Errorf ( "failed to create request for getting container registry setting: %w" , err )
266269 }
267270
268271 req .Header .Add ("Authorization" , "Bearer " + token )
269272 res , err := client .Do (req )
270273 if err != nil {
271274 fmt .Println (err )
272- return "" , errors . Wrap ( err , "failed to send request for getting container registry setting" )
275+ return "" , fmt . Errorf ( "failed to send request for getting container registry setting: %w" , err )
273276 }
274277 defer res .Body .Close ()
275278
276279 var response subscriptionUrlResponse
277280 err = json .NewDecoder (res .Body ).Decode (& response )
278281 if err != nil {
279- return "" , errors . Wrap ( err , "failed to send request for getting container registry setting" )
282+ return "" , fmt . Errorf ( "failed to send request for getting container registry setting: %w" , err )
280283 }
281284 if len (response .Value ) == 0 {
282- return "" , errors . New ("no id present for base url" )
285+ return "" , fmt . Errorf ("no id present for base url" )
283286 }
284287 return basePublicUrl + encodeParam (response .Value [0 ].ID ), nil
285288}
0 commit comments