@@ -31,27 +31,50 @@ const pkg = require('../package.json');
3131const APP_PATH = path . resolve ( __dirname , '../' )
3232const APP_NAME = pkg . name
3333
34+ const SERVER_IMAGE = 'ghcr.io/nextcloud/continuous-integration-shallow-server'
35+
3436/**
3537 * Start the testing container
3638 */
37- export const startNextcloud = async function ( branch = 'master' ) : Promise < any > {
39+ export const startNextcloud = async function ( branch : string = 'master' ) : Promise < any > {
3840 try {
39- // Remove old container if exists
41+ // Pulling images
42+ console . log ( 'Pulling images...' )
43+ await docker . pull ( SERVER_IMAGE )
44+
45+ // Getting latest image
46+ console . log ( '\nChecking running containers... 🔍' )
47+ const localImage = await docker . listImages ( { filters : `{"reference": ["${ SERVER_IMAGE } "]}` } )
48+
49+ // Remove old container if exists and not initialized by us
4050 try {
4151 const oldContainer = docker . getContainer ( CONTAINER_NAME )
52+ const oldContainerData = await oldContainer . inspect ( )
53+ if ( oldContainerData . State . Running ) {
54+ console . log ( `├─ Existing running container found` )
55+ if ( localImage [ 0 ] . Id !== oldContainerData . Image ) {
56+ console . log ( `└─ But running container is outdated, replacing...` )
57+ } else {
58+ // Get container's IP
59+ console . log ( `├─ Reusing that container` )
60+ let ip = await getContainerIP ( oldContainer )
61+ return ip
62+ }
63+ } else {
64+ console . log ( `└─ None found!` )
65+ }
66+ // Forcing any remnants to be removed just in case
4267 await oldContainer . remove ( { force : true } )
43- } catch ( error ) { }
44-
45- // Pulling images
46- console . log ( 'Pulling images...' )
47- await docker . pull ( 'ghcr.io/nextcloud/continuous-integration-shallow-server' )
68+ } catch ( error ) {
69+ console . log ( `└─ None found!` )
70+ }
4871
4972 // Starting container
50- console . log ( 'Starting Nextcloud container...' )
51- console . log ( `> Using branch '${ branch } '` )
52- console . log ( `> Mounting app '${ APP_NAME } ' from '${ APP_PATH } '` )
73+ console . log ( '\nStarting Nextcloud container... 🚀 ' )
74+ console . log ( `├─ Using branch '${ branch } '` )
75+ console . log ( `├─ And binding app '${ APP_NAME } ' from '${ APP_PATH } '` )
5376 const container = await docker . createContainer ( {
54- Image : 'ghcr.io/nextcloud/continuous-integration-shallow-server' ,
77+ Image : SERVER_IMAGE ,
5578 name : CONTAINER_NAME ,
5679 Env : [ `BRANCH=${ branch } ` ] ,
5780 HostConfig : {
@@ -63,35 +86,36 @@ export const startNextcloud = async function (branch = 'master'): Promise<any> {
6386 // Get container's IP
6487 let ip = await getContainerIP ( container )
6588
66- console . log ( `> Nextcloud container's IP is ${ ip } 🌏` )
89+ console . log ( `├─ Nextcloud container's IP is ${ ip } 🌏` )
6790 return ip
6891 } catch ( err ) {
92+ console . log ( `└─ Unable to start the container 🛑` )
6993 console . log ( err )
7094 stopNextcloud ( )
71- throw new Error ( '> Unable to start the container 🛑 ' )
95+ throw new Error ( 'Unable to start the container' )
7296 }
7397}
7498
7599/**
76100 * Configure Nextcloud
77101 */
78102export const configureNextcloud = async function ( ) {
79- console . log ( 'Configuring nextcloud...' )
103+ console . log ( '\nConfiguring nextcloud...' )
80104 const container = docker . getContainer ( CONTAINER_NAME )
81- await runExec ( container , [ 'php' , 'occ' , '--version' ] )
105+ await runExec ( container , [ 'php' , 'occ' , '--version' ] , true )
82106
83107 // Be consistent for screenshots
84- await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'default_language' , '--value' , 'en' ] )
85- await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'force_language' , '--value' , 'en' ] )
86- await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'default_locale' , '--value' , 'en_US' ] )
87- await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'force_locale' , '--value' , 'en_US' ] )
88- await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'enforce_theme' , '--value' , 'light' ] )
108+ await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'default_language' , '--value' , 'en' ] , true )
109+ await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'force_language' , '--value' , 'en' ] , true )
110+ await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'default_locale' , '--value' , 'en_US' ] , true )
111+ await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'force_locale' , '--value' , 'en_US' ] , true )
112+ await runExec ( container , [ 'php' , 'occ' , 'config:system:set' , 'enforce_theme' , '--value' , 'light' ] , true )
89113
90114 // Enable the app and give status
91- await runExec ( container , [ 'php' , 'occ' , 'app:enable' , '--force' , 'viewer' ] )
92- await runExec ( container , [ 'php' , 'occ' , 'app:list' ] )
115+ await runExec ( container , [ 'php' , 'occ' , 'app:enable' , '--force' , 'viewer' ] , true )
116+ // await runExec(container, ['php', 'occ', 'app:list'], true )
93117
94- console . log ( '> Nextcloud is now ready to use 🎉' )
118+ console . log ( '└─ Nextcloud is now ready to use 🎉' )
95119}
96120
97121/**
@@ -102,7 +126,7 @@ export const stopNextcloud = async function () {
102126 const container = docker . getContainer ( CONTAINER_NAME )
103127 console . log ( 'Stopping Nextcloud container...' )
104128 container . remove ( { force : true } )
105- console . log ( '> Nextcloud container removed 🥀' )
129+ console . log ( '└─ Nextcloud container removed 🥀' )
106130 } catch ( err ) {
107131 console . log ( err )
108132 }
@@ -139,13 +163,15 @@ export const getContainerIP = async function (
139163// We need to make sure the server is already running before cypress
140164// https://github.com/cypress-io/cypress/issues/22676
141165export const waitOnNextcloud = async function ( ip : string ) {
142- console . log ( '> Waiting for Nextcloud to be ready ⏳' )
166+ console . log ( '├─ Waiting for Nextcloud to be ready... ⏳' )
143167 await waitOn ( { resources : [ `http://${ ip } /index.php` ] } )
168+ console . log ( '└─ Done' )
144169}
145170
146171const runExec = async function (
147172 container : Docker . Container ,
148- command : string [ ]
173+ command : string [ ] ,
174+ verbose : boolean = false
149175) {
150176 const exec = await container . exec ( {
151177 Cmd : command ,
@@ -154,11 +180,18 @@ const runExec = async function (
154180 User : 'www-data' ,
155181 } )
156182
157- await exec . start ( { } , ( err , stream ) => {
158- if ( stream ) {
159- stream . setEncoding ( 'utf-8' )
160- stream . on ( 'data' , console . log )
161- }
183+ return new Promise ( ( resolve , reject ) => {
184+ exec . start ( { } , ( err , stream ) => {
185+ if ( stream ) {
186+ stream . setEncoding ( 'utf-8' )
187+ stream . on ( 'data' , str => {
188+ if ( verbose && str . trim ( ) !== '' ) {
189+ console . log ( `├─ ${ str . trim ( ) . replace ( / \n / gi, '\n├─ ' ) } ` )
190+ }
191+ } )
192+ stream . on ( 'end' , resolve )
193+ }
194+ } )
162195 } )
163196}
164197
0 commit comments