@@ -40,11 +40,12 @@ type (
40
40
41
41
// Login defines Docker login parameters.
42
42
Login struct {
43
- Registry string // Docker registry address
44
- Username string // Docker registry username
45
- Password string // Docker registry password
46
- Email string // Docker registry email
47
- Config string // Docker Auth Config
43
+ Registry string // Docker registry address
44
+ Username string // Docker registry username
45
+ Password string // Docker registry password
46
+ Email string // Docker registry email
47
+ Config string // Docker Auth Config
48
+ AccessToken string // External Access Token
48
49
}
49
50
50
51
// Build defines Docker build parameters.
@@ -152,6 +153,8 @@ func (p Plugin) Exec() error {
152
153
fmt .Println ("Detected registry credentials" )
153
154
case p .Login .Config != "" :
154
155
fmt .Println ("Detected registry credentials file" )
156
+ case p .Login .AccessToken != "" :
157
+ fmt .Println ("Detected access token" )
155
158
default :
156
159
fmt .Println ("Registry credentials or Docker config not provided. Guest mode enabled." )
157
160
}
@@ -177,6 +180,17 @@ func (p Plugin) Exec() error {
177
180
fmt .Println (out )
178
181
return fmt .Errorf ("Error authenticating: exit status 1" )
179
182
}
183
+ } else if p .Login .AccessToken != "" {
184
+ cmd := commandLoginAccessToken (p .Login , p .Login .AccessToken )
185
+ output , err := cmd .CombinedOutput ()
186
+ if err != nil {
187
+ return fmt .Errorf ("error logging in to Docker registry: %s" , err )
188
+ }
189
+ if strings .Contains (string (output ), "Login Succeeded" ) {
190
+ fmt .Println ("Login successful" )
191
+ } else {
192
+ return fmt .Errorf ("login did not succeed" )
193
+ }
180
194
}
181
195
182
196
// cache export feature is currently not supported for docker driver hence we have to create docker-container driver
@@ -301,6 +315,18 @@ func commandLogin(login Login) *exec.Cmd {
301
315
)
302
316
}
303
317
318
+ // helper to login via access token
319
+ func commandLoginAccessToken (login Login , accessToken string ) * exec.Cmd {
320
+ cmd := exec .Command (dockerExe ,
321
+ "login" ,
322
+ "-u" ,
323
+ "oauth2accesstoken" ,
324
+ "--password-stdin" ,
325
+ login .Registry )
326
+ cmd .Stdin = strings .NewReader (accessToken )
327
+ return cmd
328
+ }
329
+
304
330
// helper to check if args match "docker pull <image>"
305
331
func isCommandPull (args []string ) bool {
306
332
return len (args ) > 2 && args [1 ] == "pull"
0 commit comments