22 dockerBuild ,
33 pushDockerImage ,
44 checkDockerDaemon ,
5+ parseImagePath ,
6+ inspectImage ,
7+ tagDockerImage ,
58} from '../execDocker/docker.js' ;
69import { sconify } from '../utils/sconify.js' ;
710import { askForDockerhubUsername } from '../cli-helpers/askForDockerhubUsername.js' ;
@@ -20,7 +23,6 @@ import { goToProjectRoot } from '../cli-helpers/goToProjectRoot.js';
2023import * as color from '../cli-helpers/color.js' ;
2124import { hintBox } from '../cli-helpers/box.js' ;
2225import { addDeploymentData } from '../utils/cacheExecutions.js' ;
23- import { deployTdxApp , getIExecTdx } from '../utils/tdx-poc.js' ;
2426import { useTdx } from '../utils/featureFlags.js' ;
2527import { ensureBalances } from '../cli-helpers/ensureBalances.js' ;
2628import { warnBeforeTxFees } from '../cli-helpers/warnBeforeTxFees.js' ;
@@ -39,11 +41,16 @@ export async function deploy({ chain }: { chain?: string }) {
3941 const userAddress = await signer . getAddress ( ) ;
4042
4143 // initialize iExec
42- let iexec ;
43- if ( useTdx ) {
44- iexec = getIExecTdx ( { ...chainConfig , signer } ) ;
45- } else {
46- iexec = getIExec ( { ...chainConfig , signer } ) ;
44+ const iexec = getIExec ( { ...chainConfig , signer } ) ;
45+ // determine TEE framework based on feature flag
46+ const teeFramework = useTdx ? 'tdx' : 'scone' ;
47+ // check TEE framework compatibility with selected chain
48+ try {
49+ await iexec . config . resolveSmsURL ( { teeFramework } ) ;
50+ } catch {
51+ throw new Error (
52+ `TEE framework ${ teeFramework . toUpperCase ( ) } is not supported on the selected chain`
53+ ) ;
4754 }
4855
4956 await ensureBalances ( { spinner, iexec, warnOnlyRlc : true } ) ;
@@ -64,7 +71,7 @@ export async function deploy({ chain }: { chain?: string }) {
6471 throw Error ( 'Invalid version' ) ;
6572 }
6673
67- const imageTag = `${ dockerhubUsername } /${ projectNameToImageName ( projectName ) } :${ iAppVersion } ` ;
74+ const nonTeeImage = `${ dockerhubUsername } /${ projectNameToImageName ( projectName ) } :${ iAppVersion } ` ;
6875
6976 const appSecret = await askForAppSecret ( { spinner } ) ;
7077
@@ -75,37 +82,60 @@ export async function deploy({ chain }: { chain?: string }) {
7582 spinner . start ( 'Building docker image...\n' ) ;
7683 const buildLogs = [ ] ;
7784 const imageId = await dockerBuild ( {
78- tag : imageTag ,
85+ tag : nonTeeImage ,
7986 progressCallback : ( msg ) => {
8087 buildLogs . push ( msg ) ; // do we want to show build logs after build is successful?
8188 spinner . text = spinner . text + color . comment ( msg ) ;
8289 } ,
8390 } ) ;
84- spinner . succeed ( `Docker image built (${ imageId } ) and tagged ${ imageTag } ` ) ;
85-
86- spinner . start ( 'Pushing docker image...\n' ) ;
87- await pushDockerImage ( {
88- tag : imageTag ,
89- dockerhubAccessToken,
90- dockerhubUsername,
91- progressCallback : ( msg ) => {
92- spinner . text = spinner . text + color . comment ( msg ) ;
93- } ,
94- } ) ;
95- spinner . succeed ( `Pushed image ${ imageTag } on dockerhub` ) ;
91+ spinner . succeed ( `Docker image built (${ imageId } )` ) ;
9692
9793 let appDockerImage : string ;
9894 let appContractAddress : string ;
9995
100- if ( useTdx && iexec ) {
96+ if ( useTdx ) {
97+ spinner . start ( 'Pushing docker image...\n' ) ;
98+ const {
99+ dockerUserName,
100+ imageName,
101+ imageTag : originalImageTag ,
102+ } = parseImagePath ( nonTeeImage ) ;
103+ const repo = `${ dockerUserName } /${ imageName } ` ;
104+ const inspectResult = await inspectImage ( nonTeeImage ) ;
105+ const tdxImageShortId = inspectResult . Id . substring ( 7 , 7 + 12 ) ; // extract 12 first chars after the leading "sha256:"
106+ const tdxImageTag = `${ originalImageTag } -tdx-${ tdxImageShortId } ` ; // add digest in tag to avoid replacing previous build
107+ const tdxImage = await tagDockerImage ( {
108+ image : nonTeeImage ,
109+ repo,
110+ tag : tdxImageTag ,
111+ } ) ;
112+ await pushDockerImage ( {
113+ tag : tdxImage ,
114+ dockerhubUsername,
115+ dockerhubAccessToken,
116+ } ) ;
117+ spinner . succeed ( `Pushed image ${ tdxImage } on dockerhub` ) ;
118+ appDockerImage = tdxImage ;
101119 spinner . start ( 'Deploying your TDX TEE app on iExec...' ) ;
102- ( { tdxImage : appDockerImage , appContractAddress } = await deployTdxApp ( {
103- iexec,
104- image : imageTag ,
120+ const { address } = await iexec . app . deployApp ( {
121+ owner : await iexec . wallet . getAddress ( ) ,
122+ name : `${ imageName } -${ originalImageTag } ` ,
123+ type : 'DOCKER' ,
124+ multiaddr : tdxImage ,
125+ checksum : `0x${ inspectResult . RepoDigests [ 0 ] . split ( '@sha256:' ) [ 1 ] } ` ,
126+ } ) ;
127+ appContractAddress = address ;
128+ } else {
129+ spinner . start ( 'Pushing docker image...\n' ) ;
130+ await pushDockerImage ( {
131+ tag : nonTeeImage ,
105132 dockerhubAccessToken,
106133 dockerhubUsername,
107- } ) ) ;
108- } else {
134+ progressCallback : ( msg ) => {
135+ spinner . text = spinner . text + color . comment ( msg ) ;
136+ } ,
137+ } ) ;
138+ spinner . succeed ( `Pushed image ${ nonTeeImage } on dockerhub` ) ;
109139 spinner . start (
110140 'Transforming your image into a TEE image, this may take a few minutes...'
111141 ) ;
@@ -116,17 +146,16 @@ export async function deploy({ chain }: { chain?: string }) {
116146 fingerprint,
117147 entrypoint,
118148 } = await sconify ( {
119- iAppNameToSconify : imageTag ,
149+ iAppNameToSconify : nonTeeImage ,
120150 template,
121151 walletAddress : userAddress ,
122152 dockerhubAccessToken,
123153 dockerhubUsername,
124154 } ) ;
125155 appDockerImage = dockerImage ;
126156 spinner . succeed ( `Pushed TEE image ${ appDockerImage } on dockerhub` ) ;
127-
128157 spinner . start ( 'Deploying your TEE app on iExec...' ) ;
129- ( { address : appContractAddress } = await iexec . app . deployApp ( {
158+ const { address } = await iexec . app . deployApp ( {
130159 owner : userAddress ,
131160 name : `${ projectNameToImageName ( projectName ) } -${ iAppVersion } ` ,
132161 type : 'DOCKER' ,
@@ -140,16 +169,19 @@ export async function deploy({ chain }: { chain?: string }) {
140169 heapSize : 1073741824 ,
141170 fingerprint,
142171 } ,
143- } ) ) ;
172+ } ) ;
173+ appContractAddress = address ;
144174 }
145-
146175 // Add deployment data to deployments.json
147176 await addDeploymentData ( {
148177 image : appDockerImage ,
149178 app : appContractAddress ,
150179 owner : userAddress ,
151180 chainName,
152181 } ) ;
182+ spinner . succeed (
183+ `TEE app deployed with image ${ appDockerImage } on iExec with address ${ appContractAddress } `
184+ ) ;
153185
154186 spinner . succeed ( 'TEE app deployed' ) ;
155187 if ( appSecret !== null && iexec ) {
0 commit comments