Skip to content

Commit 8049f50

Browse files
committed
fetch id token from github
1 parent 525bbff commit 8049f50

7 files changed

Lines changed: 240 additions & 169 deletions

File tree

action.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ inputs:
55
token:
66
description: 'Repository upload token - get it from codecov.io. Required only for private repositories'
77
required: false
8+
use_oidc:
9+
description: 'Uses Github OIDC to provision upload token.'
10+
required: false
11+
url:
12+
description: 'URL to codecov installation. Defaults to https://codecov.io'
13+
required: false
814
file:
915
description: 'Path to coverage file to upload'
1016
required: false

dist/index.js

Lines changed: 108 additions & 73 deletions
Large diffs are not rendered by default.

dist/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/buildExec.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ test('upload args', () => {
124124
});
125125

126126

127-
test('report args', () => {
127+
test('report args', async () => {
128128
const envs = {
129129
override_commit: '9caabca5474b49de74ef5667deabaf74cdacc244',
130130
slug: 'fakeOwner/fakeRepo',
@@ -134,7 +134,7 @@ test('report args', () => {
134134
process.env['INPUT_' + env.toUpperCase()] = envs[env];
135135
}
136136

137-
const {reportExecArgs, reportCommand} = buildReportExec();
137+
const {reportExecArgs, reportCommand} = await buildReportExec();
138138

139139
expect(reportExecArgs).toEqual(
140140
expect.arrayContaining([
@@ -150,7 +150,7 @@ test('report args', () => {
150150
});
151151

152152

153-
test('report args using context', () => {
153+
test('report args using context', async () => {
154154
const envs = {
155155
token: 'd3859757-ab80-4664-924d-aef22fa7557b',
156156
};
@@ -162,7 +162,7 @@ test('report args using context', () => {
162162
expectedArgs.push('-C', `${context.payload.pull_request.head.sha}`);
163163
}
164164

165-
const {reportExecArgs, reportCommand} = buildReportExec();
165+
const {reportExecArgs, reportCommand} = await buildReportExec();
166166

167167
expect(reportExecArgs).toEqual(expectedArgs);
168168
expect(reportCommand).toEqual('create-report');

src/buildExec.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@ const isTrue = (variable) => {
1818
};
1919

2020

21-
const buildCommitExec = () => {
21+
const buildCommitExec = async () => {
2222
const commitParent = core.getInput('commit_parent');
2323
const overrideBranch = core.getInput('override_branch');
2424
const overrideCommit = core.getInput('override_commit');
2525
const overridePr = core.getInput('override_pr');
2626
const slug = core.getInput('slug');
27-
const token = core.getInput('token');
28-
2927

3028
const commitCommand = 'create-commit';
3129
const commitExecArgs = [];
@@ -40,7 +38,7 @@ const buildCommitExec = () => {
4038
GITHUB_HEAD_REF: process.env.GITHUB_HEAD_REF || '',
4139
});
4240

43-
41+
const token = await fetchToken();
4442
if (token) {
4543
commitOptions.env.CODECOV_TOKEN = token;
4644
}
@@ -88,12 +86,9 @@ const buildGeneralExec = () => {
8886
return {args, verbose};
8987
};
9088

91-
const buildReportExec = () => {
89+
const buildReportExec = async () => {
9290
const overrideCommit = core.getInput('override_commit');
9391
const slug = core.getInput('slug');
94-
const token = core.getInput('token');
95-
96-
9792
const reportCommand = 'create-report';
9893
const reportExecArgs = [];
9994

@@ -107,7 +102,7 @@ const buildReportExec = () => {
107102
GITHUB_HEAD_REF: process.env.GITHUB_HEAD_REF || '',
108103
});
109104

110-
105+
const token = await fetchToken();
111106
if (token) {
112107
reportOptions.env.CODECOV_TOKEN = token;
113108
}
@@ -126,7 +121,24 @@ const buildReportExec = () => {
126121
return {reportExecArgs, reportOptions, reportCommand};
127122
};
128123

129-
const buildUploadExec = () => {
124+
const fetchToken = async (): Promise<string> => {
125+
let token = core.getInput('token');
126+
const useOIDC = isTrue(core.getInput('use_oidc'));
127+
if (useOIDC) {
128+
let codecovURL = core.getInput('url');
129+
if (codecovURL === '') {
130+
codecovURL = 'https://codecov.io';
131+
}
132+
try {
133+
token = await core.getIDToken(codecovURL);
134+
} catch (error) {
135+
core.debug(`Got error while retrieving id token: ${error}`);
136+
}
137+
}
138+
return token;
139+
};
140+
141+
const buildUploadExec = async () => {
130142
const envVars = core.getInput('env_vars');
131143
const dryRun = isTrue(core.getInput('dry_run'));
132144
const failCi = isTrue(core.getInput('fail_ci_if_error'));
@@ -143,7 +155,6 @@ const buildUploadExec = () => {
143155
const rootDir = core.getInput('root_dir');
144156
const searchDir = core.getInput('directory');
145157
const slug = core.getInput('slug');
146-
const token = core.getInput('token');
147158
let uploaderVersion = core.getInput('version');
148159
const workingDir = core.getInput('working-directory');
149160
const plugin = core.getInput('plugin');
@@ -175,6 +186,8 @@ const buildUploadExec = () => {
175186
`${name}`,
176187
);
177188
}
189+
190+
const token = await fetchToken();
178191
if (token) {
179192
uploadOptions.env.CODECOV_TOKEN = token;
180193
}

src/index.ts

Lines changed: 94 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -23,98 +23,115 @@ import versionInfo from './version';
2323

2424
let failCi;
2525

26-
try {
27-
const {commitExecArgs, commitOptions, commitCommand} = buildCommitExec();
28-
const {reportExecArgs, reportOptions, reportCommand} = buildReportExec();
29-
const {
30-
uploadExecArgs,
31-
uploadOptions,
32-
failCi,
33-
os,
34-
uploaderVersion,
35-
uploadCommand,
36-
} = buildUploadExec();
37-
const {args, verbose} = buildGeneralExec();
26+
/**
27+
* Main function of the codecov-action
28+
*/
29+
async function run(): Promise<void> {
30+
try {
31+
const {
32+
commitExecArgs,
33+
commitOptions,
34+
commitCommand,
35+
} = await buildCommitExec();
36+
const {
37+
reportExecArgs,
38+
reportOptions,
39+
reportCommand,
40+
} = await buildReportExec();
41+
const {
42+
uploadExecArgs,
43+
uploadOptions,
44+
failCi,
45+
os,
46+
uploaderVersion,
47+
uploadCommand,
48+
} = await buildUploadExec();
49+
const {args, verbose} = buildGeneralExec();
3850

39-
const platform = getPlatform(os);
51+
const platform = getPlatform(os);
4052

41-
const filename = path.join( __dirname, getUploaderName(platform));
42-
https.get(getBaseUrl(platform, uploaderVersion), (res) => {
53+
const filename = path.join( __dirname, getUploaderName(platform));
54+
https.get(getBaseUrl(platform, uploaderVersion), (res) => {
4355
// Image will be stored at this path
44-
const filePath = fs.createWriteStream(filename);
45-
res.pipe(filePath);
46-
filePath
47-
.on('error', (err) => {
48-
setFailure(
49-
`Codecov: Failed to write uploader binary: ${err.message}`,
50-
true,
51-
);
52-
}).on('finish', async () => {
53-
filePath.close();
56+
const filePath = fs.createWriteStream(filename);
57+
res.pipe(filePath);
58+
filePath
59+
.on('error', (err) => {
60+
setFailure(
61+
`Codecov: Failed to write uploader binary: ${err.message}`,
62+
true,
63+
);
64+
}).on('finish', async () => {
65+
filePath.close();
5466

55-
await verify(filename, platform, uploaderVersion, verbose, failCi);
56-
await versionInfo(platform, uploaderVersion);
57-
await fs.chmodSync(filename, '777');
67+
await verify(filename, platform, uploaderVersion, verbose, failCi);
68+
await versionInfo(platform, uploaderVersion);
69+
await fs.chmodSync(filename, '777');
5870

59-
const unlink = () => {
60-
fs.unlink(filename, (err) => {
61-
if (err) {
62-
setFailure(
63-
`Codecov: Could not unlink uploader: ${err.message}`,
64-
failCi,
65-
);
66-
}
67-
});
68-
};
69-
const doUpload = async () => {
70-
await exec.exec(getCommand(filename, args, uploadCommand).join(' '),
71-
uploadExecArgs,
72-
uploadOptions)
73-
.catch((err) => {
71+
const unlink = () => {
72+
fs.unlink(filename, (err) => {
73+
if (err) {
7474
setFailure(
75-
`Codecov:
76-
Failed to properly upload report: ${err.message}`,
75+
`Codecov: Could not unlink uploader: ${err.message}`,
7776
failCi,
7877
);
79-
});
80-
};
81-
const createReport = async () => {
78+
}
79+
});
80+
};
81+
const doUpload = async () => {
82+
await exec.exec(
83+
getCommand(filename, args, uploadCommand).join(' '),
84+
uploadExecArgs,
85+
uploadOptions)
86+
.catch((err) => {
87+
setFailure(
88+
`Codecov:
89+
Failed to properly upload report: ${err.message}`,
90+
failCi,
91+
);
92+
});
93+
};
94+
const createReport = async () => {
95+
await exec.exec(
96+
getCommand(filename, args, reportCommand).join(' '),
97+
reportExecArgs,
98+
reportOptions)
99+
.then(async (exitCode) => {
100+
if (exitCode == 0) {
101+
await doUpload();
102+
}
103+
}).catch((err) => {
104+
setFailure(
105+
`Codecov:
106+
Failed to properly create report: ${err.message}`,
107+
failCi,
108+
);
109+
});
110+
};
82111
await exec.exec(
83-
getCommand(filename, args, reportCommand).join(' '),
84-
reportExecArgs,
85-
reportOptions)
112+
getCommand(
113+
filename,
114+
args,
115+
commitCommand,
116+
).join(' '),
117+
commitExecArgs, commitOptions)
86118
.then(async (exitCode) => {
87119
if (exitCode == 0) {
88-
await doUpload();
120+
await createReport();
89121
}
122+
unlink();
90123
}).catch((err) => {
91124
setFailure(
92-
`Codecov:
93-
Failed to properly create report: ${err.message}`,
125+
`Codecov: Failed to properly create commit:
126+
${err.message}`,
94127
failCi,
95128
);
96129
});
97-
};
98-
await exec.exec(
99-
getCommand(
100-
filename,
101-
args,
102-
commitCommand,
103-
).join(' '),
104-
commitExecArgs, commitOptions)
105-
.then(async (exitCode) => {
106-
if (exitCode == 0) {
107-
await createReport();
108-
}
109-
unlink();
110-
}).catch((err) => {
111-
setFailure(
112-
`Codecov: Failed to properly create commit: ${err.message}`,
113-
failCi,
114-
);
115-
});
116-
});
117-
});
118-
} catch (err) {
119-
setFailure(`Codecov: Encountered an unexpected error ${err.message}`, failCi);
130+
});
131+
});
132+
} catch (err) {
133+
setFailure(`Codecov: Encountered an unexpected error ${err.message}`,
134+
failCi);
135+
}
120136
}
137+
run();

src/version.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ const versionInfo = async (
66
version?: string,
77
): Promise<void> => {
88
if (version) {
9-
core.info(`==> Running version ${version}`);
9+
core.info(`==> Using override version ${version}`);
1010
}
1111

1212
try {
13-
const metadataRes = await fetch.default( `https://uploader.codecov.io/${platform}/latest`, {
13+
const metadataRes = await fetch.default( `https://uploader.codecov.io/${platform}/${version}`, {
1414
headers: {'Accept': 'application/json'},
1515
});
1616
const metadata = await metadataRes.json();
1717
core.info(`==> Running version ${metadata['version']}`);
1818
} catch (err) {
19-
core.info(`Could not pull latest version information: ${err}`);
19+
core.info(`Could not pull ${version} version information: ${err}`);
2020
}
2121
};
2222
export default versionInfo;

0 commit comments

Comments
 (0)