Skip to content

Commit 7102f98

Browse files
authored
Merge pull request #1503 from philips-labs/develop
release
2 parents d6e3d7d + 83bb07b commit 7102f98

File tree

14 files changed

+578
-546
lines changed

14 files changed

+578
-546
lines changed

.github/workflows/lambda-runner-binaries-syncer.yml

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
name: Lambda Syncer
2-
env:
3-
lambda_name: runner-binaries-syncer
4-
lambda_path: modules/runner-binaries-syncer/lambdas/runner-binaries-syncer
52
on:
63
push:
74
branches:
@@ -17,7 +14,8 @@ jobs:
1714
container: node:14
1815
defaults:
1916
run:
20-
working-directory: ${{ env.lambda_path }}
17+
working-directory: modules/runner-binaries-syncer/lambdas/runner-binaries-syncer
18+
2119
steps:
2220
- uses: actions/checkout@v2
2321
- name: Install dependencies

examples/ubuntu/templates/user-data.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ echo export PATH=/home/$USER_NAME/bin:$PATH >>/home/$USER_NAME/.profile
5959
loginctl enable-linger $USER_NAME
6060
su -l $USER_NAME -c "systemctl --user enable docker"
6161

62-
${install_config_runner}
62+
${install_runner}
6363

6464
# config runner for rootless docker
6565
cd /home/$USER_NAME/actions-runner/
@@ -68,4 +68,4 @@ echo PATH=/home/$USER_NAME/bin:$PATH >>.env
6868

6969
${post_install}
7070

71-
./svc.sh start
71+
${start_runner}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
module.exports = {
22
preset: 'ts-jest',
33
testEnvironment: 'node',
4+
collectCoverage: true,
5+
collectCoverageFrom: ['src/**/*.{ts,js,jsx}', '!src/**/*local*.ts'],
6+
coverageThreshold: {
7+
global: {
8+
branches: 80,
9+
functions: 80,
10+
lines: 80,
11+
statements: 80
12+
}
13+
}
414
};

modules/runner-binaries-syncer/lambdas/runner-binaries-syncer/package.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,18 @@
2121
"@types/request": "^2.48.4",
2222
"@typescript-eslint/eslint-plugin": "^4.33.0",
2323
"@typescript-eslint/parser": "^4.33.0",
24-
"@vercel/ncc": "^0.32.0",
25-
"aws-sdk": "^2.1040.0",
24+
"@vercel/ncc": "^0.33.0",
25+
"aws-sdk": "^2.1044.0",
2626
"eslint": "^7.32.0",
2727
"eslint-plugin-prettier": "4.0.0",
2828
"jest": "^27.4.3",
29-
"prettier": "2.5.0",
30-
"ts-jest": "^27.0.7",
29+
"prettier": "2.5.1",
30+
"ts-jest": "^27.1.0",
3131
"ts-node-dev": "^1.1.6",
3232
"typescript": "^4.5.2"
3333
},
3434
"dependencies": {
35-
"tslog": "^3.3.0",
36-
"axios": "^0.24.0"
35+
"axios": "^0.24.0",
36+
"tslog": "^3.3.0"
3737
}
3838
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { sync } from './syncer/syncer';
2+
import { handler } from './lambda';
3+
import { mocked } from 'ts-jest/utils';
4+
5+
jest.mock('./syncer/syncer');
6+
7+
describe('Test download sync wrapper.', () => {
8+
it('Test successful download.', async () => {
9+
const mock = mocked(sync);
10+
mock.mockImplementation(() => {
11+
return new Promise((resolve) => {
12+
resolve();
13+
});
14+
});
15+
await expect(handler({}, {})).resolves;
16+
});
17+
18+
it('Test wrapper with returning an error. ', async () => {
19+
const mock = mocked(sync);
20+
mock.mockRejectedValue(new Error(''));
21+
22+
await expect(handler({}, {})).resolves;
23+
});
24+
});
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { handle } from './syncer/handler';
1+
import { sync } from './syncer/syncer';
22
import { logger } from './syncer/logger';
33

44
// eslint-disable-next-line
5-
export const handler = async (event: any, context: any, callback: any): Promise<void> => {
5+
export async function handler(event: any, context: any): Promise<void> {
66
logger.setSettings({ requestId: context.awsRequestId });
77
logger.debug(JSON.stringify(event));
8+
89
try {
9-
await handle();
10-
callback(null);
10+
await sync();
1111
} catch (e) {
12-
callback(e);
12+
logger.warn('Ignoring error:', e);
1313
}
14-
};
14+
}

modules/runner-binaries-syncer/lambdas/runner-binaries-syncer/src/local.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { handle } from './syncer/handler';
1+
import { sync } from './syncer/syncer';
22

3-
handle()
3+
sync()
44
.then()
55
.catch((e) => {
66
console.log(e);

modules/runner-binaries-syncer/lambdas/runner-binaries-syncer/src/syncer/handler.test.ts renamed to modules/runner-binaries-syncer/lambdas/runner-binaries-syncer/src/syncer/syncer.test.ts

+37-17
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import { handle } from './handler';
1+
import { sync } from './syncer';
22
import listReleases from '../../test/resources/github-list-releases.json';
33
import listReleasesEmpty from '../../test/resources/github-list-releases-empty-assets.json';
44
import listReleasesNoLinux from '../../test/resources/github-list-releases-no-linux.json';
55
import listReleasesNoArm64 from '../../test/resources/github-list-releases-no-arm64.json';
6+
import { S3 } from 'aws-sdk';
7+
import axios from 'axios';
8+
import { request } from 'http';
9+
import { EventEmitter, PassThrough, Readable } from 'stream';
610

711
const mockOctokit = {
812
repos: {
@@ -13,9 +17,23 @@ jest.mock('@octokit/rest', () => ({
1317
Octokit: jest.fn().mockImplementation(() => mockOctokit),
1418
}));
1519

20+
// mock stream for Axios
21+
const mockResponse = `{"data": 123}`;
22+
const mockStream = new PassThrough();
23+
mockStream.push(mockResponse);
24+
mockStream.end();
25+
26+
jest.mock('axios');
27+
const mockedAxios = axios as jest.Mocked<typeof axios>;
28+
mockedAxios.request.mockResolvedValue({
29+
data: mockStream,
30+
});
31+
1632
const mockS3 = {
1733
getObjectTagging: jest.fn(),
18-
upload: jest.fn(),
34+
upload: jest.fn().mockImplementation(() => {
35+
return { promise: jest.fn(() => Promise.resolve()) };
36+
}),
1937
};
2038
jest.mock('aws-sdk', () => ({
2139
S3: jest.fn().mockImplementation(() => mockS3),
@@ -27,6 +45,8 @@ beforeEach(() => {
2745
jest.clearAllMocks();
2846
});
2947

48+
jest.setTimeout(60 * 1000);
49+
3050
describe('Synchronize action distribution.', () => {
3151
beforeEach(() => {
3252
process.env.S3_BUCKET_NAME = bucketName;
@@ -47,7 +67,7 @@ describe('Synchronize action distribution.', () => {
4767
};
4868
});
4969

50-
await handle();
70+
await sync();
5171
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
5272
expect(mockS3.getObjectTagging).toBeCalledWith({
5373
Bucket: bucketName,
@@ -71,7 +91,7 @@ describe('Synchronize action distribution.', () => {
7191
};
7292
});
7393

74-
await handle();
94+
await sync();
7595
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
7696
expect(mockS3.getObjectTagging).toBeCalledWith({
7797
Bucket: bucketName,
@@ -90,7 +110,7 @@ describe('Synchronize action distribution.', () => {
90110
};
91111
});
92112

93-
await handle();
113+
await sync();
94114
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
95115
expect(mockS3.getObjectTagging).toBeCalledWith({
96116
Bucket: bucketName,
@@ -108,7 +128,7 @@ describe('Synchronize action distribution.', () => {
108128
};
109129
});
110130

111-
await handle();
131+
await sync();
112132
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
113133
expect(mockS3.getObjectTagging).toBeCalledWith({
114134
Bucket: bucketName,
@@ -134,7 +154,7 @@ describe('Synchronize action distribution.', () => {
134154
};
135155
});
136156

137-
await handle();
157+
await sync();
138158
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
139159
expect(mockS3.getObjectTagging).toBeCalledWith({
140160
Bucket: bucketName,
@@ -155,7 +175,7 @@ describe('Synchronize action distribution.', () => {
155175
};
156176
});
157177

158-
await handle();
178+
await sync();
159179
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
160180
expect(mockS3.getObjectTagging).toBeCalledWith({
161181
Bucket: bucketName,
@@ -183,7 +203,7 @@ describe('Synchronize action distribution.', () => {
183203
};
184204
});
185205

186-
await handle();
206+
await sync();
187207
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
188208
expect(mockS3.getObjectTagging).toBeCalledWith({
189209
Bucket: bucketName,
@@ -203,7 +223,7 @@ describe('Synchronize action distribution.', () => {
203223
};
204224
});
205225

206-
await handle();
226+
await sync();
207227
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
208228
expect(mockS3.getObjectTagging).toBeCalledWith({
209229
Bucket: bucketName,
@@ -221,7 +241,7 @@ describe('Synchronize action distribution.', () => {
221241
};
222242
});
223243

224-
await handle();
244+
await sync();
225245
expect(mockOctokit.repos.listReleases).toBeCalledTimes(1);
226246
expect(mockS3.getObjectTagging).toBeCalledWith({
227247
Bucket: bucketName,
@@ -243,15 +263,15 @@ describe('No release assets found.', () => {
243263
data: listReleasesEmpty,
244264
}));
245265

246-
await expect(handle()).rejects.toThrow(errorMessage);
266+
await expect(sync()).rejects.toThrow(errorMessage);
247267
});
248268

249269
it('No linux x64 asset.', async () => {
250270
mockOctokit.repos.listReleases.mockImplementation(() => ({
251271
data: [listReleasesNoLinux],
252272
}));
253273

254-
await expect(handle()).rejects.toThrow(errorMessage);
274+
await expect(sync()).rejects.toThrow(errorMessage);
255275
});
256276
});
257277

@@ -260,17 +280,17 @@ describe('Invalid config', () => {
260280
it('No bucket and object key.', async () => {
261281
delete process.env.S3_OBJECT_KEY;
262282
delete process.env.S3_BUCKET_NAME;
263-
await expect(handle()).rejects.toThrow(errorMessage);
283+
await expect(sync()).rejects.toThrow(errorMessage);
264284
});
265285
it('No bucket.', async () => {
266286
delete process.env.S3_BUCKET_NAME;
267287
process.env.S3_OBJECT_KEY = bucketObjectKey;
268-
await expect(handle()).rejects.toThrow(errorMessage);
288+
await expect(sync()).rejects.toThrow(errorMessage);
269289
});
270290
it('No object key.', async () => {
271291
delete process.env.S3_OBJECT_KEY;
272292
process.env.S3_BUCKET_NAME = bucketName;
273-
await expect(handle()).rejects.toThrow(errorMessage);
293+
await expect(sync()).rejects.toThrow(errorMessage);
274294
});
275295
});
276296

@@ -287,6 +307,6 @@ describe('Synchronize action distribution for arm64.', () => {
287307
data: [listReleasesNoArm64],
288308
}));
289309

290-
await expect(handle()).rejects.toThrow(errorMessage);
310+
await expect(sync()).rejects.toThrow(errorMessage);
291311
});
292312
});

modules/runner-binaries-syncer/lambdas/runner-binaries-syncer/src/syncer/handler.ts renamed to modules/runner-binaries-syncer/lambdas/runner-binaries-syncer/src/syncer/syncer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ async function uploadToS3(s3: S3, cacheObject: CacheObject, actionRunnerReleaseA
103103
});
104104
}
105105

106-
export const handle = async (): Promise<void> => {
106+
export async function sync(): Promise<void> {
107107
const s3 = new AWS.S3();
108108

109109
const runnerArch = process.env.GITHUB_RUNNER_ARCHITECTURE || 'x64';
@@ -125,8 +125,8 @@ export const handle = async (): Promise<void> => {
125125
const currentVersion = await getCachedVersion(s3, cacheObject);
126126
logger.debug('latest: ' + currentVersion);
127127
if (currentVersion === undefined || currentVersion != actionRunnerReleaseAsset.name) {
128-
uploadToS3(s3, cacheObject, actionRunnerReleaseAsset);
128+
await uploadToS3(s3, cacheObject, actionRunnerReleaseAsset);
129129
} else {
130130
logger.debug('Distribution is up-to-date, no action.');
131131
}
132-
};
132+
}

0 commit comments

Comments
 (0)