Files
IKAR/tool/release_smoke.dart
T
sevenhill 2fcd23a4cf
Tests / test (push) Canceled after 0s
Native crypto / native-crypto (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s
Publish IKAR Android 1.0.4 and verify release artifacts
2026-10-07 22:46:55 +03:00

57 lines
2.0 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:ikar/core/transport/ikar_network.dart';
Future<void> main(List<String> args) async {
final version = args.isEmpty ? '1.0.0' : args[0];
final code = args.length < 2 ? 1 : int.parse(args[1]);
final reportSuffix = code == 1 ? '' : '-$version';
final http = IkarNetwork.client();
try {
final base = Uri.parse('https://ikar.kusoft.xyz');
final response = await (await http.getUrl(
base.resolve('/api/apps/ikar/manifest'),
)).close();
if (response.statusCode != 200) {
throw StateError('Release manifest unavailable');
}
final manifest = jsonDecode(await utf8.decodeStream(response));
if (manifest['app']['packageName'] != 'ru.ikar.app' ||
manifest['release']['version'] != '$version+$code') {
throw StateError('Incorrect release identity');
}
final expected = (await File(
'artifacts/ikar-$version+$code.apk.sha256',
).readAsString()).split(' ').first;
if (manifest['release']['sha256'] != expected) {
throw StateError('Manifest checksum mismatch');
}
final download = await (await http.getUrl(
base.resolve(manifest['release']['downloadPath']),
)).close();
if (download.statusCode != 200) {
throw StateError('APK download unavailable');
}
final digest = await sha256.bind(download).first;
if (digest.toString() != expected) {
throw StateError('Downloaded APK checksum mismatch');
}
final report = {
'passed': true,
'package': 'ru.ikar.app',
'version': '$version+$code',
'sha256': expected,
'tlsValidation': true,
'bytes': manifest['release']['packageSizeBytes'],
'timestamp': DateTime.now().toUtc().toIso8601String(),
};
await File(
'artifacts/release-verification$reportSuffix.json',
).writeAsString(const JsonEncoder.withIndent(' ').convert(report));
stdout.writeln(jsonEncode(report));
} finally {
http.close(force: true);
}
}