안드로이드의Gradle 구축 캐시 노드 복사

주의: 캐시 노드 복제를 구축하려면Gradle Enterprise를 실행해야 합니다.
이 글에서 저는 Premise Data에서 캐시 노드 복제를 사용하여 전 세계 분포식 팀에 서비스를 제공한 경험을 공유할 것입니다.복제 노드 선택에 사용되는Gradle 구축 스크립트 솔루션의 내부 작업 원리도 공유합니다.
그러나 캐시 구축 노드 복제에 대해 깊이 있게 연구하기 전에gradle 구축 캐시를 간단하게 살펴보자.

Gradle 구축 캐시


Gradle 캐시 구축은 다른 구축에서 생성된 출력을 재사용함으로써 개발자의 시간을 절약하기 위한 캐시 메커니즘이다.
캐시 구축의 작업 원리는 구축 출력(로컬 또는 원격)을 저장하고 입력이 변경되지 않았음을 확인할 때 캐시에서 출력을 가져와 출력을 다시 생성하는 비싼 작업을 피할 수 있도록 하는 것이다.
캐시를 구축하는 것은 구축 성능을 향상시키는 구축 가속 기술이다.캐시 구축의 이점은 다음과 같습니다.
  • 구축 시간 단축으로 인한 피드백 증가
  • 신속한 피드백을 통해 개발자의 생산성 향상
  • 개발 효율성 향상, 빠른 기능 출시
  • 캐시 노드 구축


    Gradle build cache node 소프트웨어는 무료로 제공되는 HTTP 원격 캐시 서버로Gradle의build cache 기능을 사용합니다.
    구축 캐시 노드는Gradle Enterprise 설치와 제한된 기능 없이 사용할 수 있습니다.
    캐시 노드를 구축하면Gradle Enterprise와 연결을 선택하여 중앙 집중식 관리 및 모니터링을 수행하고 여러 노드 간에 캐시 항목을 복제할 수 있습니다.
    원격 노드를Gradle Enterprise 실례에 연결하면Gradle Enterprise에서 집중적으로 설정하고 기본 내장 캐시 노드에서 항목을 복사할 수 있습니다.
    원격 구축 캐시 노드의 설치와 조작은 Build Cache Node User Manual에 기록되고 캐시 노드와Gradle Enterprise의 연결 과정은 Connecting with Gradle Enterprise에 기록된다.

    복제하다


    복제는 사용자가 더 좋은 네트워크 링크를 가진 캐시 노드를 사용할 수 있도록 하고, 더 먼 주 캐시 노드의 부품을 다시 사용할 수 있도록 한다.이것은 지리적 위치가 분산된 단체에 특히 효과적이다.
    우리의 예에서 메인 캐시 노드는 미국 시애틀에 위치하고 있으며, 우리는 이미 노드를 복제하여 전 세계 다른 지역의 개발자들에게 서비스를 제공했다.
    다음 그림에서는 개발자의 위치를 강조 표시하여 팀 분포를 보여 줍니다.

    각 노드의 복제 설정은Gradle Enterprise의 노드 구성 페이지에서 구성할 수 있습니다.원격 노드의 사용자 인터페이스나 프로필을 통해 원격 노드를 설정할 수 없습니다.

    프롬프트 #1


    일반적인 안배는 지속적인 통합 구축을 로컬 네트워크에 전송하는 기본 내장 캐시 노드를 사용하고 서로 다른 위치에 있는 개발자가 사용하는 다른 노드를 복제원으로 사용하도록 하는 것이다.

    복제 기술은 캐시 부품을 분리하고 부하를 분배하며 개발자의 구축과 노드 사이에 더욱 좋은 네트워크 링크를 구축함으로써 구축 성능을 향상시킬 수 있다.

    NOTE: The bandwidth and latency of the network link between a build and a build cache significantly affect build performance.


    힌트


    구축이 실행될 때마다 우리는 Gradle Doctor plugin 출력remote build-cache benchmark report을 사용하여 네트워크 대역폭과 지연을 감시한다.

    가치 제안


    주요 가치 주장은 캐시 노드를 복제함으로써 개발자의 로컬 구축 시간이 현저히 줄어든다는 것이다.그 효과는 더욱 빠른 피드백 주기 & 매우 만족스러운 개발자 체험이 될 것이다.

    Gradle Enterprise 연결


    원격 캐시 노드를 Gradle Enterprise 설치에 연결하는 과정은 매우 간단합니다.

    (1)Gradle Enterprise의 노드에 대한 레코드 생성


    Gradle Enterprise dashboard/cache-admin에 액세스한 후 왼쪽 메뉴에서 노드를 선택합니다.원격 노드 > 새 노드 생성 부분에서 노드의 이름을 입력한 다음 새 노드 생성 을 클릭합니다.
    이 예에서, 우리는 홍두라스에서 온 새로운 엔지니어가 팀에 가입했다고 가정한다.

    홍두라스 노드는 현재 기존 노드 부분에 열거될 것이다.
    노드당 1개key와 1개secret가 할당됩니다.노드는 키와 비밀번호를 설정해야 합니다.

    The secret is only viewable for 5 minutes after node creation. If the node secret is lost, use the regenerate function to issue a new secret which will then be viewable for 5 minutes.
    See screenshot below:



    (2) 그라델 기업 등록


    이제 build cache 노드를 계속 등록하고 Gradle Enterprise 설치와 연결합니다.이 등록은 중앙 집중식 모니터링과 캐시 항목 복제를 지원하며, 이것은 추가 기능입니다.
    등록은 웹 인터페이스나 프로필을 통해 설정할 수 있습니다.이 예에서 웹 인터페이스를 통해 설정할 것입니다.

    (i) 네트워크 인터페이스 등록
    브라우저에서 캐시 노드를 생성하는 웹 인터페이스를 엽니다.웹 인터페이스의Gradle Enterprise 부분을 주목하고 Settings 하단 목록을 펼칩니다.
    연결할 Gradle Enterprise 서버에 대한 세부 정보를 사용하여 노드를 구성합니다.이러한 작업은 다음과 같습니다.
  • Gradle Enterprise 서버~연결된 Gradle Enterprise 인스턴스의 URL을 원합니다.
  • 내 주소 ~ 캐시 노드를 생성하는 공공 주소입니다.
  • 키 ~ 이 노드의 식별 키입니다.위의 복제 절차를 통해Gradle Enterprise에서 얻은 것입니다.
  • 시크릿 ~ 이 노드의 시크릿 값입니다.위의 복제 절차를 통해Gradle Enterprise에서 얻은 것입니다.

  • 저장 버튼을 클릭합니다.설치가 올바르면 노드가Gradle Enterprise 인스턴스에 성공적으로 연결되어 복제에 사용될 수 있습니다.

    노드 선택을 복제하는Gradle 구축 스크립트 솔루션


    현재 우리는 캐시 노드를 설정했으니, 우리의 구축 스크립트 해결 방안을 설명할 때가 되었다.이 스크립트는 개발자들이 더 좋은 네트워크 링크를 가진 캐시 노드를 사용할 수 있도록 한다.
    이 스크립트는 Android project repo에서 찾을 수 있습니다.이 프로젝트는 생성 스캐너를 생성하고 캐시를 생성하는 기술을 사용하도록 설정되었습니다.
    주목해야 할 세 가지 주요 파일은 다음과 같습니다.
  • 캐시 노드 구성을 생성합니다.groovy
  • 건조.그라델(프로젝트 레벨)
  • 설치.그라델

  • (i) 캐시 노드 구성을 구성합니다.대단하다
    이 파일에는 Gradle Enterprise 인스턴스에 연결된 모든 구축 캐시 노드의 제목과 URL이 들어 있습니다.
    environments {
        default_node {
            nodeTitle = '# Default Build Cache Node'
            nodeUrl = 'https://gradle-enterprise.your-domain.com/cache/'
        }
    
        east_africa_node {
            nodeTitle = '# East Africa Build Cache Node'
            nodeUrl = 'https://east.xx.yyy.zzz/cache/'
        }
    
        west_africa_node {
            nodeTitle = '# West Africa Build Cache Node'
            nodeUrl = 'https://west.xx.yyy.zzz/cache/'
        }
    
        us_west_node {
            nodeTitle = '# US West Build Cache Node'
            nodeUrl = 'https://us-west.xx.yyy.zzz/cache/'
        }
    
        honduras_node {
            nodeTitle = '# Honduras Build Cache Node'
            nodeUrl = 'https://honduras.xx.yyy.zzz/cache/'
        }
    }
    
    사용자가 선택한 노드에 따라 제목과 URL 경로가 노드 선택 과정에서 생성된 build-cache-node-config.properties 파일로 출력됩니다.

    (2) 건설.그라델
    프로젝트 단계의gradle 파일입니다.개발자가 선택한 캐시 노드를 포함하는 코드 영역build-cache-node-config.properties을 생성합니다.
    // region Build Cache Node Replication Setup
    def loadBuildCacheNodes() {
        def node_title = hasProperty('node') ? node: 'default_node'
        println "Current Build Cache Node: " + node_title
    
        def configFile = file('build-cache-node-config.groovy')
        def config = new ConfigSlurper(node_title).parse(configFile.toURL())
        project.ext.config = config
    }
    
    task setBuildCacheNode {
        doLast {
            if (project.hasProperty('node')) {
                loadBuildCacheNodes()
    
                new File(rootDir, "build-cache-node-config.properties").text =
                        """ $config.nodeTitle \n replicated_build_cache_node=$config.nodeUrl"""
    
                println "nodeTitle:  $config.nodeTitle"
                println "nodeUrl:  $config.nodeUrl"
    
            } else {
                // empty
            }
        }
    }
    
    task setEastAfricaBuildCacheNode() {
        group = "build setup"
        description = "Configures the remote build cache url for devs in East Africa"
    
        doFirst {
            project.ext.set("node", "east_africa_node")
        }
        finalizedBy "setBuildCacheNode"
    }
    
    task setWestAfricaBuildCacheNode() {
        group = "build setup"
        description = "Configures the remote build cache url for devs in West Africa"
    
        doFirst {
            project.ext.set("node", "west_africa_node")
        }
        finalizedBy "setBuildCacheNode"
    }
    
    task setUSABuildCacheNode() {
        group = "build setup"
        description = "Configures the remote build cache url for devs in the United States"
    
        doFirst {
            project.ext.set("node", "us_west_node")
        }
        finalizedBy "setBuildCacheNode"
    }
    
    task setHondurasBuildCacheNode() {
        group = "build setup"
        description = "Configures the remote build cache url for devs in Honduras"
    
        doFirst {
            project.ext.set("node", "honduras_node")
        }
        finalizedBy "setBuildCacheNode"
    }
    
    //endregion
    
    loadBuildCacheNodes () - 이 함수는 파일에서 사용할 수 있는 노드를 불러오고 build-cache-node-config.groovy 작업에 전달합니다.
    setBuildCacheNode - 이 작업은 사용자가 선택한 노드를 입력으로 받아들이고 캐시 노드 제목과 URL을 생성하는 새 파일을 만듭니다.
    set East Africa Build Cache Node, set West Africa Build Cache Node, set Honduras Build Cache Node - 이 작업들은 강조된 영역 설정에 따라 필요한 노드를 설정하고 이 노드를 입력으로 setBuildCacheNode 작업에 전달합니다.

    (3) 환경.그라델
    이gradle 파일에 포함된 build-cache-node-config.properties 클립에는 프로젝트가 작업의 복사 캐시 노드 URL을 추출할 것을 확인하는 논리가 추가되었습니다.
    remote(HttpBuildCache) {
    
            // Create a variable called buildCacheNodesPropertiesFile and initialize it to your
            // build-cache-nodes.properties file, in the rootProject folder.
            def buildCacheNodesPropertiesFile = new File("build-cache-node-config.properties")
    
            if (!buildCacheNodesPropertiesFile.exists()) {
                url = "https://gradle-enterprise.your-domain.com/cache/"
            } else {
                // Initialize a new Properties() object called buildCacheNodesProperties
                def buildCacheNodesProperties = new Properties()
    
                // Load the build-cache-nodes.properties file into the buildCacheNodesProperties object.
                buildCacheNodesProperties.load(new FileInputStream(buildCacheNodesPropertiesFile))
    
                if (buildCacheNodesProperties != null
                        && buildCacheNodesProperties.containsKey('replicated_build_cache_node')) {
    
                    // Set the dev specified build cache node url
                    url = buildCacheNodesProperties['replicated_build_cache_node']
                } else{
                    // Set the default build cache node url
                    url = buildCacheNodesProperties['default_build_cache_node']
                }
            }
    ...
        }
    
    위의 논리는 기본적으로 setBuildCacheNode 파일의 내용을 읽고 우리의 프로젝트가 선택한 복사 노드를 이용할지 기본 내장 캐시 노드를 되돌려줄지 확인합니다.

    캐시 노드 선택 프로세스 구축


    현재Gradle Enterprise, 캐시 노드 복제 구축,Gradle 구축 스크립트의 내부 작업 원리를 이해했고 이어서 캐시 노드 구축 선택 과정을 소개합니다.
    우리는 IDE를 통해 이를 실현할 것입니다.선택한 IDE는 Android Studio입니다.
    현재 개발자가 있는 주요 4개 지역에는 4개의 구축 캐시 노드가 있습니다.
    동아프리카
  • remote(HttpBuildCache).
  • build-cache-node-config.properties서아프리카.
  • east_africa_node는 미국 서해안에 적용된다.
  • west_africa_node온두라스.(이 블로그에서 만든 노드)
  • Android Studio에서 Gradle 탭을 선택하고 us_west_node 그룹 작업을 엽니다.이렇게 하면 각 영역에서 사용할 수 있는 캐시 노드 생성 작업이 표시됩니다.

    선호하는gradle 작업(setHondurasBuildCacheNode)을 누르면 IDE의Build 옵션 카드에서 다음 출력이 생성됩니다.
    4:19:56 PM: Executing task 'setHondurasBuildCacheNode'...
    
    Executing tasks: [setHondurasBuildCacheNode] in project /Projects/Android/gradle-build-cache-node-replication
    
    > Task :setHondurasBuildCacheNode
    
    > Task :setBuildCacheNode
    Current Build Cache Node: honduras_node
    nodeTitle:  # Honduras Build Cache Node
    nodeUrl:  https://honduras.xx.yyy.zzz/cache/
    
    BUILD SUCCESSFUL in 552ms
    2 actionable tasks: 2 executed
    
    Publishing build scan...
    https://gradle.com/s/s3x2bmklo2vjc
    
    4:19:58 PM: Task execution finished 'setHondurasBuildCacheNode'.
    
    이 작업은 프로젝트의 루트 단계에서 honduras_node 파일을 생성합니다.

    NOTE: Changes to this file are not tracked by source control.



    또한 브라우저에서 생성된 구축 스캔을 열면 저희 프로젝트가 홍두라스 캐시 노드를 사용하고 있는지 확인합니다.

    NOTE: The 4 Gradle tasks can also be run directly from the command line:


    ./gradlew setUSABuildCacheNode
    
    ./gradlew setEastAfricaBuildCacheNode
    
    ./gradlew setWestAfricaBuildCacheNode
    
    ./gradlew setWestAfricaBuildCacheNode
    

    이게 다야.


    나는 네가 이것이 매우 유용하다고 생각하기를 바란다.만약 다른 독자들이 위에서 언급하지 않은 어떤 구체적인 내용에서 이익을 얻을 것이라고 생각한다면 아래의 평론 부분에서 마음대로 언급하십시오.
    즐겨라!

    좋은 웹페이지 즐겨찾기