GitHub Actions에서 cron 설정은 일정한 시간 간격으로 워크플로우를 실행할 수 있도록 해주는 옵션입니다.

이를 사용하여 주기적으로 작업을 실행하거나 스케줄에 맞게 작업을 수행할 수 있습니다.

 

Linux 의 crontab 에서 가져온 것으로 보이는데, 이미 crontab 을 사용해보신 분이라면 설정 방법이 같기 때문에 어렵지 않을 것입니다.

cron 설정은 on 항목 아래에 추가됩니다. 아래는 cron 설정의 예제입니다:

 

on:
  schedule:
    - cron: '0 0 * * *' # 매일 00:00에 실행


위의 예제에서 cron 설정은 매일 00:00(자정)에 워크플로우를 실행하도록 합니다.

cron 표현식은 다음과 같은 형식을 따릅니다:

 

* * * * *


각 ' * ' 는 다음과 같은 시간 단위를 나타냅니다:

1. 분 (0-59)
2. 시 (0-23)
3. 일 (1-31)
4. 월 (1-12)
5. 요일 (0-6, 일요일부터 토요일까지)

 

' * ' 은 보통 모든 경우를 의미하지요. 

자주 사용되는 일반적인 cron 설정 예시는 다음과 같습니다:

1. 0 * * * *  # 매 시 정각마다 실행, 0분 매시간 매일 매월 모든요일

2. 0 0 * * *  # 매일 자정에 실행, 0분 0시 매일 매월 모든요일
3. 0 0 * * 1 # 매주 월요일에 실행, 0분 0시 매일 매월 월요일

 

 

UTC 기준

GitHub Actions에서 cron 설정은 UTC 기준으로 작동합니다. 따라서 지역 시간대를 고려하여 설정해야 할 경우 해당 시간대의 UTC 시간을 계산하여 설정해야 합니다.

 

예를 들어, 한국 시간 기준으로 월요일 오전 3시에 실행되도록 cron 설정을 작성하려면 UTC 시간을 기준으로 설정해야 합니다. 한국 시간은 UTC+9 시간대이므로 UTC 시간에서 9시간을 더한 값을 사용해야 합니다.

월요일 오전 3시는 UTC 시간 기준으로는 일요일 오후 6시에 해당합니다. 따라서 아래와 같이 cron 설정을 작성할 수 있습니다:

 

on:
  schedule:
    - cron: '0 18 * * 0' # 매주 일요일 18:00 (UTC)에 실행

 

위의 설정은 한국 시간으로 월요일 오전 3시에 해당하는 시간에 워크플로우를 실행하게 됩니다.

 

 

 

참고

'workflow_dispatch' 를 설정해두면, 수동으로 실행할 수 있으며, 'push' 설정을 해두면, 어떤 브랜치나 혹은 특정파일이 push 될 경우에 실행하게 할 수도 있습니다.

 

 

on:
  workflow_dispatch:  
  schedule:
    - cron: '0 0 * * 0' # 매주 일요일 00:00 (UTC)에 실행  
  push:
    branches:
      - master # 특정 branch
    paths:
      - 'src/main/kotlin/Main.kt' # 특정 파일

 

 

Google Firebase 는 혼자 앱 개발을 할 때 필요한 것들을 무료로 제공해줍니다.

이 중 혼자 개발 할 때 가장 유용한 것 중 하나는 TestLab 입니다.

TestLab 은 하루에  가상기기 10 대, 실제기기 5대에서 테스트를 해 볼 수 있습니다.

스크립트를 사용해서 자신이 원하는 테스트를 해볼 수 도 있지만, Robo - 자동 테스트를 보통 사용합니다.

 

테스트 실행 > Robo

 

apk 혹은 aab 를 업로드 하면 테스트를 진행할 수 있습니다.
필터링 을 선택하면, 제조사 혹은 API Level 로 구분해서 선택할 수 있습니다.

 

물론, 테스트에 필요한 기기가 조금 아쉬울 때가 있긴 합니다. 많은 듯 하면서, 그렇게 많지 않습니다.

하지만, 무료로 제공해주는 기능이기 때문에 그렇게 불만은 없습니다.

구글 레퍼런스 폰 계열의 다른 API Level, 가상기기 정도만 제공해 주어도 만족합니다.

 

테스트를 마친 뒤 결과 화면, 각각 클릭해서 들어가면, 스크린 샷과 테스트 동영상을 확인할 수 있습니다.

 

Firebase TestLab 은 Google PlayStore Publisher 들에게 제공하는 <사전 출시 보고서> 와 동일합니다.

자동 스크립트는 View 에 설정된 Key Event 혹은 OnClick Event 에 따라 모든 UX 경로를 실행하려고 시도합니다.

그러므로, 출시 이전에 미리 예상치 않은 Exception 혹은 Error 가 발생하는지 확인해 볼 수 있습니다.

 

이 자동 스크립트는 약간 비효율적일수는 있지만, 자동으로 도는 것인데다,

간혹, 예상치 않았던 경로를 찾아내기도 하기 때문에, 혼자 앱을 개발하는 개발자에게는 매우 유용한 도구 입니다.

 

 

#Firebase, #GoogleFirebase, #FirebaseTestLab, #GoogleFirebaseTestLab

 

플레이 스토어에서 apk 혹은 aab 를 업로드한 뒤, 사용자에게 앱의 버전이 업데이트 되었음을 알리고, 업데이트하도록 독려하는 UX 를 구현하는 것은 그리 어려운 일은 아닙니다. 하지만, 이를 구현하는 것은 약간 귀찮은 일임에는 틀림없습니다. 앱이 플레이스토어에 업로드 된 앱 버전 이름 혹은 코드을 체크한 뒤, 현재의 앱 버전 이름 혹은 코드와 비교하여 일정한 차이를 보일 때,(혹은 항상) 업데이트를 유도하는 UX 를 추가하여야 합니다. 예전에는 별도의 서버 API 를 사용하는 경우도 있었고, 그 때 그 때 플레이스토어를 크롤링하는 방법을 사용하는 경우도 있었습니다.

 

그런데, 이제 플레이 스토어 라이브러리를 이용하면 되기 때문에, 그런 번거로움은 생각하지 않아도 됩니다. 개발자 사이트의 참조 주소는 developer.android.com/guide/playcore/in-app-updates 입니다.

 

1. gradle dependency 를 설정합니다.

dependencies {
...
	implementation 'com.google.android.play:core:1.8.0'
	implementation 'com.google.android.play:core-ktx:1.8.1'
...
}

 

주의해야할 점은 VERSION.SDK_INT >= 21 을 체크하셔야 합니다. 체크하지 않아도 앱이 죽지는 않지만 UX 를 해칠 수 있습니다.

그리고, 플레이 스토어가 설치되어 있지 않은 에뮬레이터에서는 당연히 동작하지 않습니다. 또한, 이런 속성이 있기 때문에, 플레이 스토어에 게재(Publish)된 apk 버전보다 versionCode 를 낮게 설정해놓아야 동작을 확인할 수 있습니다.

 

2. 추가할 코드

 

// Creates instance of the manager.
val appUpdateManager = AppUpdateManagerFactory.create(context)

// Returns an intent object that you use to check for an update.
val appUpdateInfoTask = appUpdateManager.appUpdateInfo

// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
        // For a flexible update, use AppUpdateType.FLEXIBLE
        && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
    ) {
        // Request the update.
        appUpdateManager.startUpdateFlowForResult(
        // Pass the intent that is returned by 'getAppUpdateInfo()'.
        appUpdateInfo,
        // Or 'AppUpdateType.FLEXIBLE' for flexible updates.
        AppUpdateType.IMMEDIATE,
        // The current activity making the update request.
        this,
        // Include a request code to later monitor this update request.
        1)        
    }
}

 

appUpdateInfo 로 부터 최신 VersionCode 를 가져올 수 있습니다. 이 값과 현재 앱 버전을 비교하여, update 버튼을 활성화시키고, 버튼 클릭에 따라, startUpdateFlowForResult 를 호출해주시면 적절한 update UX 를 구현할 수 있습니다.


appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
	val versionCode = appUpdateInfo.availableVersionCode()
}

 

-------

(아직 작성 중인 글입니다.)

 

 

'Lonely Developer' 카테고리의 다른 글

Github Actions 에서 cron 설정  (0) 2023.08.15
Google Firebase : TestLab  (0) 2021.06.02
Android Studio - Image Asset Tool  (0) 2020.03.13
나 홀로 안드로이드 앱 개발 - Color Tool  (0) 2020.03.11

 

이전 글 : Color Tool

 

이전 글은 칼라 값의 설정이었다면, 이번 글은 아이콘에 관한 글입니다.

 

안드로이드 스튜디오의 Image Asset 툴은 나 홀로 앱 개발을 할 때 필요한 강력한 툴 중 하나입니다.

 

물론, 요즘 무료 아이콘을 사용할 수 있는 사이트들도 많이 있지만, 전문적인 디자이너의 도움이 없이 간단한 아이콘들을 추가하는 것은 Image Asset 으로 충분합니다.

 

 

사용 방법은 위 두 장의 그림으로 갈음합니다.

한 두 번 클릭 해보시다 보면, 초보자라도 쉽게 사용법을 익힐 수 있습니다.

 

덧붙임 1.

안드로이드 개발자 사이트의 문서, 역시 충분히 친절하게(?) 설명되어 있어서 참고하시면 좋습니다.

 

몇 년전만 해도 나 홀로 앱 개발을 하고 있을 때, 가장 어려웠던 것은 앱 디자인이었습니다.

어떤 색을 선택해야 할지 어떤 아이콘을 써야 할지,  좀 처럼 만만한 일이 없었습니다.

제 아무리 포토샵을 잘 한다고 해도, 아이콘을 직접 그리는 것도 만만치 않은 일이었고,

무료 사이트를 뒤져서 나온 괜찮은 아이콘을 썩 마음에 들지 않더라도 사용하는 것이 다반사였습니다.

 

구글이 이런 저의 마음을 어찌나 잘 알아주었는지 시간이 흐르면서 적당한 기능들을 만들어주고 있습니다.

 

그 첫 번째가 기본이 되는 색을 지정해 놓는 것 입니다.

아래 링크를 확인해 보면, 어떤 색을 지정할 경우, 이 색보다 약간 밝은 색과 약간 어두운 색을 알려줍니다.

https://material.io/resources/color/#!/?view.left=0&view.right=0

 

Color Tool - Material Design

Create and share color palettes for your UI, and measure the accessibility of any color combination.

material.io

 

예를 들어, 아래 그림과 같이 붉은 색을 선택했다면,...

 

 

아래와 같이 style.xml 과 color.xml 값을 지정해 놓고 시작하면 좋습니다.

<resources>    
        <!-- style.xml -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/primaryColor</item>
        <item name="colorPrimaryDark">@color/primaryDarkColor</item>
    </style>
</resources>
<resources>
	<!-- colors.xml -->
    <color name="primaryColor">#b71c1c</color>
    <color name="primaryDarkColor">#7f0000</color>
</resources>

'Lonely Developer' 카테고리의 다른 글

Github Actions 에서 cron 설정  (0) 2023.08.15
Google Firebase : TestLab  (0) 2021.06.02
Android Playstore Library Core - Update Apk  (0) 2020.09.04
Android Studio - Image Asset Tool  (0) 2020.03.13