@@ -34,6 +34,8 @@ import (
34
34
"github.com/go-git/go-billy/v5/memfs"
35
35
"github.com/google/go-containerregistry/pkg/authn"
36
36
"github.com/google/go-containerregistry/pkg/name"
37
+ "github.com/google/go-containerregistry/pkg/registry"
38
+ "github.com/google/go-containerregistry/pkg/v1/remote"
37
39
"github.com/google/go-containerregistry/pkg/v1/remote/transport"
38
40
"github.com/stretchr/testify/assert"
39
41
"github.com/stretchr/testify/require"
@@ -987,6 +989,84 @@ COPY %s .`, testImageAlpine, inclFile)
987
989
}
988
990
}
989
991
992
+ func TestPushImage (t * testing.T ) {
993
+ t .Parallel ()
994
+
995
+ t .Run ("Push" , func (t * testing.T ) {
996
+ t .Parallel ()
997
+
998
+ srv := createGitServer (t , gitServerOptions {
999
+ files : map [string ]string {
1000
+ ".devcontainer/Dockerfile" : fmt .Sprintf ("FROM %s\n RUN date --utc > /root/date.txt" , testImageAlpine ),
1001
+ ".devcontainer/devcontainer.json" : `{
1002
+ "name": "Test",
1003
+ "build": {
1004
+ "dockerfile": "Dockerfile"
1005
+ },
1006
+ }` ,
1007
+ },
1008
+ })
1009
+
1010
+ // Given: an empty registry
1011
+ testReg := setupInMemoryRegistry (t )
1012
+ testRepo := testReg + "/test"
1013
+ ref , err := name .ParseReference (testRepo + ":latest" )
1014
+ require .NoError (t , err )
1015
+ _ , err = remote .Image (ref )
1016
+ require .ErrorContains (t , err , "NAME_UNKNOWN" , "expected image to not be present before build + push" )
1017
+
1018
+ // When: we run envbuilder with PUSH_IMAGE set
1019
+ _ , err = runEnvbuilder (t , options {env : []string {
1020
+ envbuilderEnv ("GIT_URL" , srv .URL ),
1021
+ envbuilderEnv ("CACHE_REPO" , testRepo ),
1022
+ }})
1023
+ require .NoError (t , err )
1024
+
1025
+ // Then: the image should be pushed
1026
+ _ , err = remote .Image (ref )
1027
+ require .NoError (t , err , "expected image to be present after build + push" )
1028
+ })
1029
+
1030
+ t .Run ("PushErr" , func (t * testing.T ) {
1031
+ t .Parallel ()
1032
+
1033
+ srv := createGitServer (t , gitServerOptions {
1034
+ files : map [string ]string {
1035
+ ".devcontainer/Dockerfile" : fmt .Sprintf ("FROM %s\n RUN date --utc > /root/date.txt" , testImageAlpine ),
1036
+ ".devcontainer/devcontainer.json" : `{
1037
+ "name": "Test",
1038
+ "build": {
1039
+ "dockerfile": "Dockerfile"
1040
+ },
1041
+ }` ,
1042
+ },
1043
+ })
1044
+
1045
+ // Given: registry is not set up (in this case, not a registry)
1046
+ notRegSrv := httptest .NewServer (http .NotFoundHandler ())
1047
+ notRegURL := strings .TrimPrefix (notRegSrv .URL , "http://" ) + "/test"
1048
+
1049
+ // When: we run envbuilder with PUSH_IMAGE set
1050
+ _ , err := runEnvbuilder (t , options {env : []string {
1051
+ envbuilderEnv ("GIT_URL" , srv .URL ),
1052
+ envbuilderEnv ("CACHE_REPO" , notRegURL ),
1053
+ }})
1054
+ // Then: should fail with a descriptive error
1055
+ require .ErrorContains (t , err , "unexpected status code 404 Not Found" )
1056
+ })
1057
+ }
1058
+
1059
+ func setupInMemoryRegistry (t * testing.T ) string {
1060
+ t .Helper ()
1061
+ tempDir := t .TempDir ()
1062
+ testReg := registry .New (registry .WithBlobHandler (registry .NewDiskBlobHandler (tempDir )))
1063
+ regSrv := httptest .NewServer (testReg )
1064
+ t .Cleanup (func () { regSrv .Close () })
1065
+ regSrvURL , err := url .Parse (regSrv .URL )
1066
+ require .NoError (t , err )
1067
+ return fmt .Sprintf ("localhost:%s" , regSrvURL .Port ())
1068
+ }
1069
+
990
1070
// TestMain runs before all tests to build the envbuilder image.
991
1071
func TestMain (m * testing.M ) {
992
1072
checkTestRegistry ()
0 commit comments