Skip to content

GitHub Pipeline #13

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 36 commits into
base: change_logger
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
45b4cb9
Change logger
JPM84 Sep 30, 2022
d5e1667
Merge branch 'change_logger' into 'final'
Sep 30, 2022
e9beb1e
github actions first attempt
Oct 4, 2022
72351c9
second try
Oct 4, 2022
b0f3c05
test manuall workflow
Oct 4, 2022
90f76ab
second test manual workflow
Oct 4, 2022
e8d76f9
check artifacts migration and jobs
Oct 5, 2022
32c9cab
adding needs
Oct 5, 2022
b6b2404
check chache flutter
Oct 5, 2022
df54f54
run github actions test
Oct 18, 2022
1ba6c9f
remove cache flutter in github pipeline
Oct 18, 2022
47478c0
pipeline test
Oct 18, 2022
b6d559c
pipeline test without cache
Oct 19, 2022
7be5165
forgot to comment out...
Oct 19, 2022
698c793
cache flutter
Oct 19, 2022
88aa270
determine path when cached
Oct 19, 2022
627c29b
remove sperated jobs
Oct 19, 2022
8a815a6
test apk build
Oct 19, 2022
8130dee
test cache
Oct 19, 2022
a610ce6
fix ident mistake
Oct 19, 2022
c45a1e2
cache test
Oct 19, 2022
ec8fc26
set cache path
Oct 19, 2022
685f68f
set cache path
Oct 19, 2022
32069e7
get flutter before every job in pipeline
Oct 19, 2022
00cf3a7
test build apk
Oct 19, 2022
cc8651f
exclude main
Oct 19, 2022
1a58b33
lint fix
Oct 19, 2022
a98aaee
skip main
Oct 19, 2022
78507ab
hopefully the final lint fix
Oct 19, 2022
8f238eb
pipeline run on linux
Oct 19, 2022
0474477
pipeline run on linux
Oct 19, 2022
916a834
lcov coverage test
Oct 19, 2022
dbbfe31
lcov coverage test fix working-directory
Oct 19, 2022
891acf1
remove lcov
Oct 19, 2022
4eb47b7
remove comment
Oct 26, 2022
97154fc
set build output on ignore
Oct 26, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Flutter Workflow

on:
push:
branches-ignore:
- main
jobs:
# Check app for format and lint exceptions (fail fast)
check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.3.0'
channel: 'stable'
- run: flutter --version
- run: make format
- run: make clean
- run: make lint
# Check code quality
code_quality:
needs: check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.3.0'
channel: 'stable'
- run: export PATH="$PATH":"$HOME/.pub-cache/bin"
- run: flutter pub global activate dart_code_metrics
- run: metrics lib -r codeclimate > gh-code-quality-report.json
- name: Upload Code Quality Report
uses: actions/upload-artifact@v3
with:
name: gh-code-quality-report
path: gh-code-quality-report.json
# Run tests and report quality
test:
needs: check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.3.0'
channel: 'stable'
- run: export PATH="$PATH":"$HOME/.pub-cache/bin"
- run: flutter pub global activate junitreport
- run: flutter test --machine --coverage | tojunit -o report.xml
- name: Upload Report
uses: actions/upload-artifact@v3
with:
name: report
path: report.xml
# Build the app to check if release builds still work
apk:
needs: [check, test, code_quality]
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '11'
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.3.0'
channel: 'stable'
- run: make build-android-apk
- name: 'Upload APK'
uses: actions/upload-artifact@v3
with:
name: apk
path: build-output/app.apk
retention-days: 2

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,6 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release


.build-output
Empty file removed build-output/.gitkeep
Empty file.
4 changes: 4 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import 'package:counter_workshop/src/app.dart';
import 'package:counter_workshop/src/core/logger/app_logger.dart';
import 'package:counter_workshop/src/features/counter/data/datasources/remote/src/mock/counter_fake.api.dart';
import 'package:counter_workshop/src/features/counter/data/repositories/counter.repository.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:intl/intl_standalone.dart' if (dart.library.html) 'package:intl/intl_browser.dart';
import 'package:logging/logging.dart';

Future<void> main() async {
Intl.systemLocale = await findSystemLocale();
AppLogger(level: Level.WARNING);
final CounterRepository counterRepository = CounterRepository(counterApi: CounterFakeApi());

runApp(
App(
counterRepository: counterRepository,
Expand Down
26 changes: 26 additions & 0 deletions lib/src/core/logger/app_logger.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'package:counter_workshop/src/core/logger/appenders.dart';
import 'package:counter_workshop/src/core/logger/log_formatters.dart';
import 'package:flutter/foundation.dart';
import 'package:logging/logging.dart';

final appLogger = Logger('CounterWorkshop');

class AppLogger {
// ignore: unused_field
static late AppLogger _singleton;

factory AppLogger({Level level = Level.ALL}) => _singleton = AppLogger._initLogger(level);

AppLogger._initLogger(Level level) {
recordStackTraceAtLevel = level;
appLogger.info('App Started');
if (kDebugMode) {
ConsoleLogAppender(formatter: const ConsoleLogFormatter()).attachToLogger(Logger.root);
FileLogAppender(formatter: const FileLogFormatter()).attachToLogger(Logger.root);
}

if (kReleaseMode) {
FileLogAppender(formatter: const FileLogFormatter()).attachToLogger(Logger.root);
}
}
}
50 changes: 50 additions & 0 deletions lib/src/core/logger/appenders.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'dart:developer';

import 'package:counter_workshop/src/core/logger/log_formatters.dart';
import 'package:logging/logging.dart';
import 'package:logging_appenders/logging_appenders.dart';

class ConsoleLogAppender extends BaseLogAppender {
void Function(Object line)? printer;

ConsoleLogAppender({LogRecordFormatter? formatter}) : super(formatter ?? defaultDebugConsoleLogFormatter());

ConsoleLogAppender setupLogging({Level level = Level.ALL, Level stderrLevel = Level.OFF}) {
Logger.root.clearListeners();
Logger.root.level = level;

return defaultLogAppender(stderrLevel: stderrLevel)..attachToLogger(Logger.root);
}

@override
void handle(LogRecord record) {
log(formatter.format(record));
}
}

ConsoleLogAppender defaultLogAppender({LogRecordFormatter? formatter, Level? stderrLevel}) {
return ConsoleLogAppender(formatter: formatter);
}

class FileLogAppender extends RotatingFileAppender {
void Function(Object line)? printer;

FileLogAppender({LogRecordFormatter? formatter})
: super(baseFilePath: '/counter_workshop_logs', formatter: formatter);

FileLogAppender setupLogging({Level level = Level.ALL, Level stderrLevel = Level.OFF}) {
Logger.root.clearListeners();
Logger.root.level = level;

return fileLogAppender(stderrLevel: stderrLevel)..attachToLogger(Logger.root);
}

@override
void handle(LogRecord record) {
//log(formatter.format(record));
}
}

FileLogAppender fileLogAppender({LogRecordFormatter? formatter, Level? stderrLevel}) {
return FileLogAppender(formatter: formatter);
}
84 changes: 84 additions & 0 deletions lib/src/core/logger/log_formatters.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import 'package:logging/logging.dart';
import 'package:logging_appenders/logging_appenders.dart';

LogRecordFormatter defaultDebugConsoleLogFormatter() => const DefaultLogRecordFormatter();

LogRecordFormatter defaultFileLogFormatter() => const DefaultLogRecordFormatter();

class ConsoleLogFormatter extends LogRecordFormatter {
const ConsoleLogFormatter();

@override
StringBuffer formatToStringBuffer(LogRecord rec, StringBuffer sb) {
String outputColor = FormatterHelper.defineOutputColor(rec.level);
sb.write(
'$outputColor [${rec.time}] [${rec.level.name}] [${rec.zone}] '
'[${rec.loggerName}] - \x1B[34m${rec.message}',
);

if (rec.error != null) {
sb.writeln();
sb.write('### ${rec.error?.runtimeType}: ');
sb.write(rec.error);
}
final stackTrace = rec.stackTrace ?? (rec.error is Error ? (rec.error as Error).stackTrace : null);
if (stackTrace != null) {
sb.writeln();
sb.write(stackTrace);
}
sb.write('\x1B[0m');
return sb;
}
}

class FileLogFormatter extends LogRecordFormatter {
const FileLogFormatter();

@override
StringBuffer formatToStringBuffer(LogRecord rec, StringBuffer sb) {
sb.write(
'[${rec.time}] [${rec.level.name}] [${rec.zone}] '
'[${rec.loggerName}] - ${rec.message}',
);

if (rec.error != null) {
sb.writeln();
sb.write('### ${rec.error?.runtimeType}: ');
sb.write(rec.error);
}
final stackTrace = rec.stackTrace ?? (rec.error is Error ? (rec.error as Error).stackTrace : null);
if (stackTrace != null) {
sb.writeln();
sb.write(stackTrace);
}
return sb;
}
}

class FormatterHelper {
FormatterHelper._();

static String defineOutputColor(Level level) {
String outputColor = '';
switch (level.name) {
case 'ALL':
case 'FINEST':
case 'FINER':
case 'FINE':
case 'CONFIG':
outputColor = '\x1B[37m';
break;
case 'INFO':
case 'WARNING':
outputColor = '\x1B[33m';
break;
case 'SEVERE':
case 'SHOUT':
outputColor = '\x1B[31m';
break;
default:
outputColor = '\x1B[37m';
}
return outputColor;
}
}
2 changes: 1 addition & 1 deletion lib/src/core/routing/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:go_router/go_router.dart';

final router = GoRouter(
urlPathStrategy: UrlPathStrategy.path,
debugLogDiagnostics: true,
debugLogDiagnostics: false, // Logs werden durch den Logger übernommen
initialLocation: '/counters',
routes: [
GoRoute(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import 'dart:async';

import 'package:counter_workshop/src/core/logger/app_logger.dart';
import 'package:counter_workshop/src/features/counter/data/datasources/remote/converters/counter_request.converter.dart';
import 'package:counter_workshop/src/features/counter/data/datasources/remote/counter.api.dart';
import 'package:counter_workshop/src/features/counter/data/datasources/remote/converters/counter_response.converter.dart';
import 'package:counter_workshop/src/features/counter/data/datasources/remote/dtos/counter_response.dto.dart';
import 'package:counter_workshop/src/features/counter/domain/model/counter.model.dart';
import 'dart:developer';

import 'package:counter_workshop/src/features/counter/domain/repository/counter.repository_interface.dart';

Expand All @@ -16,7 +16,7 @@ class CounterRepository implements CounterRepositoryInterface {

@override
Future<List<CounterModel>> getCounterList() async {
log('retriving counter list');
appLogger.info('retriving counter list');
final List<CounterResponseDto> response = await counterApi.fetchAll();

// map result to model
Expand All @@ -33,7 +33,7 @@ class CounterRepository implements CounterRepositoryInterface {

@override
Future<CounterModel> createCounter({required CounterModel counterModel}) async {
log('creating new counter with name ${counterModel.name}');
appLogger.info('creating new counter with name ${counterModel.name}');

// map model to dto
final dto = CounterRequestConverter().toDto(counterModel);
Expand All @@ -47,7 +47,7 @@ class CounterRepository implements CounterRepositoryInterface {

@override
Future<void> updateCounter({required String id, required CounterModel counterModel}) async {
log('updating counter: $id with value: $counterModel');
appLogger.info('updating counter: $id with value: $counterModel');

// map model to dto
final dto = CounterResponseConverter().toDto(counterModel);
Expand All @@ -58,7 +58,7 @@ class CounterRepository implements CounterRepositoryInterface {

@override
Future<void> deleteCounter({required String id}) async {
log('deleting counter: $id');
appLogger.info('deleting counter: $id');
await counterApi.deleteCounter(id);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import 'dart:async';

import 'package:counter_workshop/src/core/logger/app_logger.dart';
import 'package:counter_workshop/src/features/counter/data/repositories/counter.repository.dart';
import 'package:counter_workshop/src/features/counter/presentation/edit/bloc/edit_counter.event.dart';
import 'package:counter_workshop/src/features/counter/presentation/edit/bloc/edit_counter.state.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class EditCounterBloc extends Bloc<EditCounterEvent, EditCounterState> {
Expand All @@ -26,14 +25,14 @@ class EditCounterBloc extends Bloc<EditCounterEvent, EditCounterState> {
}

Future<void> _onIncrement(CounterIncrementPressed event, Emitter<EditCounterState> emit) async {
debugPrint('INCREMENT: ${event.counterModel.toString()}');
appLogger.info('INCREMENT: ${event.counterModel.toString()}');
final newCounterModel = event.counterModel.copyWith(value: event.counterModel.value + 1);
emit(EditCounterData(newCounterModel));
await counterRepository.updateCounter(id: event.counterModel.id, counterModel: newCounterModel);
}

Future<void> _onDecrement(CounterDecrementPressed event, Emitter<EditCounterState> emit) async {
debugPrint('DECREMENT: ${event.counterModel.toString()}');
appLogger.info('DECREMENT: ${event.counterModel.toString()}');

if (event.counterModel.value == 0) {
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'dart:developer';

import 'package:counter_workshop/src/core/logger/app_logger.dart';
import 'package:counter_workshop/src/core/widgets/custom_loading_indicator.widget.dart';
import 'package:counter_workshop/src/core/widgets/error_message.widget.dart';
import 'package:counter_workshop/src/features/counter/data/repositories/counter.repository.dart';
Expand Down Expand Up @@ -65,7 +64,7 @@ class CounterView extends StatelessWidget {
listener: (context, state) {
if (state is EditCounterData) {
// Calling DashboardBloc (MasterPage) from EditCounterBloc (DetailPage)
log('EditBlocListener: ${state.counterModel.value}');
appLogger.info('EditBlocListener: ${state.counterModel.value}');
final dashboardBloc = context.read<DashboardBloc>();
dashboardBloc.add(FetchCounterList());
}
Expand Down
Loading