Compare commits

...

85 Commits
v1.2.0 ... v1

Author SHA1 Message Date
Alif Rachmawadi
4389e6cbc6 re-use new releases assets url path
Some checks failed
Main workflow / Run (ubuntu-latest) (push) Failing after 33s
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (windows-latest) (push) Has been cancelled
2021-06-14 02:47:16 +00:00
Alif Rachmawadi
a471b152dc Merge pull request #97 from subosito/dependabot/npm_and_yarn/ws-7.4.6
Some checks failed
Main workflow / Run (ubuntu-latest) (push) Failing after 10m41s
Main workflow / Run (macos-latest) (push) Failing after 4s
Main workflow / Run (windows-latest) (push) Has been cancelled
Bump ws from 7.4.5 to 7.4.6
2021-06-11 15:33:35 +07:00
dependabot[bot]
56a652e69d Bump ws from 7.4.5 to 7.4.6
Bumps [ws](https://github.com/websockets/ws) from 7.4.5 to 7.4.6.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.4.5...7.4.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-11 08:20:48 +00:00
Alif Rachmawadi
8e1e9c4d87 update dist 2021-06-11 08:19:02 +00:00
Alif Rachmawadi
017da32f19 update dependencies 2021-06-11 08:18:38 +00:00
Alif Rachmawadi
cb226e935b Back to original path of release assets 2021-06-11 08:13:00 +00:00
Alif Rachmawadi
5188e41281 Merge pull request #100 from chatsen/master
Some checks failed
Main workflow / Run (ubuntu-latest) (push) Failing after 16m22s
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (windows-latest) (push) Has been cancelled
Fix the endpoint for flutter releases
2021-06-02 10:48:10 +07:00
William Bulin
1ced41a989 Update index.js 2021-06-02 01:38:26 +02:00
William Bulin
4ac301c302 Update release.ts 2021-06-02 01:36:53 +02:00
Alif Rachmawadi
0600af6a5c Merge pull request #93 from subosito/dependabot/npm_and_yarn/hosted-git-info-2.8.9
Bump hosted-git-info from 2.7.1 to 2.8.9
2021-05-15 14:04:20 +07:00
dependabot[bot]
1c63d3b831 Bump hosted-git-info from 2.7.1 to 2.8.9
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.7.1 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.7.1...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 01:25:41 +00:00
Alif Rachmawadi
086f9fb649 Merge pull request #90 from kuhnroyal/feature/pub-cache
Export PUB_CACHE if it is not in env
2021-05-01 08:31:38 +07:00
Peter Leibiger
8f6ad7c383 Export PUB_CACHE if it is not in env
Export `PUB_CACHE` if it is not configured before calling the action.
This ensures that flutter and dart use the same cache.
It also enables other tools to use this official Dart env variable.
2021-04-28 20:43:14 +02:00
Alif Rachmawadi
13141e86c3 update readme
Some checks failed
Main workflow / Run (ubuntu-latest) (push) Failing after 10m31s
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (windows-latest) (push) Has been cancelled
2021-04-26 14:56:05 +00:00
Alif Rachmawadi
41992c08db adjust windows example 2021-04-26 14:49:19 +00:00
Alif Rachmawadi
d94ad8f4a5 Merge pull request #68 from majudhu/patch-1
add example to build for windows
2021-04-26 21:47:15 +07:00
Alif Rachmawadi
7bb7a2ead1 pin prettier 2021-04-26 14:35:27 +00:00
Alif Rachmawadi
08d7837173 update dist 2021-04-26 14:31:40 +00:00
Alif Rachmawadi
cb118effe2 update dependencies 2021-04-26 14:30:05 +00:00
Alif Rachmawadi
8c0828b9c2 update readme 2021-04-26 14:24:54 +00:00
Alif Rachmawadi
30d8b6aed2 update tests 2021-04-26 14:24:40 +00:00
Alif Rachmawadi
e7b018ff3a Merge pull request #83 from subosito/dependabot/npm_and_yarn/y18n-4.0.1
Bump y18n from 4.0.0 to 4.0.1
2021-04-02 20:14:32 +07:00
dependabot[bot]
267db14c3d Bump y18n from 4.0.0 to 4.0.1
Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/yargs/y18n/releases)
- [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/y18n/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-30 22:16:18 +00:00
Alif Rachmawadi
123325ea84 Merge pull request #79 from jpnurmi/pub-cache-path
Add .pub-cache/bin to PATH
2021-03-07 19:03:55 +07:00
J-P Nurmi
06a5370154 Add .pub-cache/bin to PATH 2021-03-05 18:29:25 +01:00
Alif Rachmawadi
5781588262 Merge pull request #71 from subosito/dependabot/npm_and_yarn/node-notifier-8.0.1
Bump node-notifier from 8.0.0 to 8.0.1
2021-01-07 09:38:37 +07:00
dependabot[bot]
2d5af0bae8 Bump node-notifier from 8.0.0 to 8.0.1
Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) from 8.0.0 to 8.0.1.
- [Release notes](https://github.com/mikaelbr/node-notifier/releases)
- [Changelog](https://github.com/mikaelbr/node-notifier/blob/v8.0.1/CHANGELOG.md)
- [Commits](https://github.com/mikaelbr/node-notifier/compare/v8.0.0...v8.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-22 08:02:28 +00:00
Alif Rachmawadi
d2a92405ab update examples 2020-12-01 15:49:09 +00:00
Alif Rachmawadi
c1329a99f0 fix test 2020-12-01 15:44:22 +00:00
Alif Rachmawadi
618ffe6e1a Merge pull request #67 from dmitry-shibanov/add-any-channel
Add any channel
2020-12-01 22:08:51 +07:00
Majudhu
1b4d6c711f add example to build for windows
add example script which will build a windows executable and also upload it to action artifacts
2020-11-25 14:07:49 +05:00
Dmitry Shibanov
2ed9c88ae0 build project 2020-11-23 16:13:25 +03:00
Dmitry Shibanov
d8b5280c4b add any channel 2020-11-23 16:11:57 +03:00
Alif Rachmawadi
8ffad233a0 Merge pull request #66 from sidrao2006/patch-1
Use FLUTTER_ROOT instead of FLUTTER_HOME
2020-11-21 05:57:49 +07:00
Aneesh Rao
2dc29df57b Use FLUTTER_ROOT instead of FLUTTER_HOME 2020-11-19 20:31:28 +05:30
Alif Rachmawadi
d141f1640a Merge pull request #64 from cclauss/patch-1
README.md: actions/checkout@v2
2020-10-20 20:03:42 +07:00
Christian Clauss
c4e0544d9c fixup! Fix typo 2020-10-20 14:50:34 +02:00
Christian Clauss
2ff7205390 README.md: actions/checkout@v2 2020-10-14 12:50:28 +02:00
Alif Rachmawadi
4a44bbb8a6 update dist 2020-10-08 04:42:13 +00:00
Alif Rachmawadi
d7578c4eec add support for master channel 2020-10-08 04:36:23 +00:00
Alif Rachmawadi
26bf50084a update test platform map
Some checks failed
Main workflow / Run (ubuntu-latest) (push) Failing after 16m21s
Main workflow / Run (macos-latest) (push) Failing after 2s
Main workflow / Run (windows-latest) (push) Has been cancelled
2020-10-08 01:36:34 +00:00
Alif Rachmawadi
45483e4c19 increase test timeout 2020-10-08 01:32:27 +00:00
Alif Rachmawadi
6f4d1ee832 use exact prettier 2020-10-08 01:26:57 +00:00
Alif Rachmawadi
58a4d54c5d update dist 2020-10-08 01:24:34 +00:00
Alif Rachmawadi
d0e7441034 update installer 2020-10-08 01:22:27 +00:00
Alif Rachmawadi
c7c0640db8 add release version check function 2020-10-08 01:22:02 +00:00
Alif Rachmawadi
1aaec8dd0f update dependencies 2020-10-08 01:20:47 +00:00
Alif Rachmawadi
ddb7b913ca update test data 2020-10-08 01:19:56 +00:00
Alif Rachmawadi
0b6cdde020 Merge pull request #60 from subosito/dependabot/npm_and_yarn/actions/core-1.2.6
Bump @actions/core from 1.2.4 to 1.2.6
2020-10-07 19:26:56 +07:00
dependabot[bot]
8078702ac6 Bump @actions/core from 1.2.4 to 1.2.6
Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.2.4 to 1.2.6.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-01 17:17:20 +00:00
Alif Rachmawadi
282b38c3d9 Merge pull request #30 from AlessioLuciani/master
Add iOS and Android app bundle builds
2020-08-14 10:12:00 +07:00
Alif Rachmawadi
12d5ce54d2 Merge pull request #53 from subosito/dependabot/npm_and_yarn/lodash-4.17.19
Bump lodash from 4.17.15 to 4.17.19
2020-07-22 17:03:20 +07:00
dependabot[bot]
d00139d608 Bump lodash from 4.17.15 to 4.17.19
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-18 00:09:06 +00:00
Alessio Luciani
5d4e01ab3b Add build instructions for the web 2020-06-19 16:13:08 +02:00
Alif Rachmawadi
40bc2f6940 bump version
Some checks failed
Main workflow / Run (ubuntu-latest) (push) Failing after 39m38s
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (windows-latest) (push) Has been cancelled
2020-05-09 11:03:06 +07:00
Alif Rachmawadi
f0d790518f update dist 2020-05-09 10:37:01 +07:00
Alif Rachmawadi
c4a41752bd update dependencies 2020-05-09 10:36:22 +07:00
Alif Rachmawadi
929035d687 update test 2020-05-09 10:17:16 +07:00
Alif Rachmawadi
4bb529986f use channel for latest release 2020-05-09 09:46:10 +07:00
Alif Rachmawadi
ecb8eabe6f update tests 2020-05-09 09:43:40 +07:00
Alif Rachmawadi
cf426f9aa2 update release manifest 2020-05-09 09:43:05 +07:00
Alif Rachmawadi
794e42ad48 bump version: 1.3.1
Some checks failed
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (ubuntu-latest) (push) Failing after 19m55s
Main workflow / Run (windows-latest) (push) Has been cancelled
2020-04-30 09:48:20 +07:00
Alif Rachmawadi
2dd537cc3f update dist 2020-04-30 09:47:38 +07:00
Alif Rachmawadi
3ba093556e Merge pull request #36 from subosito/dependabot/npm_and_yarn/actions/http-client-1.0.8
Bump @actions/http-client from 1.0.7 to 1.0.8
2020-04-30 09:45:20 +07:00
dependabot[bot]
9cde868c41 Bump @actions/http-client from 1.0.7 to 1.0.8
Bumps [@actions/http-client](https://github.com/actions/http-client) from 1.0.7 to 1.0.8.
- [Release notes](https://github.com/actions/http-client/releases)
- [Changelog](https://github.com/actions/http-client/blob/master/RELEASES.md)
- [Commits](https://github.com/actions/http-client/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-04-29 18:01:31 +00:00
Alif Rachmawadi
c1bf65eb31 add dart usage example
Some checks failed
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (ubuntu-latest) (push) Failing after 33s
Main workflow / Run (windows-latest) (push) Has been cancelled
2020-04-14 02:34:44 +00:00
Alif Rachmawadi
cfb544479d use previous prettier 2020-04-14 02:31:17 +00:00
Alif Rachmawadi
c256877acc bump version 2020-04-14 02:20:56 +00:00
Alif Rachmawadi
5c02dc7f05 update dist 2020-04-14 02:19:57 +00:00
Alif Rachmawadi
4d34db08ae update dependencies 2020-04-14 02:19:33 +00:00
Alif Rachmawadi
b4d02d2183 update test duration 2020-04-14 02:05:13 +00:00
Alif Rachmawadi
713f696c59 update test 2020-04-14 01:47:20 +00:00
Alif Rachmawadi
c8f591812e update dist 2020-04-14 01:17:42 +00:00
Alif Rachmawadi
f7a5d4550a handle new release format 2020-04-14 01:14:56 +00:00
Alif Rachmawadi
19074769c8 add test for new release format 2020-04-14 01:14:55 +00:00
Alif Rachmawadi
1b5073106b update releases data 2020-04-14 01:14:55 +00:00
Alif Rachmawadi
a8119581ff npm audit fix 2020-04-14 01:14:54 +00:00
Alif Rachmawadi
0ee5f96289 Merge pull request #33 from tianhaoz95/patch-2
might be interesting to add dart SDK to path
2020-04-14 07:57:34 +07:00
Tianhao Zhou
9d3762c82e fix: use join to comply with other os 2020-04-13 14:41:49 -07:00
Tianhao Zhou
6ebddd1b83 fix: add the missing bin directory in dart sdk 2020-04-11 18:23:34 -07:00
Tianhao Zhou
a79364fc11 dev: add dart sdk to path
Adding Flutter bin to the path doesn't expose the dart SDK which many people might be interested in using. For example, dartdoc for documentation generation.
2020-04-11 18:10:01 -07:00
Alessio Luciani
a81c830097 Add iOS and Android app bundle builds
Solving issue https://github.com/subosito/flutter-action/issues/7 .
2020-04-09 14:40:15 +02:00
Alif Rachmawadi
f4209dc839 force minimist resolution 2020-03-17 09:38:25 +07:00
Alif Rachmawadi
cf2fb6cf42 update depedencies 2020-03-17 09:06:14 +07:00
Alif Rachmawadi
8828996b00 fix acorn vulnerabilities 2020-03-17 09:00:22 +07:00
12 changed files with 13438 additions and 5313 deletions

104
README.md
View File

@@ -6,29 +6,28 @@ This action sets up a flutter environment for use in actions. It works on Linux,
```yaml
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '12.x'
- uses: subosito/flutter-action@v1
with:
flutter-version: '1.9.1+hotfix.6'
flutter-version: '2.0.5'
- run: flutter pub get
- run: flutter test
- run: flutter build apk
```
Use latest release for particular channel:
```yaml
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '12.x'
- uses: subosito/flutter-action@v1
with:
channel: 'stable' # or: 'dev' or 'beta'
channel: 'stable' # or: 'beta', 'dev' or 'master'
- run: flutter pub get
- run: flutter test
- run: flutter build apk
@@ -38,17 +37,96 @@ Use latest release for particular version and/or channel:
```yaml
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '12.x'
- uses: subosito/flutter-action@v1
with:
flutter-version: '1.12.x' # you can use 1.12
channel: 'dev' # optional, default to: 'stable'
flutter-version: '1.22.x' # or, you can use 1.22
channel: 'dev'
- run: flutter pub get
- run: flutter test
```
Use particular version on any channel:
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '12.x'
- uses: subosito/flutter-action@v1
with:
flutter-version: '2.x'
channel: 'any'
- run: flutter pub get
- run: flutter test
```
Build Android APK and app bundle:
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '12.x'
- uses: subosito/flutter-action@v1
with:
flutter-version: '2.0.5'
- run: flutter pub get
- run: flutter test
- run: flutter build apk
- run: flutter build appbundle
```
Build for iOS too (macOS only):
```yaml
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '12.x'
- uses: subosito/flutter-action@v1
with:
flutter-version: '2.0.5'
- run: flutter pub get
- run: flutter test
- run: flutter build apk
- run: flutter build ios --release --no-codesign
```
Build for the web:
```yaml
steps:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v1
with:
flutter-version: '2.0.5'
- run: flutter pub get
- run: flutter test
- run: flutter build web
```
Build for Windows:
```yaml
windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v1
with:
channel: beta
- run: flutter config --enable-windows-desktop
- run: flutter build windows
```
Matrix Testing:
@@ -62,16 +140,14 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '12.x'
- uses: subosito/flutter-action@v1
with:
flutter-version: '1.11.0'
flutter-version: '1.20.2'
channel: 'beta'
- run: flutter pub get
- run: flutter test
- run: flutter build apk
- run: dart --version
- run: flutter --version
```

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,5 @@
import io = require('@actions/io');
import exec = require('@actions/exec');
import fs = require('fs');
import path = require('path');
import nock = require('nock');
@@ -11,91 +12,57 @@ process.env['RUNNER_TOOL_CACHE'] = toolDir;
process.env['RUNNER_TEMP'] = tempDir;
import * as installer from '../src/installer';
function osName(): string {
switch (process.platform) {
case 'win32':
return 'windows';
case 'darwin':
return 'macos';
default:
return process.platform;
}
}
import * as release from '../src/release';
describe('installer tests', () => {
beforeAll(async () => {
await io.rmRF(toolDir);
await io.rmRF(tempDir);
}, 300000);
}, 100000);
afterAll(async () => {
try {
await io.rmRF(toolDir);
await io.rmRF(tempDir);
} catch {
console.log('Failed to remove test directories');
}
beforeEach(() => {
const platform = release.getPlatform();
nock('https://storage.googleapis.com', {allowUnmocked: true})
.get(`/flutter_infra_release/releases/releases_${platform}.json`)
.replyWithFile(200, path.join(dataDir, `releases_${platform}.json`));
});
afterEach(async () => {
nock.cleanAll();
nock.enableNetConnect();
await io.rmRF(toolDir);
await io.rmRF(tempDir);
}, 100000);
it('Downloads flutter', async () => {
await installer.getFlutter('1.0.0', 'stable');
const sdkDir = path.join(toolDir, 'flutter', '1.0.0-stable', 'x64');
await installer.getFlutter('2.0.0', 'stable');
const sdkDir = path.join(toolDir, 'flutter', '2.0.0-stable', 'x64');
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 100000);
}, 300000);
it('Downloads flutter from beta channel', async () => {
await installer.getFlutter('1.8.3', 'beta');
const sdkDir = path.join(toolDir, 'flutter', '1.8.3-beta', 'x64');
it('Downloads flutter from master channel', async () => {
await installer.getFlutter('', 'master');
const sdkDir = path.join(toolDir, 'flutter', 'master', 'x64');
let stdout = '';
const options = {
listeners: {
stdout: (data: Buffer) => {
stdout += data.toString();
}
}
};
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 100000);
describe('get the latest release of a flutter version', () => {
beforeEach(() => {
const platform = osName();
nock('https://storage.googleapis.com', {allowUnmocked: true})
.get(`/flutter_infra/releases/releases_${platform}.json`)
.replyWithFile(200, path.join(dataDir, `releases_${platform}.json`));
});
afterEach(() => {
nock.cleanAll();
nock.enableNetConnect();
});
it('Downloads latest flutter release from stable channel', async () => {
await installer.getFlutter('', 'stable');
const sdkDir = path.join(
toolDir,
'flutter',
'1.7.8-hotfix.4-stable',
'x64'
);
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 200000);
it('Downloads latest flutter release of 1.7 when using version 1.7 from dev channel', async () => {
await installer.getFlutter('1.7', 'dev');
const sdkDir = path.join(toolDir, 'flutter', '1.7.11-dev', 'x64');
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 200000);
it('Downloads latest flutter release of 1.7 when using version 1.7.x from dev channel', async () => {
await installer.getFlutter('1.7.x', 'dev');
const sdkDir = path.join(toolDir, 'flutter', '1.7.11-dev', 'x64');
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 200000);
});
await exec.exec(path.join(sdkDir, 'bin', 'flutter'), ['channel'], options);
expect(stdout).toContain('* master');
}, 300000);
it('Throws if no location contains correct flutter version', async () => {
let thrown = false;

145
__tests__/release.test.ts Normal file
View File

@@ -0,0 +1,145 @@
import fs = require('fs');
import path = require('path');
import nock = require('nock');
import * as release from '../src/release';
const platform = release.getPlatform();
describe('release tests', () => {
it('getPlatform', () => {
const platformMap: {[index: string]: string} = {
linux: 'linux',
darwin: 'macos',
win32: 'windows'
};
expect(platform).toEqual(platformMap[process.platform]);
});
describe('determineVersion', () => {
beforeEach(() => {
const dataDir = path.join(__dirname, 'data');
nock('https://storage.googleapis.com', {allowUnmocked: true})
.get(`/flutter_infra_release/releases/releases_${platform}.json`)
.replyWithFile(200, path.join(dataDir, `releases_${platform}.json`));
});
afterEach(() => {
nock.cleanAll();
nock.enableNetConnect();
});
it('channel: "stable", version: ""', async () => {
const result = await release.determineVersion('', 'stable', platform);
expect(result.version).toEqual('2.0.5');
expect(result.rawVersion).toEqual('2.0.5');
expect(result.downloadUrl).toContain('2.0.5');
});
it('channel: "beta", version: ""', async () => {
const result = await release.determineVersion('', 'beta', platform);
expect(result.version).toEqual('2.2.0-10.1.pre');
expect(result.rawVersion).toEqual('2.2.0-10.1.pre');
expect(result.downloadUrl).toContain('2.2.0-10.1.pre');
});
it('channel: "dev", version: ""', async () => {
const result = await release.determineVersion('', 'dev', platform);
expect(result.version).toEqual('2.2.0-10.1.pre');
expect(result.rawVersion).toEqual('2.2.0-10.1.pre');
expect(result.downloadUrl).toContain('2.2.0-10.1.pre');
});
it('channel: "dev", version: "1.17.x"', async () => {
const result = await release.determineVersion('1.17.x', 'dev', platform);
expect(result.version).toEqual('1.17.0-dev.5.0');
expect(result.rawVersion).toEqual('1.17.0-dev.5.0');
expect(result.downloadUrl).toContain('1.17.0-dev.5.0');
});
it('channel: "dev", version: "1.17"', async () => {
const result = await release.determineVersion('1.17', 'dev', platform);
expect(result.version).toEqual('1.17.0-dev.5.0');
expect(result.rawVersion).toEqual('1.17.0-dev.5.0');
expect(result.downloadUrl).toContain('1.17.0-dev.5.0');
});
it('channel: "dev", version: "1.7.x" (old format)', async () => {
const result = await release.determineVersion('1.7.x', 'dev', platform);
expect(result.version).toEqual('1.7.11');
expect(result.rawVersion).toEqual('v1.7.11');
expect(result.downloadUrl).toContain('v1.7.11');
});
it('channel: "dev", version: "1.7" (old format)', async () => {
const result = await release.determineVersion('1.7', 'dev', platform);
expect(result.version).toEqual('1.7.11');
expect(result.rawVersion).toEqual('v1.7.11');
expect(result.downloadUrl).toContain('v1.7.11');
});
it('channel: "dev", version: "0.12.x" (unknown)', async () => {
try {
await release.determineVersion('0.12.x', 'dev', platform);
} catch (e) {
expect(e.message).toEqual('unable to find release for 0.12.x');
}
});
it('channel: "dev", version: "0.12" (unknown)', async () => {
try {
await release.determineVersion('0.12', 'dev', platform);
} catch (e) {
expect(e.message).toEqual('unable to find release for 0.12');
}
});
it('channel: "dev", version: "1.17.0-dev.5.0"', async () => {
const result = await release.determineVersion(
'1.17.0-dev.5.0',
'dev',
platform
);
expect(result.version).toEqual('1.17.0-dev.5.0');
expect(result.rawVersion).toEqual('1.17.0-dev.5.0');
expect(result.downloadUrl).toContain('1.17.0-dev.5.0');
});
it('channel: "any", version: "1.17.x"', async () => {
const result = await release.determineVersion('1.17.x', 'any', platform);
expect(result.version).toEqual('1.17.5');
expect(result.rawVersion).toEqual('1.17.5');
expect(result.downloadUrl).toContain('1.17.5');
});
it('channel: "any", version: "1.19.x"', async () => {
const result = await release.determineVersion('1.19.x', 'any', platform);
expect(result.version).toEqual('1.19.0-5.0.pre');
expect(result.rawVersion).toEqual('1.19.0-5.0.pre');
expect(result.downloadUrl).toContain('1.19.0-5.0.pre');
});
it('channel: "any", version: "1.19.0-4.x"', async () => {
const result = await release.determineVersion(
'1.19.0-4.x',
'any',
platform
);
expect(result.version).toEqual('1.19.0-4.3.pre');
expect(result.rawVersion).toEqual('1.19.0-4.3.pre');
expect(result.downloadUrl).toContain('1.19.0-4.3.pre');
});
});
});

9399
dist/index.js vendored

File diff suppressed because it is too large Load Diff

3012
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "flutter-action",
"version": "1.2.0",
"version": "1.3.2",
"private": true,
"description": "Flutter environment for use in actions",
"main": "lib/index.js",
@@ -25,27 +25,29 @@
"author": "Alif Rachmawadi <arch@subosito.com>",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.2.3",
"@actions/exec": "^1.0.3",
"@actions/http-client": "^1.0.6",
"@actions/io": "^1.0.2",
"@actions/tool-cache": "^1.3.1",
"semver": "^7.1.3",
"uuid": "^7.0.1"
"@actions/core": "^1.4.0",
"@actions/exec": "^1.1.0",
"@actions/http-client": "^1.0.11",
"@actions/io": "^1.1.1",
"@actions/tool-cache": "^1.7.1",
"semver": "^7.3.5",
"uuid": "^8.3.2"
},
"devDependencies": {
"@types/jest": "^25.1.3",
"@types/nock": "^10.0.3",
"@types/node": "^12.12.29",
"@types/semver": "^7.1.0",
"@types/uuid": "^7.0.0",
"@zeit/ncc": "^0.21.1",
"jest": "^25.1.0",
"jest-circus": "^25.1.0",
"nock": "^10.0.6",
"@types/jest": "^26.0.23",
"@types/node": "^14.17.3",
"@types/semver": "^7.3.6",
"@types/uuid": "^8.3.0",
"@vercel/ncc": "^0.28.6",
"jest": "^26.6.3",
"jest-circus": "^26.6.3",
"nock": "^13.1.0",
"npm-run-all": "^4.1.5",
"prettier": "^1.19.1",
"ts-jest": "^25.2.1",
"typescript": "^3.8.3"
"prettier": "1.19.1",
"ts-jest": "^26.5.6",
"typescript": "^4.3.2"
},
"resolutions": {
"minimist": "^1.2.2"
}
}

View File

@@ -6,6 +6,14 @@ async function run() {
const version = core.getInput('flutter-version') || '';
const channel = core.getInput('channel') || 'stable';
if (channel == 'master' && version != '') {
core.setFailed(
'using `flutter-version` with master channel is not supported.'
);
return;
}
await installer.getFlutter(version, channel);
} catch (error) {
core.setFailed(error.message);

View File

@@ -1,211 +1,128 @@
import * as core from '@actions/core';
import * as io from '@actions/io';
import * as exec from '@actions/exec';
import * as tc from '@actions/tool-cache';
import * as fs from 'fs';
import * as path from 'path';
import * as httpm from '@actions/http-client';
import * as semver from 'semver';
const IS_WINDOWS = process.platform === 'win32';
const IS_DARWIN = process.platform === 'darwin';
const IS_LINUX = process.platform === 'linux';
const storageUrl = 'https://storage.googleapis.com/flutter_infra/releases';
let tempDirectory = process.env['RUNNER_TEMP'] || '';
if (!tempDirectory) {
let baseLocation;
if (IS_WINDOWS) {
baseLocation = process.env['USERPROFILE'] || 'C:\\';
} else {
if (process.platform === 'darwin') {
baseLocation = '/Users';
} else {
baseLocation = '/home';
}
}
tempDirectory = path.join(baseLocation, 'actions', 'temp');
}
import * as release from './release';
export async function getFlutter(
version: string,
channel: string
): Promise<void> {
const versionPart = version.split('.');
const platform = release.getPlatform();
const useMaster = channel == 'master';
if (versionPart[1] == null || versionPart[2] == null) {
version = version.concat('.x');
const {
version: selected,
downloadUrl,
channel: validatedChannel
} = await release.determineVersion(
version,
useMaster ? 'dev' : channel,
platform
);
if (!useMaster && channel !== validatedChannel) {
core.debug(`Channel was identified as ${validatedChannel}`);
}
version = await determineVersion(version, channel);
let cleanver = useMaster
? channel
: `${selected.replace('+', '-')}-${validatedChannel}`;
let cleanver = `${version.replace('+', '-')}-${channel}`;
let toolPath = tc.find('flutter', cleanver);
if (toolPath) {
core.debug(`Tool found in cache ${toolPath}`);
} else {
core.debug('Downloading Flutter from Google storage');
core.debug(`Downloading Flutter from Google storage ${downloadUrl}`);
const downloadInfo = getDownloadInfo(version, channel);
const sdkFile = await tc.downloadTool(downloadInfo.url);
let tempDir: string = generateTempDir();
const sdkDir = await extractDownload(sdkFile, tempDir);
core.debug(`Flutter sdk extracted to ${sdkDir}`);
const sdkFile = await tc.downloadTool(downloadUrl);
const sdkCache = await tmpDir(platform);
const sdkDir = await extract(sdkFile, sdkCache, path.basename(downloadUrl));
toolPath = await tc.cacheDir(sdkDir, 'flutter', cleanver);
}
core.exportVariable('FLUTTER_HOME', toolPath);
core.exportVariable('FLUTTER_ROOT', toolPath);
let pubCachePath = process.env['PUB_CACHE'] || '';
if (!pubCachePath) {
pubCachePath = path.join(toolPath, '.pub-cache');
core.exportVariable('PUB_CACHE', pubCachePath);
}
core.addPath(path.join(toolPath, 'bin'));
core.addPath(path.join(toolPath, 'bin', 'cache', 'dart-sdk', 'bin'));
core.addPath(path.join(pubCachePath, 'bin'));
if (useMaster) {
await exec.exec('flutter', ['channel', 'master']);
await exec.exec('flutter', ['upgrade']);
}
}
function osName(): string {
if (IS_DARWIN) return 'macos';
if (IS_WINDOWS) return 'windows';
function tmpBaseDir(platform: string): string {
let tempDirectory = process.env['RUNNER_TEMP'] || '';
return process.platform;
if (tempDirectory) {
return tempDirectory;
}
let baseLocation;
switch (platform) {
case 'windows':
baseLocation = process.env['USERPROFILE'] || 'C:\\';
break;
case 'macos':
baseLocation = '/Users';
break;
default:
baseLocation = '/home';
break;
}
return path.join(baseLocation, 'actions', 'temp');
}
function extName(): string {
if (IS_LINUX) return 'tar.xz';
return 'zip';
}
function getDownloadInfo(
version: string,
channel: string
): {version: string; url: string} {
const os = osName();
const ext = extName();
const url = `${storageUrl}/${channel}/${os}/flutter_${os}_v${version}-${channel}.${ext}`;
return {
version,
url
};
}
function generateTempDir(): string {
return path.join(
tempDirectory,
async function tmpDir(platform: string): Promise<string> {
const baseDir = tmpBaseDir(platform);
const tempDir = path.join(
baseDir,
'temp_' + Math.floor(Math.random() * 2000000000)
);
await io.mkdirP(tempDir);
return tempDir;
}
async function extractDownload(
async function extract(
sdkFile: string,
destDir: string
sdkCache: string,
originalFilename: string
): Promise<string> {
await io.mkdirP(destDir);
const fileStats = fs.statSync(path.normalize(sdkFile));
const sdkPath = path.normalize(sdkFile);
const stats = fs.statSync(sdkPath);
if (fileStats.isFile()) {
const stats = fs.statSync(sdkFile);
if (stats.isFile()) {
await extractFile(sdkFile, destDir);
if (!stats) {
throw new Error(`Failed to extract ${sdkFile} - it doesn't exist`);
} else if (stats.isDirectory()) {
throw new Error(`Failed to extract ${sdkFile} - it is a directory`);
}
const sdkDir = path.join(destDir, fs.readdirSync(destDir)[0]);
if (originalFilename.endsWith('tar.xz')) {
await tc.extractTar(sdkFile, sdkCache, 'x');
} else {
await tc.extractZip(sdkFile, sdkCache);
}
return sdkDir;
return path.join(sdkCache, fs.readdirSync(sdkCache)[0]);
} else {
throw new Error(`Flutter sdk argument ${sdkFile} is not a file`);
}
}
async function extractFile(file: string, destDir: string): Promise<void> {
const stats = fs.statSync(file);
if (!stats) {
throw new Error(`Failed to extract ${file} - it doesn't exist`);
} else if (stats.isDirectory()) {
throw new Error(`Failed to extract ${file} - it is a directory`);
}
if ('tar.xz' === extName()) {
await tc.extractTar(file, destDir, 'x');
} else {
await tc.extractZip(file, destDir);
}
}
async function determineVersion(
version: string,
channel: string
): Promise<string> {
if (version.endsWith('.x') || version === '') {
return await getLatestVersion(version, channel);
}
return version;
}
interface IFlutterChannel {
[key: string]: string;
beta: string;
dev: string;
stable: string;
}
interface IFlutterRelease {
hash: string;
channel: string;
version: string;
}
interface IFlutterStorage {
current_release: IFlutterChannel;
releases: IFlutterRelease[];
}
async function getLatestVersion(
version: string,
channel: string
): Promise<string> {
const releasesUrl: string = `${storageUrl}/releases_${osName()}.json`;
const http: httpm.HttpClient = new httpm.HttpClient('flutter-action');
const storage: IFlutterStorage | null = (
await http.getJson<IFlutterStorage | null>(releasesUrl)
).result;
if (!storage) {
throw new Error('unable to get latest version');
}
if (version.endsWith('.x')) {
const sver = version.slice(0, version.length - 2);
const releases = storage.releases.filter(
release =>
release.version.startsWith(`v${sver}`) && release.channel === channel
);
const versions = releases.map(release =>
release.version.slice(1, release.version.length)
);
const sortedVersions = versions.sort(semver.rcompare);
core.debug(
`latest version of ${version} from channel ${channel} is ${sortedVersions[0]}`
);
return sortedVersions[0];
}
const channelVersion = storage.releases.find(
release => release.hash === storage.current_release[channel]
);
if (!channelVersion) {
throw new Error(`unable to get latest version from channel ${channel}`);
}
let cver = channelVersion.version;
cver = cver.slice(1, cver.length);
core.debug(`latest version from channel ${channel} is ${cver}`);
return cver;
}

199
src/release.ts Normal file
View File

@@ -0,0 +1,199 @@
import * as core from '@actions/core';
import * as httpm from '@actions/http-client';
import * as semver from 'semver';
export const storageUrl =
'https://storage.googleapis.com/flutter_infra_release/releases';
interface IFlutterData {
channel: string;
version: string;
rawVersion: string;
downloadUrl: string;
}
interface IFlutterChannel {
[key: string]: string;
beta: string;
dev: string;
stable: string;
}
interface IFlutterRelease {
hash: string;
channel: string;
version: string;
archive: string;
}
interface IFlutterStorage {
current_release: IFlutterChannel;
releases: IFlutterRelease[];
}
export function getPlatform(): string {
const platform = process.platform;
if (platform == 'win32') {
return 'windows';
}
if (platform == 'darwin') {
return 'macos';
}
return platform;
}
export async function determineVersion(
version: string,
channel: string,
platform: string
): Promise<IFlutterData> {
const storage = await getReleases(platform);
if (version === '') {
return getLatestVersion(storage, channel);
}
if (version.endsWith('.x')) {
return getWildcardVersion(storage, channel, version);
}
return getVersion(storage, channel, version);
}
async function getReleases(platform: string): Promise<IFlutterStorage> {
const releasesUrl: string = `${storageUrl}/releases_${platform}.json`;
const http: httpm.HttpClient = new httpm.HttpClient('flutter-action');
const storage: IFlutterStorage | null = (
await http.getJson<IFlutterStorage | null>(releasesUrl)
).result;
if (!storage) {
throw new Error('unable to get flutter releases');
}
return storage;
}
async function getLatestVersion(
storage: IFlutterStorage,
channel: string
): Promise<IFlutterData> {
const channelVersion = storage.releases.find(release => {
return (
release.hash === storage.current_release[channel] &&
validateChannel(release.channel, channel)
);
});
if (!channelVersion) {
throw new Error(`unable to get latest version from channel ${channel}`);
}
let rver = channelVersion.version;
let cver = rver.startsWith('v') ? rver.slice(1, rver.length) : rver;
core.debug(`latest version from channel ${channel} is ${rver}`);
const flutterData: IFlutterData = {
channel: channelVersion.channel,
version: cver,
rawVersion: rver,
downloadUrl: `${storageUrl}/${channelVersion.archive}`
};
return flutterData;
}
function validateChannel(releaseChannel: string, channel: string) {
return releaseChannel === channel || channel === 'any';
}
async function getWildcardVersion(
storage: IFlutterStorage,
channel: string,
version: string
): Promise<IFlutterData> {
let sver = version.endsWith('.x')
? version.slice(0, version.length - 2)
: version;
const releases = storage.releases.filter(release => {
return (
validateChannel(release.channel, channel) &&
prefixCompare(sver, release.version)
);
});
const versions = releases
.map(release => release.version)
.map(version =>
version.startsWith('v') ? version.slice(1, version.length) : version
);
const sortedVersions = versions.sort(semver.rcompare);
let cver = sortedVersions[0];
let release = releases.find(release => compare(cver, release.version));
if (!release) {
throw new Error(`unable to find release for ${version}`);
}
core.debug(
`latest version of ${version} from channel ${channel} is ${release.version}`
);
const flutterData = {
channel: release.channel,
version: cver,
rawVersion: release.version,
downloadUrl: `${storageUrl}/${release.archive}`
};
return flutterData;
}
async function getVersion(
storage: IFlutterStorage,
channel: string,
version: string
): Promise<IFlutterData> {
const release = storage.releases.find(release => {
return (
validateChannel(release.channel, channel) &&
compare(version, release.version)
);
});
if (!release) {
return getWildcardVersion(storage, channel, version);
}
const flutterData = {
channel: release.channel,
version,
rawVersion: release.version,
downloadUrl: `${storageUrl}/${release.archive}`
};
return flutterData;
}
function compare(version: string, releaseVersion: string): boolean {
if (releaseVersion.startsWith('v')) {
return releaseVersion === `v${version}`;
}
return releaseVersion === version;
}
function prefixCompare(version: string, releaseVersion: string): boolean {
if (releaseVersion.startsWith('v')) {
return releaseVersion.startsWith(`v${version}`);
}
return releaseVersion.startsWith(version);
}