@@ -3,27 +3,25 @@ import { createRequire } from 'node:module';
33import path from 'node:path' ;
44import { fileURLToPath } from 'node:url' ;
55import { execa } from 'execa' ;
6- import minimist from 'minimist' ;
6+ import yargs from 'yargs' ;
7+ import { hideBin } from 'yargs/helpers' ;
78
89const __dirname = path . dirname ( fileURLToPath ( import . meta. url ) ) ;
910const rootPath = path . resolve ( __dirname , '../' ) ;
1011const packagesDir = 'packages' ;
1112const packagesPath = path . join ( rootPath , packagesDir ) ;
12-
1313const packages = fs . readdirSync ( packagesPath ) ;
14+
1415const {
15- version,
1616 docker : { registry } ,
17- } = createRequire ( import . meta. url ) ( '../package.json' ) ;
17+ homepage,
18+ } = createRequire ( `${ rootPath } /` ) ( './package.json' ) ;
19+ const { version } = createRequire ( `${ rootPath } /` ) ( './lerna.json' ) ;
1820
19- const args = minimist ( process . argv . slice ( 2 ) , { alias : { t : 'tag' , v : 'verbose' } } ) ;
20- const target = `${ args . _ [ 0 ] } ` ;
21- const tag = args . tag || 'latest' ;
22-
23- const run = ( bin , args , opts = { } ) =>
21+ const exec = ( bin , args , opts = { } ) =>
2422 execa ( bin , args , { stdio : 'inherit' , cwd : rootPath , ...opts } ) ;
2523
26- async function main ( ) {
24+ const imageInfo = ( target , tag ) => {
2725 if ( ! packages . includes ( target ) ) {
2826 throw new Error ( `Invalid target: '${ target } '` ) ;
2927 }
@@ -34,23 +32,56 @@ async function main() {
3432 const currentImage = `${ packageName } :v${ version } ` ;
3533 const tagImage = `${ packageName } :${ tag } ` ;
3634
37- const dockerArgs = [
38- 'build' ,
39- '.' ,
40- '-f' ,
41- `${ targetPath } /Dockerfile` ,
42- '-t' ,
43- currentImage ,
44- '-t' ,
45- tagImage ,
46- ] ;
47- if ( args . verbose ) {
48- dockerArgs . push ( '--progress' , 'plain' ) ;
49- }
50- await run ( 'docker' , dockerArgs ) ;
51- }
35+ return { packageName, currentImage, tagImage } ;
36+ } ;
5237
53- main ( ) . catch ( ( error ) => {
54- console . error ( error ) ;
55- process . exit ( 1 ) ;
56- } ) ;
38+ yargs ( hideBin ( process . argv ) )
39+ . command (
40+ 'build <target>' ,
41+ 'build docker image' ,
42+ {
43+ tag : { alias : 't' , default : 'latest' } ,
44+ verbose : { alias : 'v' , type : 'boolean' } ,
45+ } ,
46+ async ( args ) => {
47+ const { target, tag, verbose } = args ;
48+ const { currentImage, tagImage } = imageInfo ( target , tag ) ;
49+ const dockerArgs = [
50+ 'build' ,
51+ '.' ,
52+ '--target' ,
53+ target ,
54+ '--label' ,
55+ `org.opencontainers.image.source=${ homepage } ` ,
56+ '-t' ,
57+ currentImage ,
58+ '-t' ,
59+ tagImage ,
60+ ] ;
61+ if ( verbose ) {
62+ dockerArgs . push ( '--progress' , 'plain' ) ;
63+ }
64+ console . log ( 'Running docker:' , dockerArgs . join ( ' ' ) ) ;
65+ await exec ( 'docker' , dockerArgs ) ;
66+ } ,
67+ )
68+ . command (
69+ 'push <target>' ,
70+ 'push docker image' ,
71+ {
72+ tag : { alias : 't' , default : 'latest' } ,
73+ verbose : { alias : 'v' , type : 'boolean' } ,
74+ } ,
75+ async ( args ) => {
76+ const { target, tag, verbose } = args ;
77+ const { packageName } = imageInfo ( target , tag ) ;
78+ const dockerArgs = [ 'push' , packageName , '-a' ] ;
79+ if ( verbose ) {
80+ dockerArgs . push ( '--progress' , 'plain' ) ;
81+ }
82+ console . log ( 'Running docker:' , dockerArgs . join ( ' ' ) ) ;
83+ await exec ( 'docker' , dockerArgs ) ;
84+ } ,
85+ )
86+ . help ( )
87+ . parse ( ) ;
0 commit comments