Github 작업을 사용하여 수동으로 apk 생성

더 많은 정보를 알고 싶으면 dev.to에 발표하십시오.이 문장original은 나의 website에 발표되었다.시작하겠습니다.
특정 분기의 기능을 테스트해야 하는 경우가 있습니까?그런데 현지에 환경을 만들지 않았어요?아니면 당신은 어디에서 당신의 컴퓨터를 방문할 수 없습니까?아니면 고객/QA가 APK에 특정한 설정과 기능을 제공하기 위해 계속 핑을 하고 있습니까?
이 블로그에서는 Github 작업을 사용하여 APK를 수동으로 생성하여 이러한 문제를 해결하는 방법에 대해 설명합니다.자, 시작합시다.

선결 조건


  • Github actions.
  • android 구축에 대한 기본적인 이해gradle.
  • 기본 bash 스크립트.
  • 우리는 어떤 문제를 해결하고 싶습니까?


    문제는 작업 환경, 팀 규모 및 고객에 따라 다를 수 있습니다.우리 하나하나를 이해해 봅시다.
  • 독립 개발자:
  • 만약 당신이 독립 개발자로서 이 프로젝트에만 종사한다면 당신은 이런 방법에 잠길 수 있습니다.이 가능하다, ~할 수 있다,...
  • 사람들의 너에 대한 의존을 줄여라.
  • 이미 현지에 환경을 구축했습니다.
  • APK에 매일 테스트를 요청하는 사람이 없습니다.
  • 너는 전체 문장을 뛰어넘을 수 있다.그러나 이런 방법이 좋다는 것을 깨닫는 것은 좋다. 결국 당신의 팀 규모가 커지기 때문에 충분한 준비를 해야 한다.
  • 환경 구축:
  • 비기술 고객이 특정 지점으로 전송되는 정체된 환경에서 기능을 테스트하고자 한다고 가정합니다.두 가지 해결 방안이 있다.
  • 개발상에게 전화를 걸어 필요한 파라미터가 있는 apk를 제공하도록 요구한다.
  • 클라이언트 로컬 기기에android 환경을 설정하고 지점을 검사하며 파라미터를 조정하고 apk를 구축한다.(비기술 고객은 이 솔루션을 좋아하지 않을 것으로 생각됨)
  • GUI를 제공하여 설정 가능한 파라미터가 있는 apk를 구축함으로써 이러한 상황을 피할 수 있습니다.이것이 바로 워크플로우 UI를 실행하는 기능입니다.(다음 섹션에 대한 자세한 내용)
  • 상술한 동일한 문제도 QA에 적용된다.주요 차이점은 QA가 기술적으로 믿을 만하다는 점이다.그들은 push,pull 요청 등 GitHub 트리거를 사용하여 apk를 얻을 수 있습니다. 이 불필요한 push와pull 요청 트리거를 만들어서 apk를 만드는 이유가 문제입니다.그것은git 역사 기록과 불필요한 홍보 요청을 교란할 것이다.
  • 구성 가능:
  • 설정 파라미터를 사용하여 apk를 구축하는 능력이 매우 유용하다는 것을 발견했습니다.우리가 응용 프로그램에서 설정한 가장 흔히 볼 수 있는 매개 변수는
  • API 엔드포인트
  • 키/액세스 키.
  • 임계값, 재시도 횟수와 같은 기타 비즈니스 기반 매개 변수.등
  • 우리는 어떻게 이 문제를 해결합니까?


    Github Actions는 워크플로우를 실행하기 위해 다양한 트리거 이벤트를 제공합니다.다음은 트리거 이벤트의 예입니다. 예를 들어 주 지점에서 제출, 요청 만들기, 표시 등입니다.
    on:
      # Trigger the workflow on push or pull request,
      # but only for the main branch
      push:
        branches:
          - main
    
      pull_request:
        branches:
          - main
    
        branches:    
          # Push events on main branch
          - main
          # Push events to branches matching refs/heads/mona/octocat
          - 'mona/octocat'
          # Push events to branches matching refs/heads/releases/10
          - 'releases/**'
    
        tags:        
          - v1             # Push events to v1 tag
          - v1.*
    
    
    수동으로 이벤트를 트리거하기 위해 Github actions에 workflow dispatch라는 새 트리거 이벤트가 추가되었습니다.다음은 샘플 코드 및 UI입니다.(다음 섹션에서는 자세히 설명합니다.)
    on: 
      workflow_dispatch:
        inputs:
          logLevel:
            description: 'Log level'     
            required: true
            default: 'warning'
          tags:
            description: 'Test scenario tags' 
    

    설치 프로그램


    우선android에서 설정할 수 있는 파라미터를 설정해야 합니다. 그리고 작업 흐름의GitHub로 이 파라미터를 업데이트할 수 있습니다.그러니까 우리 안드로이드부터

    android의 설정 가능한 속성입니다.

  • 파일에 구성 가능한 매개 변수를 설정해야 합니다.이 예에서 우리는 그것을 local.properties 파일에 넣었는데, 우리는 보통 VCS에 서명하지 않는다.
    참고: 모든 파일일 수 있습니다.우리는 단지 build.gradle 중의 그 서류를 지적하고 싶을 뿐이다.
  • local.properties 파일을 만들거나 업데이트합니다(예: this.
    BASE_URL="https://production.example.com/api/v1"
    MAP_KEY="production_sample_key"
    RETRY_ATTEMPTS=3
    THRESHOLD_VALUE=0.05
    

  • 응용 프로그램에서 업데이트build.gradle, 예를 들어this.
    def localProperties = new Properties()
    localProperties.load(new FileInputStream(rootProject.file("local.properties")))
    
    android {
    
        defaultConfig {
            //...
            buildConfigField("String", "APP_BASE_URL", localProperties['BASE_URL'])
            buildConfigField("int", "APP_RETRY_ATTEMPTS", localProperties['RETRY_ATTEMPTS'])
            buildConfigField("float", "APP_THRESHOLD_VALUE", localProperties['THRESHOLD_VALUE'])
        }
    
        buildTypes {
            debug {
                resValue("string", "maps_key", localProperties['MAP_KEY'])
            }
            release {
               //..
            }
        }
    }
    

  • 우리는 이 프로그램에서 BuildConfig 로컬 속성을 인용할 수 있습니다.
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val txtConfig = findViewById<TextView>(R.id.txtConfig)
    
            val configText = """
                BASE URL :  ${BuildConfig.APP_BASE_URL}
                MAP_KEY :  ${getString(R.string.maps_key)}
                RE-ATTEMPT :  ${BuildConfig.APP_RETRY_ATTEMPTS}
                THRESHOLD VALUE :  ${BuildConfig.APP_THRESHOLD_VALUE}
            """.trimIndent()
    
            txtConfig.text = configText
        }
    }
    
    참고 동기화할 때 local.properties가 생성되지 않는 경우도 있습니다BuildConfig.이것은 우리가 apk를 구축할 때 생성될 것입니다.Ref
  • apk를 실행할 때 출력은 다음과 같습니다.
  • 만약 당신이 어떤 문제에 직면하게 된다면.예제 워크플로우 응용 프로그램here을 볼 수 있습니다.설정local.properties에 대한 정보는 이 mindork 블로그를 보십시오.

    Github 워크플로우 설정


    우리는 .github/workflow 폴더에yaml 파일을 만듭니다.수동으로 작업 흐름을 촉발하려면 workflow_dispatch를 촉발기로 사용할 것입니다.위에 표시된 실행 워크플로 UI가 표시됩니다.
    name: Manual Generate APK
    on:
      workflow_dispatch:
        /....
    
    입력 설정 값을 표시하기 위해서, 우리는 여기에 입력을 사용합니다.baseUrl는 입력 키입니다. 우리는 그것을 사용하여 값을 읽을 것입니다.
    name: Manual Generate APK
    on:
      workflow_dispatch:
        inputs:
    
          baseUrl:
            description: 'Base URL'
            required: true
            default: 'https://production.example.com/api/v1'
    
          mapKey:
            description: 'Map Key'
            required: true
            default: 'production_sample_key'
    
          reAttempt:
            description: 'Number of re-attempts'
            default: '3'
    
          thresholdValue:
            description: 'Threshold value'
            default: '0.05'
    
    required 매개변수를 true로 설정하면 필수 필드를 나타내는 별표가 표시됩니다.description UI에 필드 이름으로 표시됩니다.default 매개 변수는 입력 필드에 기본값을 설정합니다.

    apk를 구축하기 위해 명령을 추가할 것입니다.
    - name: Assemble app debug APK
      run: bash ./gradlew assembleDebug --stacktrace
    

    bash 스크립트 설정


    이 오류가 발견되면 실행을 시도합니다 (915).VCS에 파일을 체크 인하지 않았기 때문입니다.우리는 로컬을 만들 수 있습니다.github 작업 흐름을 실행할 때 속성을 동적으로 표시합니다.우리는 작업 흐름에서 linux 명령을 실행함으로써 이 작업을 실현할 수 있습니다. 이 작업 흐름은 모든 설정 값을 포함하는 local.properties 파일을 만들 것입니다.
    이 linux 명령 시퀀스를 bash 스크립트에 포장하는 것이 좋습니다.그것은 작업 흐름에서 혼란스러운 코드를 피하고 스크립트를 업데이트하는 데 더 큰 유연성을 제공할 것이다.
    현재, 우리는 VCS에서 bash 스크립트 파일 update_properties.sh 을 만들고 서명할 것입니다. 이 파일은 다음과 같습니다.
    #!/bin/bash
    
    touch local.properties
    echo "BASE_URL=\"$1\"" >> local.properties
    echo "MAP_KEY=\"$2\"" >> local.properties
    echo "RETRY_ATTEMPTS=$3" >> local.properties
    echo "THRESHOLD_VALUE=$4" >> local.properties
    
    $1, $2, $3 및 $4는 입력 값에서 스크립트로 전달되는 4개의 매개 변수입니다.
    apk를 구축하기 전에 bash 스크립트를 실행하려면 입력값을 사용해야 합니다.우리는 github.event.inputs.{key} 속성을 사용하여 이 값을 얻는다.소스 파일local.properties을 찾을 수 있습니다.
    - name: Print Params Values
      run: |
              bash update_properties.sh ${{ github.event.inputs.baseUrl }} ${{ github.event.inputs.mapKey }} ${{ github.event.inputs.reAttempt }} ${{ github.event.inputs.thresholdValue }}
    - name: Assemble app debug APK
      run: bash ./gradlew assembleDebug --stacktrace
    
    흥미로운 사실: 17번의 시도가 실패한 후에 나는 스크립트를 실행할 수 있다.따라서 스크립트가 처음 작동하지 않으면 걱정하지 마세요.저처럼 계속 구글 검색을 해보도록 하겠습니다.😂
    here

    워크플로우 실행

  • github 작업 옵션의 UI에서 작업 흐름을 실행할 수 있습니다.

  • 기존 local.properties 또는 이미 사용 중인 다른 파일을 업데이트하려면 스크립트를 변경해야 합니다.예를 들어 이것을 검사해 주세요.
  • 지부 기구 기억해야 할 중요한 일

  • 워크플로우를 별도의 분기로 밀어넣지만 분기main/master에 없으면 워크플로우 UI가 표시되지 않습니다.워크플로우를 분기main/master로 푸시할 때만 워크플로우를 볼 수 있습니다.
  • 워크플로우가 없는 분기에서는 실행되지 않습니다.사용자 인터페이스는 다음과 같습니다.
  • linux 텍스트 교체 sed -i 명령은 linux에서 실행되는github 작업에서 작동합니다.mac에 대해 우리는 사용해야 한다sed -i ""
  • 동기화할 때 local.properties가 생성되지 않는 경우도 있습니다BuildConfig.이것은 우리가 apk를 구축할 때 생성될 것입니다.
  • 심판 결론


    GitHub 수동 트리거는 개발자가 처음 작업을 시작할 때 요구한 것이다.특히 고객/QA에 대한 유연성과 용이성을 제공하기 때문에 이 워크플로우를 트리거할 수 있는 API가 하나 더 있어 자동화의 문을 열었습니다.
    만약 무슨 문제가 있으면 나에게 연락해도 된다.내 블로그 구독을 통해 업데이트를 유지합니다.시간을 내서 본문을 읽어 주셔서 감사합니다.만약 당신이 이 글을 좋아한다면, 당신의 친구/동료와 공유하고 전파하는 것을 좋아하십시오.

    리소스

  • https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/
  • https://blog.mindorks.com/using-local-properties-file-to-avoid-api-keys-check-in-into-version-control-system
  • https://stackoverflow.com/questions/16745988/sed-command-with-i-option-in-place-editing-works-fine-on-ubuntu-but-not-mac
  • https://abelsquidhead.com/index.php/2020/07/29/manually-trigger-actions-workflow-in-github-how-did-i-not-know-about-this/
  • 좋은 웹페이지 즐겨찾기