Skip to content

Commit f9e8f26

Browse files
refactor(deployment): update deployment scripts for GitHub Actions
- Migrate deployment scripts from Drone to GitHub Actions environment variables - Update configuration to support multi-environment deployments - Improve environment-specific whitelisted apps configuration - Update deployment scripts for new workflow compatibility
1 parent 05d016f commit f9e8f26

File tree

10 files changed

+74
-341
lines changed

10 files changed

+74
-341
lines changed

deployment-dapp/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deployment-dapp/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"author": "",
1919
"license": "ISC",
2020
"dependencies": {
21-
"iexec": "^8.15.0",
21+
"iexec": "^8.16.1",
2222
"typescript": "^5.0.4",
2323
"yup": "^1.2.0"
2424
},
Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,11 @@
1-
import { readFileSync } from 'fs';
2-
31
//hosting url
4-
export const HOST = 'https://bellecour.iex.ec';
52

63
//deployment parameters
74
export const APP_NAME = 'web3mail';
85
export const APP_TYPE = 'DOCKER';
96
export const FRAMEWORK = 'scone';
107

11-
//publish sell order parameters
12-
export const DEFAULT_APP_PRICE = 0;
13-
export const DEFAULT_APP_VOLUME = 1000000;
148
export const APP_TAG = ['tee', 'scone'];
159

16-
//ENS name
17-
export const WEB3_MAIL_ENS_NAME_DEV = 'web3mail-dev.apps.iexec.eth';
18-
export const WEB3_MAIL_ENS_NAME_PROD = 'web3mail.apps.iexec.eth';
19-
20-
//scone image
21-
const SCONIFIER_VERSION = '5.7.5-v12';
22-
const dappVersion = JSON.parse(
23-
readFileSync('../dapp/package.json', 'utf-8')
24-
).version;
25-
2610
export const DOCKER_IMAGE_NAMESPACE = 'iexechub';
2711
export const DOCKER_IMAGE_REPOSITORY = 'web3mail-dapp';
28-
export const DOCKER_IMAGE_PROD_TAG = `${dappVersion}-sconify-${SCONIFIER_VERSION}-production`;
29-
export const DOCKER_IMAGE_DEV_TAG = `dev-${process.env.DRONE_COMMIT}-sconify-${SCONIFIER_VERSION}-production`;
30-
31-
//drone target
32-
export const DRONE_TARGET_DEPLOY_DEV = 'dapp-dev';
33-
export const DRONE_TARGET_DEPLOY_PROD = 'dapp-prod';
34-
export const DRONE_TARGET_SELL_ORDER_DEV = 'dapp-publish-sell-order-dev';
35-
export const DRONE_TARGET_SELL_ORDER_PROD = 'dapp-publish-sell-order-prod';
36-
export const DRONE_TARGET_REVOKE_SELL_ORDER_DEV = 'dapp-revoke-sell-order-dev';
37-
export const DRONE_TARGET_REVOKE_SELL_ORDER_PROD =
38-
'dapp-revoke-sell-order-prod';
39-
export const DRONE_TARGET_PUSH_SECRET_DEV = 'dapp-push-secret-dev';
40-
export const DRONE_TARGET_PUSH_SECRET_PROD = 'dapp-push-secret-prod';
41-
42-
//Previous Web3mail dapp addresses
43-
export const WEB3MAIL_WHITELISTED_APPS_DEV =
44-
'["0x600dc5ad1fdb376a37777298ff2c75a48fd220d2"]';
45-
export const WEB3MAIL_WHITELISTED_APPS_PROD =
46-
'["0x0d8b899f2faa0fe9f0b17bcf4debd0cbc9e574ef"]';

deployment-dapp/src/configureEnsNameScript.ts

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,19 @@
1-
import {
2-
DRONE_TARGET_DEPLOY_DEV,
3-
DRONE_TARGET_DEPLOY_PROD,
4-
WEB3_MAIL_ENS_NAME_DEV,
5-
WEB3_MAIL_ENS_NAME_PROD,
6-
} from './config/config.js';
7-
import { getIExec, loadAppAddress } from './utils/utils.js';
81
import { configureEnsName } from './singleFunction/configureEnsName.js';
2+
import { getIExec, loadAppAddress } from './utils/utils.js';
93

104
const main = async () => {
11-
// get env variables from drone
12-
const { DRONE_DEPLOY_TO, WALLET_PRIVATE_KEY_DEV, WALLET_PRIVATE_KEY_PROD } =
13-
process.env;
14-
15-
if (
16-
!DRONE_DEPLOY_TO ||
17-
(DRONE_DEPLOY_TO !== DRONE_TARGET_DEPLOY_DEV &&
18-
DRONE_DEPLOY_TO !== DRONE_TARGET_DEPLOY_PROD)
19-
)
20-
throw Error(`Invalid promote target ${DRONE_DEPLOY_TO}`);
5+
const { RPC_URL, WALLET_PRIVATE_KEY, DAPP_ENS_NAME } = process.env;
216

227
const appAddress = await loadAppAddress();
238

24-
let privateKey;
25-
let ensName;
26-
if (DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_DEV) {
27-
privateKey = WALLET_PRIVATE_KEY_DEV;
28-
ensName = WEB3_MAIL_ENS_NAME_DEV;
29-
} else if (DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_PROD) {
30-
privateKey = WALLET_PRIVATE_KEY_PROD;
31-
ensName = WEB3_MAIL_ENS_NAME_PROD;
32-
}
33-
34-
if (!privateKey)
35-
throw Error(`Failed to get privateKey for target ${DRONE_DEPLOY_TO}`);
36-
37-
if (!ensName)
38-
throw Error(`Failed to get ens name for target ${DRONE_DEPLOY_TO}`);
9+
if (!WALLET_PRIVATE_KEY)
10+
throw Error(`Failed to get privateKey from environment variables`);
3911

40-
const iexec = getIExec(privateKey);
12+
if (!DAPP_ENS_NAME)
13+
throw Error(`Failed to get DAPP_ENS_NAME from environment variables`);
4114

42-
await configureEnsName(iexec, appAddress, ensName);
15+
const iexec = getIExec(WALLET_PRIVATE_KEY, RPC_URL);
16+
await configureEnsName(iexec, appAddress, DAPP_ENS_NAME);
4317
};
4418

4519
main().catch((e) => {

deployment-dapp/src/deployScript.ts

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,30 @@
11
import { deployApp } from './singleFunction/deployApp.js';
2-
import {
3-
DOCKER_IMAGE_DEV_TAG,
4-
DOCKER_IMAGE_PROD_TAG,
5-
DRONE_TARGET_DEPLOY_DEV,
6-
DRONE_TARGET_DEPLOY_PROD,
7-
} from './config/config.js';
82
import { getIExec, saveAppAddress } from './utils/utils.js';
93

104
const main = async () => {
11-
// get env variables from drone
12-
const { DRONE_DEPLOY_TO, WALLET_PRIVATE_KEY_DEV, WALLET_PRIVATE_KEY_PROD } =
13-
process.env;
14-
15-
if (
16-
!DRONE_DEPLOY_TO ||
17-
(DRONE_DEPLOY_TO !== DRONE_TARGET_DEPLOY_DEV &&
18-
DRONE_DEPLOY_TO !== DRONE_TARGET_DEPLOY_PROD)
19-
)
20-
throw Error(`Invalid promote target ${DRONE_DEPLOY_TO}`);
21-
22-
let privateKey;
23-
if (DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_DEV) {
24-
privateKey = WALLET_PRIVATE_KEY_DEV;
25-
} else if (DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_PROD) {
26-
privateKey = WALLET_PRIVATE_KEY_PROD;
27-
}
28-
29-
if (!privateKey)
30-
throw Error(`Failed to get privateKey for target ${DRONE_DEPLOY_TO}`);
31-
32-
const iexec = getIExec(privateKey);
33-
34-
let dockerImageTag;
35-
if (DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_DEV) {
36-
dockerImageTag = DOCKER_IMAGE_DEV_TAG;
37-
} else if (DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_PROD) {
38-
dockerImageTag = DOCKER_IMAGE_PROD_TAG;
5+
// get env variables from GitHub Actions
6+
const {
7+
RPC_URL,
8+
WALLET_PRIVATE_KEY,
9+
DOCKER_IMAGE_TAG,
10+
CHECKSUM,
11+
FINGERPRINT,
12+
} = process.env;
13+
14+
if (!WALLET_PRIVATE_KEY)
15+
throw Error(`Missing WALLET_PRIVATE_KEY environment variable`);
16+
17+
const iexec = getIExec(WALLET_PRIVATE_KEY, RPC_URL);
18+
19+
if (!DOCKER_IMAGE_TAG) {
20+
throw Error(`Missing DOCKER_IMAGE_TAG environment variable.`);
3921
}
4022

41-
//deploy app
4223
const address = await deployApp({
4324
iexec,
44-
dockerTag: dockerImageTag,
25+
dockerTag: DOCKER_IMAGE_TAG,
26+
checksum: CHECKSUM,
27+
fingerprint: FINGERPRINT,
4528
});
4629
await saveAppAddress(address);
4730
};

deployment-dapp/src/publishSellOrderScript.ts

Lines changed: 7 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,26 @@
1-
import { getIExec, loadAppAddress } from './utils/utils.js';
21
import { publishSellOrder } from './singleFunction/publishSellOrder.js';
3-
import { resolveName } from './singleFunction/resolveName.js';
4-
import {
5-
DRONE_TARGET_SELL_ORDER_DEV,
6-
DRONE_TARGET_SELL_ORDER_PROD,
7-
DRONE_TARGET_DEPLOY_DEV,
8-
DRONE_TARGET_DEPLOY_PROD,
9-
WEB3_MAIL_ENS_NAME_DEV,
10-
WEB3_MAIL_ENS_NAME_PROD,
11-
DEFAULT_APP_PRICE,
12-
DEFAULT_APP_VOLUME,
13-
} from './config/config.js';
2+
import { getIExec, loadAppAddress } from './utils/utils.js';
143
import {
15-
positiveStrictIntegerSchema,
164
positiveNumberSchema,
5+
positiveStrictIntegerSchema,
176
} from './utils/validator.js';
187

198
const main = async () => {
20-
// get env variables from drone
21-
const {
22-
DRONE_DEPLOY_TO,
23-
WALLET_PRIVATE_KEY_DEV,
24-
WALLET_PRIVATE_KEY_PROD,
25-
PRICE,
26-
VOLUME,
27-
} = process.env;
28-
29-
if (
30-
!DRONE_DEPLOY_TO ||
31-
![
32-
DRONE_TARGET_DEPLOY_DEV,
33-
DRONE_TARGET_SELL_ORDER_DEV,
34-
DRONE_TARGET_DEPLOY_PROD,
35-
DRONE_TARGET_SELL_ORDER_PROD,
36-
].includes(DRONE_DEPLOY_TO)
37-
)
38-
throw Error(`Invalid promote target ${DRONE_DEPLOY_TO}`);
39-
40-
let privateKey;
41-
if (
42-
[DRONE_TARGET_DEPLOY_DEV, DRONE_TARGET_SELL_ORDER_DEV].includes(
43-
DRONE_DEPLOY_TO
44-
)
45-
) {
46-
privateKey = WALLET_PRIVATE_KEY_DEV;
47-
} else if (
48-
[DRONE_TARGET_DEPLOY_PROD, DRONE_TARGET_SELL_ORDER_PROD].includes(
49-
DRONE_DEPLOY_TO
50-
)
51-
) {
52-
privateKey = WALLET_PRIVATE_KEY_PROD;
53-
}
54-
55-
if (!privateKey)
56-
throw Error(`Failed to get privateKey for target ${DRONE_DEPLOY_TO}`);
9+
const { RPC_URL, WALLET_PRIVATE_KEY, PRICE, VOLUME } = process.env;
5710

58-
const iexec = getIExec(privateKey);
11+
const iexec = getIExec(WALLET_PRIVATE_KEY, RPC_URL);
5912

60-
const appAddress = await loadAppAddress().catch(() => {
61-
console.log('No app address found falling back to ENS');
62-
let ensName;
63-
if (DRONE_DEPLOY_TO === DRONE_TARGET_SELL_ORDER_DEV) {
64-
ensName = WEB3_MAIL_ENS_NAME_DEV;
65-
} else if (DRONE_DEPLOY_TO === DRONE_TARGET_SELL_ORDER_PROD) {
66-
ensName = WEB3_MAIL_ENS_NAME_PROD;
67-
}
68-
if (!ensName)
69-
throw Error(`Failed to get ens name for target ${DRONE_DEPLOY_TO}`);
70-
return resolveName(iexec, ensName);
71-
});
13+
const appAddress = await loadAppAddress();
7214

7315
if (!appAddress) throw Error('Failed to get app address'); // If the app was not deployed, do not continue
7416

7517
// validate params
7618
const price = await positiveNumberSchema()
77-
.default(DEFAULT_APP_PRICE)
19+
.required()
7820
.label('PRICE')
7921
.validate(PRICE);
8022
const volume = await positiveStrictIntegerSchema()
81-
.default(DEFAULT_APP_VOLUME)
23+
.required()
8224
.label('VOLUME')
8325
.validate(VOLUME);
8426

deployment-dapp/src/pushSecretScript.ts

Lines changed: 14 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,39 @@
1-
import {
2-
DRONE_TARGET_DEPLOY_DEV,
3-
DRONE_TARGET_DEPLOY_PROD,
4-
DRONE_TARGET_PUSH_SECRET_DEV,
5-
DRONE_TARGET_PUSH_SECRET_PROD,
6-
WEB3_MAIL_ENS_NAME_DEV,
7-
WEB3_MAIL_ENS_NAME_PROD,
8-
WEB3MAIL_WHITELISTED_APPS_DEV,
9-
WEB3MAIL_WHITELISTED_APPS_PROD,
10-
} from './config/config.js';
111
import { pushSecret } from './singleFunction/pushSecret.js';
12-
import { resolveName } from './singleFunction/resolveName.js';
132
import { getIExec, loadAppAddress } from './utils/utils.js';
143

154
const main = async () => {
16-
// get env variables from drone
175
const {
18-
DRONE_DEPLOY_TO,
19-
WALLET_PRIVATE_KEY_DEV,
20-
WALLET_PRIVATE_KEY_PROD,
6+
RPC_URL,
7+
WALLET_PRIVATE_KEY,
218
MJ_APIKEY_PUBLIC,
229
MJ_APIKEY_PRIVATE,
2310
MJ_SENDER,
2411
MAILGUN_APIKEY,
12+
WEB3MAIL_WHITELISTED_APPS,
2513
} = process.env;
2614

27-
if (
28-
!DRONE_DEPLOY_TO ||
29-
![
30-
DRONE_TARGET_DEPLOY_DEV,
31-
DRONE_TARGET_DEPLOY_PROD,
32-
DRONE_TARGET_PUSH_SECRET_DEV,
33-
DRONE_TARGET_PUSH_SECRET_PROD,
34-
].includes(DRONE_DEPLOY_TO)
35-
)
36-
throw Error(`Invalid promote target ${DRONE_DEPLOY_TO}`);
37-
15+
if (!WALLET_PRIVATE_KEY)
16+
throw Error(`Missing WALLET_PRIVATE_KEY environment variable`);
3817
if (!MJ_APIKEY_PUBLIC) throw Error('Missing env MJ_APIKEY_PUBLIC');
3918
if (!MJ_APIKEY_PRIVATE) throw Error('Missing env MJ_APIKEY_PRIVATE');
4019
if (!MJ_SENDER) throw Error('Missing env MJ_SENDER');
4120
if (!MAILGUN_APIKEY) throw Error('Missing env MAILGUN_APIKEY');
21+
if (WEB3MAIL_WHITELISTED_APPS === undefined)
22+
throw Error('Missing env WEB3MAIL_WHITELISTED_APPS');
4223

43-
let privateKey;
44-
let baseWhitelistedApps;
45-
46-
if (
47-
DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_DEV ||
48-
DRONE_DEPLOY_TO === DRONE_TARGET_PUSH_SECRET_DEV
49-
) {
50-
privateKey = WALLET_PRIVATE_KEY_DEV;
51-
baseWhitelistedApps = JSON.parse(WEB3MAIL_WHITELISTED_APPS_DEV);
52-
} else if (
53-
DRONE_DEPLOY_TO === DRONE_TARGET_DEPLOY_PROD ||
54-
DRONE_DEPLOY_TO === DRONE_TARGET_PUSH_SECRET_PROD
55-
) {
56-
privateKey = WALLET_PRIVATE_KEY_PROD;
57-
baseWhitelistedApps = JSON.parse(WEB3MAIL_WHITELISTED_APPS_PROD);
58-
}
59-
60-
if (!privateKey)
61-
throw Error(`Failed to get privateKey for target ${DRONE_DEPLOY_TO}`);
24+
if (!WALLET_PRIVATE_KEY)
25+
throw Error(`Missing WALLET_PRIVATE_KEY environment variable`);
6226

63-
const iexec = getIExec(privateKey);
27+
const iexec = getIExec(WALLET_PRIVATE_KEY, RPC_URL);
6428

65-
const appAddress = await loadAppAddress().catch(() => {
66-
console.log('No app address found falling back to ENS');
67-
let ensName;
68-
if (DRONE_DEPLOY_TO === DRONE_TARGET_PUSH_SECRET_DEV) {
69-
ensName = WEB3_MAIL_ENS_NAME_DEV;
70-
} else if (DRONE_DEPLOY_TO === DRONE_TARGET_PUSH_SECRET_PROD) {
71-
ensName = WEB3_MAIL_ENS_NAME_PROD;
72-
}
73-
if (!ensName)
74-
throw Error(`Failed to get ens name for target ${DRONE_DEPLOY_TO}`);
75-
return resolveName(iexec, ensName);
76-
});
29+
const appAddress = await loadAppAddress();
7730

7831
if (!appAddress) throw Error('Failed to get app address'); // If the app was not deployed, do not continue
32+
7933
const fullWhitelistedApps = [
80-
...new Set([...baseWhitelistedApps, appAddress]),
34+
...new Set([...JSON.parse(WEB3MAIL_WHITELISTED_APPS), appAddress]),
8135
];
82-
//deploy app
83-
//push app secret to the secret management
36+
8437
const jsonSecret = JSON.stringify({
8538
MJ_APIKEY_PUBLIC,
8639
MJ_APIKEY_PRIVATE,

0 commit comments

Comments
 (0)