GitLab Duo 사용 사례

다음 사용 사례는 GitLab Duo를 사용한 실제 예제, 연습 및 워크플로를 제공합니다. 다음을 배우세요: - 기존 소스 코드를 리팩터링하는 방법. - GitLab Duo Root Cause Analysis를 사용하여 문제를 디버깅하는 방법. - 보안 취약점을 해결하는 방법.

참고: 자체 관리 GitLab을 사용하는 경우: 최상의 사용자 경험과 결과를 위해 GitLab 17.2 이후 버전이 필요합니다. 이전 버전에서는 계속 작동할 수 있지만 경험은 저하될 수 있습니다.

개발 과제 해결을 위해 GitLab Duo 사용

C# 애플리케이션으로 시작

이 예에서는 C# IDE를 열고 GitLab Duo가 활성화되어 있는지 확인한 다음, GitLab Duo의 AI 기능을 사용하여 더 효율적으로 작업하는 방법을 살펴보세요.

GitLab REST API에 대한 CLI 도구

GitLab Duo Coffee Chat: C# 시작하기를 시청하세요.

도전 과제는 GitLab REST API를 쿼리하는 CLI 도구를 만드는 것입니다.

  • 새 C# 프로젝트를 시작하고 dotNET CLI를 사용하는 방법에 대해 GitLab Duo Chat에 물어봅니다:

    VS Code에서 빈 C# 콘솔 애플리케이션을 생성하는 방법을 알려주세요.
    
  • Code Suggestions를 사용하여 새 코드 주석으로 REST API 클라이언트를 생성합니다:

    // REST API에 연결하고 응답 출력
    
  • 생성된 소스 코드에 설명이 필요한 경우: 생성된 소스 코드의 REST API 호출 작동 방법을 이해하기 위해 코드 작업 /explain을 사용합니다.

코드 추천 주석에서 생성된 소스 코드 이후에 CI/CD를 구성해야 합니다.

  • C#에 대한 .gitignore 파일과 .gitlab-ci.yml 구성에 대한 모베스트 프랙티스를 GitLab Duo Chat에서 요청합니다:

    C# 프로젝트용 .gitignore 및 .gitlab-ci.yml 구성을 보여주세요.
    
  • CI/CD 작업이 실패하는 경우, 루트 원인 분석을 사용하여 CI/CD 작업 실패 문제 해결 또는 오류 메시지를 GitLab Duo Chat에 복사하여 도움을 요청합니다:

    CI/CD 오류 설명: 현재 .NET SDK는 .NET 8.0을 지원하지 않습니다.
    
  • 나중에 테스트를 생성하려면 /refactor 코드 작업을 사용하여 선택된 코드를 함수로 리팩터링하도록 GitLab Duo에 요청합니다.

  • Chat은 또한 C# 비동기 및 대기 예약을 실제 예제와 함께 설명하거나 C# 컴파일러 오류에 대해 설명할 수 있습니다.

    C#에서 비동기 및 대기를 실제 예제와 함께 설명해주세요.
    
    오류 CS0122: 'Program'은(는) 해당 보호 수준으로 인해 접근할 수 없습니다.
    
  • /tests 코드 작업을 사용하여 테스트를 생성합니다.

다음 질문은 C# 솔루션에서 생성된 테스트를 어디에 놓아야 하는지입니다. 초보자라면 응용 프로그램과 테스트 프로젝트를 동일한 솔루션 수준에 두어야 가져오기 문제를 피할 수 있다는 것을 알 수 없을 것입니다.

  • GitLab Duo Chat은 질문을 해야하며, 연마하여 최선의 결과를 얻도록 도와줄 수 있습니다:

    VS Code에서 C# 및 어플리케이션에서 프로젝트에 참조를 추가하는 방법을 알려주세요.
    
    기존 솔루션의 다른 프로젝트에 참조를 추가할 수 있는 C# .csproj 파일에 추가할 수 있는 XML 구성을 제공해주세요.
    
  • 때로는 더 나은 결과를 얻기 위해 프롬프트를 정교화해야 합니다. /public 클래스로 리팩터링 프롬프트는 나중에 테스트 프로젝트에서 액세스할 수 있는 코드에 대한 제안을 생성합니다.

    /public 클래스로 리팩터링
    
  • .gitlab-ci.yml 파일에서 어떻게 테스트를 실행할지 Chat에 물어보기 위해 /refactor 코드 작업을 사용할 수도 있습니다.

    테스트를 실행할 작업을 추가하기(테스트 프로젝트)
    

자원:

C++ 애플리케이션 개선

C++ 응용 프로그램 개선

이 예에서는 단일 main 함수가 있는 기존 소스 코드가 있습니다. 코드가 반복되고 테스트할 수 없를 정도로 구성되어 있습니다.

GitLab Duo Coffee Chat: C++, SQLite 및 CMake 리팩터링을 시청하세요.

소스 코드를 재사용 가능하고 테스트 가능한 함수로 리팩터링하는 방법:

  1. GitLab Duo Chat에 함수로 리팩터링이라는 정교화된 프롬프트를 사용하여 소스 코드를 선택하고 리팩터링하도록 요청합니다:

    함수로 리팩터링
    

    이 리팩터링 단계가 선택된 전체 소스 코드에 대해 작동하지 않을 수 있습니다.

  2. 리팩터링 전략을 기능 블록으로 분할합니다. 예를 들어, 데이터베이스의 모든 삽입, 업데이트 및 삭제 작업을 반복합니다.

  3. 새롭게 생성된 함수에 대한 테스트를 생성하기 위해 다시 소스 코드를 선택하고 /tests 코드 작업을 사용합니다. 특정 테스트 프레임워크 지침을 포함합니다:

    CTest 테스트 프레임워크를 사용하여 테스트 생성
    
  4. 응용 프로그램이 Boost.Test 프레임워크를 사용하는 경우 프롬프트를 정교화합니다:

    Boost.Test 프레임워크를 사용하여 테스트 생성
    

자원:

C++ 함수를 객체 지향 코드로 리팩터링

이 예에서는 기존 소스 코드가 함수로 래핑되어 있습니다. 나중에 더 많은 데이터베이스 유형을 지원하기 위해 코드를 클래스 및 객체 상속으로 리팩터링해야 합니다.

GitLab Duo Coffee Chat: C++ 함수를 OOP 클래스로 리팩터링에서 이러한 단계의 설명을 확인하세요.

클래스 작업 시작
  • GitLab Duo Chat에게 기본 데이터베이스 클래스에 대한 객체 지향 패턴을 구현하는 방법 및 SQLite 클래스에서 상속하는 방법을 문의하십시오.

    C++를 사용하여 기본 클래스를 활용한 일반적인 데이터베이스 구현과 SQLite 특정 클래스에 대한 설명을 제공하세요. 소스 예제와 필요한 단계를 설명해 주세요.
    
  • 학습 커브에는 구현 클래스의 순수 가상 함수 및 가상 함수 재정의에 대해 GitLab Duo Chat에게 물어보는 것이 포함됩니다.

    순수 가상 함수(pure virtual function)가 무엇이며, 해당 클래스를 상속하는 개발자에게 필요한 사항은 무엇입니까?
    
  • 코드 작업은 코드 리팩터링을 도울 수 있습니다. C++ 헤더 파일에서 함수를 선택하고 정제된 프롬프트를 사용하십시오.

    /refactor를 사용하여 공개 함수로 이루어진 클래스로 리팩터링하고, 비공개 경로/DB 속성을 클래스에 상속하여 기본 클래스 DB로 리팩터링하세요.
    
    /refactor를 사용하여 순수 가상 함수로 된 기본 클래스를 만들고, SQLite 특정 부분을 제거하세요.
    
  • GitLab Duo Chat은 또한 생성자 오버로딩, 객체 초기화, 그리고 공유 포인터를 통한 최적화된 메모리 관리에 대한 지침을 제공합니다.

    cpp 파일에서 클래스에 대한 함수 구현을 어떻게 추가합니까?
    
    클래스 속성에 값을 클래스 생성자 호출을 통해 전달하는 방법은 무엇입니까?
    
더 나은 답변 찾기
  • 다음 질문은 충분한 문맥을 제공하지 못했습니다.

    단순 오버라이드 대신 가상 오버라이드를 사용해야합니까?
    
  • 대신 C++ 문맥에서 순수 가상 함수를 구현할 때 가상 함수 오버라이드를 사용해야하는지 아니면 단순 함수 오버라이드를 사용해야하는지에 대해 더 많은 문맥을 추가하여 더 나은 답변을 얻으십시오.

    상속된 클래스에서 순수 가상 함수를 구현할 때 가상 함수 오버라이드 대신 단순 함수 오버라이드를 사용해야합니까? 문맥은 C++입니다.
    
  • 상대적으로 복잡한 질문은 새로 생성된 클래스에서 객체를 생성하고 특정 함수를 호출하는 방법입니다.

    C++에서 클래스에서 객체를 인스턴스화하고, SQLite DB 경로로 생성자를 호출하고 함수를 호출하는 방법은 무엇입니까? 포인터를 선호합니다.
    
  • 결과는 도움이 될 수 있지만, 공유 포인터와 필요한 소스 코드 헤더에 대한 정제가 필요합니다.

    C++에서 클래스에서 객체를 인스턴스화하고, SQLite DB 경로로 생성자를 호출하고 함수를 호출하는 방법은 무엇입니까? 공유 포인터를 선호합니다. 필요한 헤더 파일을 설명하세요.
    
  • 코드 제안은 std::shared_ptr 포인터 산술의 올바른 구문을 생성하는 데 도움이 되며 코드 품질을 향상시킵니다.

    // 변수에 SQLite 경로 정의, 기본값은 database.db
    
    // SQLite 클래스의 공유 포인터 생성
    
    // OpenConnection을 사용하여 데이터베이스 연결 열기
    
코드 리팩터링
  • 소스 코드를 리팩터링한 후에 컴파일러 오류가 발생할 수 있습니다. Chat에게 이를 설명하도록 요청하십시오.

    'db'는 'SQLiteDB'의 비공개 멤버입니다. 오류를 설명해 주십시오.
    
  • 효율적인 편집을 위해 특정 SQL 쿼리 문자열을 여러 줄로 리팩터링해야 합니다.

    std::string sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL)";
    
  • 소스 코드를 선택하고 /refactor 코드 작업을 사용하십시오.

    /refactor를 사용하여 stringstream으로 리팩터링하세요.
    
  • 또한 C++에서 유틸리티 함수를 클래스에 정적 함수로 리팩터링하고 그 함수를 호출하는 방법에 대해 Chat에게 물어보십시오.

    정적 함수를 제공하는 클래스로 리팩터링하여 사용자 코드를 호출하는 방법은 무엇입니까?
    
    /refactor를 사용하여 유틸리티 함수를 클래스에 정적 함수로 리팩터링하세요.
    

소스 코드를 리팩터링한 후 데이터베이스 유형에 대한 기반 구축이 완료되었으며 전반적인 코드 품질이 향상되었습니다.

자원:

Kotlin 애플리케이션 설명, 테스트 및 리팩터링

이 예제에서는 Kotlin 코드 생성 프롬프트의 adventure 애플리케이션을 분석하여 리팩터링하고 테스트를 수행해야 합니다.

현재의 소스 코드는 다음과 같습니다:

package org.example

// 텍스트 어드벤처 생성
// 황금 LEGO 브릭 탐색
// 시각적 도우미 추가
// 게임 오버를 위한 무작위 타이머 함정 사용
// 텍스트 어드벤처 생성
fun createTextAdventure() {
    println("황금 LEGO 브릭 어드벤처에 오신 것을 환영합니다!")
    println("어두운 방에 자신을 발견합니다. 무엇을 하시겠습니까?")

    var gameOver = false
    while (!gameOver) {
        println("1. 황금 LEGO 브릭 탐색")
        println("2. 방 조사")
        println("3. 종료")

        val choice = readLine()?.toIntOrNull() ?: 0
        when (choice) {
            1 -> searchForBrick()
            2 -> examineRoom()
            3 -> {
                println("안녕히 가십시오!")
                gameOver = true
            }
            else -> println("유효하지 않은 선택입니다. 다시 시도하세요.")
        }
    }
}

fun searchForBrick() {
    println("주의 깊게 방을 살펴 황금 LEGO 브릭의 흔적을 찾습니다.")
    if (Math.random() < 0.2) {
        println("축하합니다! 황금 LEGO 브릭을 찾았습니다!")
    } else {
        println("찾으려는 것이 없습니다. 다시 시도해야 합니다.")
    }
}

fun examineRoom() {
    println("주변을 살펴 세부를 확인합니다.")
    println("어둠 속에서 옆구리를 가린 방입니다.")
    println("북쪽에 문이 있고, 방의 중앙에 탁자가 있습니다.")
}

fun main() {
    createTextAdventure()
}
  1. IDE에서 소스 코드를 선택한 후 우클릭하여 Duo Chat에게 코드 설명을 요청하십시오.
  2. 버그, 최적화 팁 또는 취약점에 대해 더 많이 배우기 위해 프롬프트를 정제하십시오.

    /explain 버그 및 개선에 중점
    
    제공된 코드는 Kotlin으로 작성된 단순한 텍스트 어드벤처 게임입니다. 사용자가 황금 LEGO 브릭을 탐색하거나 방을 조사하도록 허용합니다. 코드는 기능적이지만 몇 가지 잠재적인 버그와 개선할 부분이 있습니다.
    
    1. 잠재적인 버그:
    
    searchForBrick() 함수는 Math.random()을 사용하여 플레이어가 황금 LEGO 브릭을 찾는지를 결정합니다. 하지만 이 함수는 플레이어가 브릭을 찾을 경우를 처리하지 않습니다. 플레이어가 브릭을 찾은 후에도 게임이 계속되어 버그가 발생합니다.
    
    2. 개선 사항:
    
    게임 오버 조건: 플레이어가 황금 LEGO 브릭을 찾았을 때 적절한 게임 오버 조건이 있어야 합니다. 별도의 게임 상태를 추적하여 브릭이 발견되었는지 여부를 확인할 수 있도록 하거나 불리언 플래그를 도입하여 이를 달성할 수 있습니다.
    
  3. 선택한 코드에 대해 테스트를 생성하기 위해 /tests 명령을 사용하십시오.

    /tests
    
    코드를 테스트하기 위해 Kotlin용 JUnit을 사용할 수 있습니다. 다음과 같은 테스트를 작성할 수 있습니다:
    
    import org.junit.jupiter.api.Test
    import java.io.ByteArrayInputStream
    import java.io.ByteArrayOutputStream
    import java.io.PrintStream
    
    class TextAdventureTest {
    
        private val standardOut = System.out
        private val standardIn = System.`in`
    
        @Test
        fun `test searchForBrick success`() {
            val outContent = ByteArrayOutputStream()
            System.setOut(PrintStream(outContent))
    
            searchForBrick()
    
            val output = outContent.toString().trim()
            assert(output.contains("축하합니다! 황금 LEGO 브릭을 찾았습니다!"))
    
            System.setOut(standardOut)
        }
    
      ...
    }
    

모든 것을 테스트했음을 확인한 후 Chat에게 선택한 코드를 리팩터링하도록 요청하십시오.

/refactor 버그 수정, 사용성 향상

...

개선 사항:

메뉴 출력 로직을 명확한 코드 조직과 가독성을 위해 별도의 printMenu 함수로 추출하였습니다.
Kotlin 표준 라이브러리와의 더 나은 호환성을 위해 Random.nextDouble()를 사용하도록 변경하였습니다.
메뉴를 출력한 후 사용자가 선택할 수 있도록 입력을 받는 프롬프트를 추가하였습니다.
createTextAdventure 함수에서 불필요한 gameOver 변수 초기화를 제거했습니다. 이미 createTextAdventure 함수에서 값이 할당되었기 때문입니다.
searchForBrick 함수에 추가 로직 또는 게임 오버 조건을 추가해야 할 수 있다는 것을 상기시키는 주석을 추가했습니다.
이러한 변경으로 코드의 가독성, 유지보수성, 사용자 경험을 향상시킬 수 있습니다.

리팩터링된 소스 코드는 다음과 같을 수 있습니다:

package org.example

import kotlin.random.Random

// 텍스트 어드벤처 생성
// 황금 LEGO 브릭 탐색
// 시각적 도우미 추가
// 게임 오버를 위한 무작위 타이머 함정 사용
// 텍스트 어드벤처 생성
fun createTextAdventure() {
    println("황금 LEGO 브릭 어드벤처에 오신 것을 환영합니다!")
    println("어둠 속 방에서 자신을 발견합니다. 무엇을 하시겠습니까?")

    var gameOver = false
    while (!gameOver) {
        printMenu()
        val choice = readLine()?.toIntOrNull()
        when (choice) {
            1 -> searchForBrick()
            2 -> examineRoom()
            3 -> {
                println("안녕히 가십시오!")
                gameOver = true
            }
            else -> println("유효하지 않은 선택입니다. 다시 시도하세요.")
        }
    }
}

fun printMenu() {
    println("1. 황금 LEGO 브릭 탐색")
    println("2. 방 조사")
    println("3. 종료")
    print("선택을 입력하세요: ")
}

fun searchForBrick() {
    println("주의 깊게 방을 살펴 황금 LEGO 브릭의 흔적을 찾습니다.")
    if (Random.nextDouble() < 0.2) {
        println("축하합니다! 황금 LEGO 브릭을 찾았습니다!")
        // 여기에 추가 로직이나 게임 오버 조건을 추가하세요
    } else {
        println("찾으려는 것이 없습니다. 다시 시도해야 합니다.")
    }
}

fun examineRoom() {
    println("주변을 살펴 세부를 확인합니다.")
    println("어둠 속에서 옆구리를 가린 방입니다.")
    println("북쪽에 문이 있고, 방의 중앙에 탁자가 있습니다.")
}

fun main() {
    createTextAdventure()
}

PowerShell로 시작하기

참고: PowerShell 지원은 실험적입니다.

  1. 현재 디렉토리의 파일 크기를 출력하는 PowerShell 스크립트를 시작하는 방법을 묻는다.

    현재 디렉토리의 파일 크기를 출력하는 PowerShell 스크립트를 시작하는 방법
    

    또는, 소스 코드를 생성하기 위해 Code Suggestions을 사용할 수 있습니다.

  2. 다음 내용으로 get-file-sizes.ps1라는 새 스크립트를 만듭니다:

    # 디렉토리의 파일 수집 및 크기 출력
    
  3. Code Suggestions가 프롬프트를 완료할 때까지 기다린 다음, 다음 프롬프트를 추가하여 다양한 출력 형식을 실험해 볼 수 있습니다:

    # 디렉토리의 파일 수집 및 크기 출력
    
    $directory = Read-Host -Prompt "파일 크기를 얻을 디렉토리 경로를 입력하세요"
    $files = Get-ChildItem -Path $directory -File
    foreach ($file in $files) {
        $fileSize = [Math]::Round(($file.Length / 1KB), 2)
        Write-Host "$($file.Name) - $fileSize KB"
    }
    
    # 위의 코드를 반복하지만 결과를 CSV 파일에 저장합니다
    
  4. 다른 내보내기 형식에 대한 프롬프트를 추가로 반복하거나 Code Suggestions 자동 완성을 사용할 수 있습니다. 예를 들어:

# 디렉토리의 파일 수집 및 크기 출력

$directory = Read-Host -Prompt "파일 크기를 얻을 디렉토리 경로를 입력하세요"
$files = Get-ChildItem -Path $directory -File
foreach ($file in $files) {
    $fileSize = [Math]::Round(($file.Length / 1KB), 2)
    Write-Host "$($file.Name) - $fileSize KB"
}

# 위의 코드를 반복하되 결과를 CSV 파일에 저장합니다
$csvFile = "$directory\file-sizes.csv"
$fileData = foreach ($file in $files) {
    [PSCustomObject]@{
        FileName = $file.Name
        FileSize = [Math]::Round(($file.Length / 1KB), 2)
    }
}
$fileData | Export-Csv -Path $csvFile -NoTypeInformation
Write-Host "$csvFile에 파일 크기가 저장되었습니다."

# 위의 코드를 반복하되 결과를 JSON 파일에 저장합니다
$jsonFile = "$directory\file-sizes.json"
$fileData | ConvertTo-Json | Out-File -FilePath $jsonFile
Write-Host "$jsonFile에 파일 크기가 저장되었습니다."

# 위의 코드를 반복하되 결과를 XML 파일에 저장합니다
$xmlFile = "$directory\file-sizes.xml"
$fileData | ConvertTo-Xml -NoTypeInformation | Out-File -FilePath $xmlFile
Write-Host "$xmlFile에 파일 크기가 저장되었습니다."

# 위의 코드를 반복하되 결과를 HTML 파일에 저장합니다
$htmlFile = "$directory\file-sizes.html"
$fileData | ConvertTo-Html -Property FileName, FileSize | Out-File -FilePath $htmlFile
Write-Host "$htmlFile에 파일 크기가 저장되었습니다."

# 위의 코드를 반복하되 결과를 TXT 파일에 저장합니다
$txtFile = "$directory\file-sizes.txt"
$fileData | Out-File -FilePath $txtFile
Write-Host "$txtFile에 파일 크기가 저장되었습니다."

취약점 설명하고 해결하기

C 코드의 취약점

이 예에서 C에서 감지된 보안 취약점은 GitLab Duo의 도움으로 수정되어야 합니다.

이 단계들을 보려면 GitLab Duo Coffee Chat: 취약점 해결 챌린지 #1를 시청하세요.

이 소스 코드 스니펫버퍼 오버플로우와 관련된 보안 취약점을 도입합니다:

    strcpy(region, "Hello GitLab Duo Vulnerability Resolution challenge");

    printf("region의 내용: %s\n", region);

SAST 보안 스캐너는 문제를 감지하고 보고할 수 있습니다. 문제를 이해하려면 취약점 설명을 사용하세요. 취약점 해결은 MR을 생성하는 데 도움이 됩니다. 제안된 변경 사항이 요구 사항에 맞지 않거나 문제를 일으킬 수 있는 경우 Code Suggestions 및 Duo Chat을 사용하여 개선할 수 있습니다. 예를 들어 다음과 같습니다:

  1. VS Code 또는 Web IDE를 열고 GitLab Duo를 사용하여 지침이 포함된 주석을 추가합니다:

        // 잠재적인 버퍼 오버플로우를 피합니다
    
        // 아래 가능한 AI 생성 코드
        strncpy(region, "Hello GitLab Duo Vulnerability Resolution challenge", pagesize);
        region[pagesize-1] = '\0';
        printf("region의 내용: %s\n", region);
    
  2. 제안된 코드를 삭제하고 대안적인 방법을 사용하기 위해 다른 주석을 사용합니다.

        // snprintf()을 사용하여 잠재적인 버퍼 오버플로우를 피합니다
    
        // 아래 가능한 AI 생성 코드
        snprintf(region, pagesize, "Hello GitLab Duo Vulnerability Resolution challenge");
    
        printf("region의 내용: %s\n", region);
    
  3. GitLab Duo Chat을 사용하여 질문하세요. /refactor 코드 작업은 다른 제안을 생성할 수 있습니다. 특정 알고리즘이나 함수를 원하는 경우 프롬프트를 개선하세요:

    /refactor using snprintf
    

리소스:

GitLab에 관한 질문에 답하다

이 예에서는 GitLab Duo Chat을 사용하여 문제를 해결합니다.

이 단계들을 보려면 GitLab Duo Coffee Chat: GitLab Duo Chat Challenge로 문제 해결하기를 시청하세요.

  • CI/CD 오류를 설명하기 위해 GitLab Duo Chat을 사용할 수 있습니다.

    이 CI/CD 오류를 설명하세요: build.sh: line 14: go command not found
    
  • 성급하게 입력하고 한 두 단어만 입력하면 어떻게 되나요?

    레이블
    
    이슈 레이블
    

    GitLab Duo Chat은 더 많은 문맥을 요청합니다.

  • 문제를 설명하고 해결책을 요청하는 완전한 문장으로 질문을 개선하세요.

    GitLab에서 레이블을 설명하세요. 효율적인 사용 예시를 제공하세요.
    

리소스:

루트 원인 분석 사용 사례

CI/CD 파이프라인 실패의 원인을 결정하기 위해 루트 원인 분석을 사용하세요. 다음 예시는 일반적인 오류를 설명하며, 루트 원인을 찾고 수정하는 연습을 장려합니다.

자세한 내용은 Developing GitLab Duo: Blending AI and Root Cause Analysis to fix CI/CD pipelines 블로그 게시물을 참조하세요.

Go 런타임 누락 분석

CI/CD 작업은 image 속성에서 생성된 컨테이너에서 실행될 수 있습니다. 컨테이너가 프로그래밍 언어 런타임을 제공하지 않으면, go 이진 파일을 참조하는 실행된 script 섹션이 실패합니다. 예를 들어, /bin/sh: eval: line 149: go: not found 오류 메시지는 이해하고 수정해야 합니다. 만약 컨테이너의 런타임 컨텍스트에서 go 명령어를 찾을 수 없다면, 여러 이유 때문일 수 있습니다:

  • 작업이 alpine과 같은 최소한의 컨테이너 이미지를 사용하고, Go 언어 런타임이 설치되지 않았을 수 있습니다.
  • 작업이 CI/CD 구성에 지정된 잘못된 기본 컨테이너 이미지를 사용하거나, default 키워드를 사용할 수 있습니다.
  • 작업이 컨테이너 이미지 대신 셸 실행기를 사용합니다. 호스트 운영 체제가 손상되었거나, Go 언어 런타임이 설치되지 않았거나, 구성되지 않을 수 있습니다.

프로젝트 도전: 루트 원인 분석 - Go GitLab 릴리스 가져오기는 Go Tanuki 앱에 대한 CI/CD 문제를 분석하고 수정하는 연습을 제공합니다. 이 연습에서 builddocker-build 작업이 실패합니다. 문제를 해결하면 CI/CD 파이프라인이 성공하고 build 작업이 출력됩니다. solution/ 디렉토리는 루트 원인 분석 후 두 가지 가능한 해결책을 제공합니다.

GitLab Duo를 사용하여 GitLab에 기여하기

GitLab Duo 사용은 GitLab 코드베이스에 기여하는 데 중점을 두며, 고객이 더 효율적으로 기여하는 방법을 다룹니다.

GitLab 코드베이스는 크고, 때로는 복잡한 알고리즘이나 애플리케이션별 구현을 이해해야 합니다. 자세한 내용은 architecture components를 확인하세요.

프론트엔드 기여: 프로필 설정

이 예에서는 GitLab 프로필 페이지를 업데이트하고 소셜 네트워크 설정을 개선하는 것이 도전입니다.

녹화본은 여기에서 시청하세요: GitLab Duo Coffee Chat: Code Suggestions 및 채팅을 활용한 GitLab 기여

GitLab Duo 채팅을 사용하여 코드를 설명하고 리팩터링하고 테스트를 생성할 수 있습니다. 코드 제안을 통해 기존 코드를 완성하고 Ruby, Go 또는 VueJS에서 새로운 함수와 알고리즘을 생성할 수 있습니다.

  1. /explain 코드 작업을 사용하여 선택한 코드 섹션을 설명하고 HAML 템플릿이 작동하는 방법을 배울 수 있습니다.
  2. /explain how HAML rendering works와 같이 코드 작업 프롬프트를 세분화할 수 있습니다.

또 다른 방법으로, 직접 채팅 프롬프트에 작성할 수 있습니다. 예를 들어:

haml에서 select를 채우는 방법

리팩터링 예제는 다음을 포함합니다:

  1. /refactor into a HAML dropdown
  2. 기존 UI 양식 코드를 검토한 후, 프롬프트를 /refactor into a HAML dropdown with a form select로 세분화할 수 있습니다.

GitLab Duo 채팅은 오류 디버깅을 도왔으며, 오류 메시지에 접두사를 추가했습니다:

please explain this error: undefined method `icon` for

코드 생성 프롬프트

다음 예시는 GitLab Duo에서 지원하는 언어에 대한 코드 생성 프롬프트를 제공합니다. 코드 생성 프롬프트를 세분화하기 위해 여러 줄의 주석을 사용할 수 있습니다.

이 예시는 개발자 관련 팀에서 유지보수하는 GitLab Duo Prompts 프로젝트에 저장되어 있습니다. 이 예시는 테스트를 통해 확인했습니다. 여러분의 환경에 맞게 검토하고 수정해야 합니다.

C 코드 생성 프롬프트

I/O, 성능, 디스크 사용량 및 TCP 지연을 수집하고 출력하는 Linux 통계 도구를 생성하세요. 자세한 내용은 블로그 게시물 Top tips for efficient AI-powered Code Suggestions with GitLab Duo blog post에서 확인하세요.

// Linux 통계 도구 생성
// IO, 성능, 디스크 사용량, TCP 지연 수집
// 개요 출력

// 필요한 헤더 가져오기
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include <sys/statfs.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>

int main() {
    struct stat statbuf;

    if (stat("/etc", &statbuf) != 0) {
        perror("stat");
        return 1;
    }

    printf("IO Block Size: %ld\n", statbuf.st_blksize);

    // TODO: CPU 사용량, 디스크 사용량, 네트워크 지연 시간 측정 추가

AI가 생성한 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 c 디렉토리에서 사용할 수 있습니다.

C++ 코드 생성 프롬프트

HTTP 클라이언트로 작용하는 CLI 응용 프로그램을 생성하세요.

// CLI 앱을 HTTP 클라이언트로 생성
// 메인 함수 작성
// 모든 헤더 포함
// 프로그램 옵션 읽기: URL, API 엔드포인트, 기본 인증

#include <iostream>
#include <curl/curl.h>
#include <string>

int main(int argc, char** argv) {
  std::string url;
  std::string endpoint;
  std::string username;
  std::string password;

  // 명령줄 옵션 구문 분석
  // ...

  CURL* curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

    // 기본 인증 설정
    curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_easy_setopt(curl, CURLOPT_USERPWD, (username + ":" + password).c_str());

    CURLcode res = curl_easy_perform(curl);

    if(res != CURLE_OK) {
      std::cerr << "Request failed: " << curl_easy_strerror(res) << std::endl;
    }

    curl_easy_cleanup(curl);
  }

  return 0;
}

분산 파일 노드를 관리하는 애플리케이션을 생성하세요.

// 분산 파일 노드를 관리하는 애플리케이션을 생성
// 노드의 상태 개요 제공
// OOP 패턴을 사용하여 기본 파일 노드 정의
// 기본 파일로부터 상속된 특정 파일 시스템 추가

class FileNode {
public:
    std::string name;
    std::string ipAddress;
    int port;
    HealthState healthState;

    FileNode(std::string name, std::string ipAddress, int port)
        : name(name), ipAddress(ipAddress), port(port), healthState(HealthState::Healthy) {}

    void setHealthState(HealthState state) {
        healthState = state;
    }
};

class LocalFileNode : public FileNode {
public:
    std::string mountPoint;

    LocalFileNode(std::string name, std::string mountPoint)
        : FileNode(name, "127.0.0.1", 0), mountPoint(mountPoint) {}
};

class NetworkFileNode : public FileNode {
public:
    std::string user;
    std::string password;

    NetworkFileNode(std::string name, std::string ipAddress, int port, std::string user, std::string password)
        : FileNode(name, ipAddress, port), user(user), password(password) {}
};

int main(){

}

XDP 커널 이벤트에 연결되어 네트워크 트래픽을 측정하기 위한 eBPF 프로그램을 작성하세요. 이 프로그램은 Linux 커널에서만 작동합니다.

// XDP 커널 이벤트에 연결되고 네트워크 트래픽을 측정하는 eBPF 프로그램을 작성
// IP 주소별로 모든 패킷 카운팅
// 개요 출력
// 필요한 헤더 포함

#include <bpf/bpf.h>

struct data {
    __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
    __type(key, uint32_t);
    __type(value, uint64_t);
};

BPF_TABLE("array", int, long, counts, 1024);

int xdp_prog(struct xdp_md *ctx) {
    void* data_end = (void*)(long)ctx->data_end;
    void* data = (void*)(long)ctx->data;
    struct ethhdr *eth = data;

    if ((void*)eth + sizeof(*eth) <= data_end) {
        struct iphdr *ip = data + sizeof(*eth);
        if ((void*)ip + sizeof(*ip) <= data_end) {
            counts.increment(ip->saddr);
        }
    }

    return XDP_PASS;
}

AI가 생성한 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 c++ 디렉토리에서 사용할 수 있습니다.

C# 코드 생성 프롬프트

서로 다른 센서에서 의료 분석기 앱을 작성하고 데이터를 MSSQL에 저장합니다.

// 의료 분석기 앱 생성
// 다양한 센서로부터 데이터 수집
// 데이터를 MSSQL에 저장
// 센서 데이터에 액세스하는 방법 제공

using System.Data.SqlClient;

namespace MedicalAnalyzer
{
    public class SensorDataStore
    {
        private SqlConnection connection;

        public SensorDataStore()
        {
            // SQL Server 연결 생성
            connection = new SqlConnection("여기에 연결 문자열 입력");
        }

        public void StoreSensorData(SensorData data)
        {
            // 연결 열기
            connection.Open();

            // 데이터베이스에 센서 데이터 삽입
            var command = connection.CreateCommand();
            command.CommandText = "INSERT INTO SensorData (Timestamp, DeviceId, Value) " +
                                  "VALUES (@timestamp, @deviceId, @value)";
            command.Parameters.AddWithValue("@timestamp", data.Timestamp);
            command.Parameters.AddWithValue("@deviceId", data.DeviceId);
            command.Parameters.AddWithValue("@value", data.Value);
            command.ExecuteNonQuery();

            // 연결 닫기
            connection.Close();
        }

        public SensorData[] GetSensorData(DateTime startTime, DateTime endTime)
        {
            // 데이터베이스 조회 및 결과 반환
        }
    }
}

AI로 생성된 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 c# 디렉토리에서 확인할 수 있습니다.

CSS 코드 생성 프롬프트

/* 무지개를 만들기 위한 CSS 클래스 생성 */

@keyframes rainbow {
    0% {
        background-position: 0% 50%;
    }
    50% {
        background-position: 100% 50%;
    }
    100% {
        background-position: 0% 50%;
    }
}

.rainbow {
    background: linear-gradient(to right, #ff0000, #ff7700, #ffff00, #00ff00, #0000ff, #8b00ff);
    background-size: 600% 600%;
    animation: rainbow 30s ease infinite;
}

AI로 생성된 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 css 디렉토리에서 확인할 수 있습니다.

Go 코드 생성 프롬프트

Kubernetes를 위한 옵저버빌리티 응용 프로그램을 생성하고 클러스터 내의 컨테이너, 파드 및 서비스 상태를 읽고 출력합니다.

// Kubernetes 옵저버빌리티용 클라이언트 생성
// KUBECONFIG 환경 변수에서 쿠버네티스 구성 파일을 읽는 함수 생성
// 쿠버네티스 컨텍스트, 네임스페이스 default 생성
// 컨테이너, 파드, 서비스 상태를 검사하고 개요를 출력
// 필요한 패키지 가져오기
// main 패키지 생성

package main

import (
  "context"
  "fmt"
  "os"

  "k8s.io/client-go/kubernetes"
  "k8s.io/client-go/tools/clientcmd"

  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func main() {

  clientset := getClientset()
  namespace := "default"

  printPods(clientset, namespace)
  printServices(clientset, namespace)
  printContainers(clientset, namespace)

}

func getClientset() *kubernetes.Clientset {

  kubeconfig := os.Getenv("KUBECONFIG")

  config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
  if err != nil {
    panic(err)
  }

  clientset, err := kubernetes.NewForConfig(config)
  if err != nil {
    panic(err)
  }

  return clientset
}

func printPods(clientset *kubernetes.Clientset, namespace string) {

  pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
  if err != nil {
    panic(err)
  }

  fmt.Printf("%s 네임스페이스에 %d개의 파드가 있습니다\n", namespace, len(pods.Items))

}

func printServices(clientset *kubernetes.Clientset, namespace string) {

  services, err := clientset.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{})
  if err != nil {
    panic(err)
  }

  fmt.Printf("%s 네임스페이스에 %d개의 서비스가 있습니다\n", namespace, len(services.Items))

}

// 컨테이너 출력 함수 생성
// 개수를 수집하고 출력

func printContainers(clientset *kubernetes.Clientset, namespace string) {

    pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err)
    }

    var totalContainers int
    for _, pod := range pods.Items {
        totalContainers += len(pod.Spec.Containers)
    }

    fmt.Printf("%s 네임스페이스에 %d개의 컨테이너가 있습니다\n", namespace, totalContainers)

}

녹화 자료는 여기에서 확인할 수 있습니다.

Redis와 유사한 인메모리 키-값 저장소를 생성합니다. 자세한 설명은 블로그 글 GitLab Duo를 활용한 효율적인 AI 기반 코드 제안의 최상의 팁에서 확인할 수 있습니다.

// Redis와 유사한 인메모리 키-값 저장소 생성
// 키 설정/해제 메서드 제공
// 값 업데이트
// 필터와 함께 목록/출력
// 외부 라이브러리로 BoltDB 사용

AI로 생성된 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 go 디렉토리에서 확인할 수 있습니다.

Java 코드 생성 프롬프트

서로 다른 데이터 원본을 통한 메트릭을 위한 데이터 분석 응용 프로그램을 생성합니다. 데이터 쿼리와 집계를 위한 API를 제공합니다.

// 데이터 분석 앱 생성
// 다양한 입력 소스 및 값 구문 분석
// 메트릭을 칼럼 형식으로 저장
// 데이터 쿼리와 집계를 위한 API 제공

AI로 생성된 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 java 디렉토리에서 확인할 수 있습니다.

JavaScript 코드 생성 프롬프트

ReactJS로 직원을 위한 유급 휴가 신청 애플리케이션을 생성하고, 날짜-시간 선택기를 추가하세요.

// 사용자를 위한 유급 휴가 앱 생성
// ReactJS에서 날짜-시간 선택기 생성
// 시작 및 종료 옵션 제공
// 선택한 국가에 따라 공휴일 표시
// 서버 API에 요청 보내기

AI가 생성한 소스 코드 예시는 GitLab Duo Prompts 프로젝트의 javascript 디렉터리에서 확인할 수 있습니다.

HTML 코드 생성 프롬프트

<!-- AI 지식 기반 생성
효율적인 DevSecOps 워크플로우에서 AI가 어떻게 도움을 줄 수 있는지 설명
하나의 Dev, 하나의 Ops, 하나의 Sec 예제가 있는 테이블 추가
-->

<table>
  <tr>
    <th>Dev</th>
    <th>Ops</th>
    <th>Sec</th>
  </tr>
  <tr>
    <td>자동화된 테스트 및 지속적인 통합</td>
    <td>인프라를 코드로 관리하고 자동화된 프로비저닝</td>
    <td>정적 코드 분석 및 취약점 검사</td>
  </tr>
</table>

AI가 생성한 소스 코드 예시는 GitLab Duo Prompts 프로젝트의 html 디렉터리에서 확인할 수 있습니다.

Kotlin 코드 생성 프롬프트

텍스트 어드벤처를 생성하고 보물을 찾습니다. 시각적 보조 도구를 추가하고 무작위 타이머 함정을 사용하여 게임 오버를 설정하세요.

package org.example

// 텍스트 어드벤처 생성
// 금색 LEGO 브릭을 찾기
// 시각적 보조 도구 추가
// 무작위 타이머 함정을 사용하여 게임 오버 설정
// 텍스트 어드벤처 생성
fun createTextAdventure() {
    println("금색 LEGO 브릭 모험에 오신 것을 환영합니다!")
    println("어두운 방 안에 자신을 발견합니다. 무엇을 하시겠습니까?")

    var gameOver = false
    while (!gameOver) {
        println("1. 금색 LEGO 브릭을 찾기")
        println("2. 방 조사")
        println("3. 종료")

        val choice = readLine()?.toIntOrNull() ?: 0
        when (choice) {
            1 -> searchForBrick()
            2 -> examineRoom()
            3 -> {
                println("안녕히 가십시오!")
                gameOver = true
            }
            else -> println("잘못된 선택. 다시 시도하십시오.")
        }
    }
}

fun searchForBrick() {
    println("주변을 주의 깊게 살피며 금색 LEGO 브릭의 흔적을 찾습니다.")
    if (Math.random() < 0.2) {
        println("축하합니다! 금색 LEGO 브릭을 찾았습니다!")
    } else {
        println("아무것도 찾지 못했습니다. 다시 시도해야 합니다.")
    }
}

fun examineRoom() {
    println("방 안을 둘러봅니다. 세부 사항을 살펴봅니다.")
    println("어둡게 밝힌 방에서 모서리의 그림자가 보입니다.")
    println("북쪽에 한 문이 있고 방의 중앙에 테이블이 있습니다.")
}

fun main() {
    createTextAdventure()
}

AI가 생성한 소스 코드 예시는 GitLab Duo Prompts 프로젝트의 kotlin 디렉터리에서 확인할 수 있습니다.

PHP 코드 생성 프롬프트

GitLab 릴리스를 위한 RSS 피드 가져오기기를 만들고 제목으로 필터링할 수 있게 합니다.

// GitLab 릴리스 표시를 위한 웹 폼 만들기
// https://about.gitlab.com/atom.xml에서 RSS 피드 가져오기
// 제목에 대한 필터 옵션 제공

$feedUrl = 'https://about.gitlab.com/atom.xml';

$xml = simplexml_load_file($feedUrl);

$titleFilter = $_GET['titleFilter'];

echo '<h1>GitLab 릴리스</h1>';
echo '<ul>';
foreach ($xml->entry as $entry) {
    $title = $entry->title;
    if (empty($titleFilter) || strpos($title, $titleFilter) !== false) {
        echo '<li>' . $title . '</li>';
    }
}
echo '</ul>';

AI가 생성한 소스 코드 예시는 GitLab Duo Prompts 프로젝트의 php 디렉터리에서 확인할 수 있습니다.

PowerShell 코드 생성 프롬프트

디렉터리에서 모든 파일을 수집하고 크기를 출력하는 스크립트를 만듭니다. 결과를 CSV 또는 JSON 파일에 저장할 수 있도록 프롬프트를 수정하세요.

# 디렉터리에서 파일을 수집하고 파일 크기를 출력하기

$directory = Read-Host -Prompt "파일 크기를 얻을 디렉터리 경로 입력"
$files = Get-ChildItem -Path $directory -File
foreach ($file in $files) {
    $fileSize = [Math]::Round(($file.Length / 1KB), 2)
    Write-Host "$($file.Name) - $fileSize KB"
}

# 위의 코드를 반복하지만 결과를 CSV 파일에 저장하기

$csvFile = "$directory\file-sizes.csv"
$fileData = foreach ($file in $files) {
    [PSCustomObject]@{
        FileName = $file.Name
        FileSize = [Math]::Round(($file.Length / 1KB), 2)
    }
}
$fileData | Export-Csv -Path $csvFile -NoTypeInformation
Write-Host "파일 크기가 $csvFile에 저장되었습니다"

# 위의 코드를 반복하지만 결과를 JSON 파일에 저장하기

$jsonFile = "$directory\file-sizes.json"
$fileData | ConvertTo-Json | Out-File -FilePath $jsonFile
Write-Host "파일 크기가 $jsonFile에 저장되었습니다"

AI가 생성한 소스 코드 예시는 GitLab Duo Prompts 프로젝트의 powershell 디렉터리에서 확인할 수 있습니다.

Python 코드 생성 프롬프트

Flask를 사용하여 REST API를 통해 사용자를 관리하는 웹 서버를 만들고 SQLite에 저장하세요.

# Flask 웹 서버 생성
# ID별 사용자를 관리하기 위한 REST API 엔트리포인트 추가
# 생성, 업데이트, 삭제 기능 구현
# 사용자 데이터는 SQlite에 저장되어야 하며, 없을 경우 테이블을 생성하세요
# 서버를 8080 포트에서 실행하고 TLS를 지원하세요
# requirements.txt를 위한 필요한 패키지를 주석으로 표시합니다.
# 기본적으로 Python 3.10을 사용합니다.

# 아래는 잠재적으로 AI가 생성한 코드입니다
import flask
from flask import request
import sqlite3

app = flask.Flask(__name__)

# SQLite 데이터베이스와 사용자 테이블 생성 (테이블이 없을 경우)
conn = sqlite3.connect('users.db')
conn.execute('''CREATE TABLE IF NOT EXISTS users
         (id INTEGER PRIMARY KEY, name TEXT, email TEXT)''')

@app.route('/users', methods=['POST'])
def create_user():
  # 요청에서 사용자 데이터 가져오기
  name = request.form['name']
  email = request.form['email']

  # 데이터베이스에 사용자 추가
  conn.execute('INSERT INTO users (name, email) VALUES (?, ?)', (name, email))

  return '사용자가 성공적으로 생성되었습니다'

@app.route('/users/<int:id>', methods=['PUT'])
def update_user(id):
  # 요청에서 사용자 데이터 가져오기
  name = request.form['name']
  email = request.form['email']

  # 데이터베이스에서 사용자 업데이트
  conn.execute('UPDATE users SET name = ?, email = ? WHERE id = ?', (name, email, id))

  return '사용자가 성공적으로 업데이트되었습니다'

@app.route('/users/<int:id>', methods=['DELETE'])
def delete_user(id):
  # 데이터베이스에서 사용자 삭제
  conn.execute('DELETE FROM users WHERE id = ?', (id,))

  return '사용자가 성공적으로 삭제되었습니다'

if __name__ == '__main__':
  # 필요한 패키지 - flask, sqlite3
  app.run(host='0.0.0.0', port=8080, ssl_context='adhoc')

AI가 생성한 소스 코드 예시는 GitLab Duo Prompts 프로젝트의 python 디렉터리에서 확인할 수 있습니다.

루비 코드 생성 프롬프트

Elasticsearch에 로그 데이터를 저장하는 로그 구문 분석기 애플리케이션을 생성하세요.

# 로그 구문 분석기로 루비 앱 생성
# 로그 라인에서 민감한 문자열을 대체할 수 있는 후킹 제공
# 로그를 형식화하여 Elasticsearch에 저장

# 아래는 잠재적으로 AI가 생성한 코드입니다
require 'logger'
require 'elasticsearch'

class LogParser
  attr_reader :logger

  def initialize
    @logger = Logger.new(STDOUT)
    @elasticsearch = Elasticsearch::Client.new
  end

  def parse_and_store(logs)
    sanitized_logs = sanitize_logs(logs)
    formatted_logs = format_logs(sanitized_logs)
    store_in_elasticsearch(formatted_logs)
  end

  private

  def sanitize_logs(logs)
    logs.map { |line| sanitize_line(line) }
  end

  def sanitize_line(line)
    # 민감한 데이터 대체
    line.gsub(/\d{16}/, '[REDACTED]')
  end

  def format_logs(logs)
    logs.map { |line| "#{Time.now}: #{line}" }
  end

  def store_in_elasticsearch(logs)
    logs.each { |log| @elasticsearch.index(index: 'app-logs', document: log) }
  end
end

syslog 형식을 지원하는 로그 클라이언트 유틸리티 클래스를 생성하세요. 이는 심각도 수준, 애플리케이션 이름 및 메시지 문자열을 지원합니다.

# 로깅 유틸리티 클래스 생성
# 기본 로그 레벨을 속성으로 정의
# 로깅을 위한 메서드 추가, 입력: 레벨, 앱, 메시지
# syslog 형식으로 날짜와 시간을 형식화하여 데이터 출력

# 아래는 잠재적으로 AI가 생성한 코드입니다
class Logging
  attr_accessor :log_level

  def log(level, app, message)
    time = Time.now.strftime("%b %d %H:%M:%S")
    puts "#{time} #{app}[#{Process.pid}]: #{level} - #{message}"
  end
end

# 클래스를 생성하고 로그 메서드를 테스트합니다

# 아래는 잠재적으로 AI가 생성한 코드입니다
logger = Logging.new
logger.log_level = :debug

logger.log(:info, 'MyApp', 'Application started - info')
logger.log(:debug, 'MyApp', 'Application started - debug')
logger.log(:error, 'MyApp', 'Application started - error')
logger.log(:fatal, 'MyApp', 'Application started - fatal')
logger.log(:warn, 'MyApp', 'Application started - warn')

AI가 생성한 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 ruby 디렉토리에서 확인할 수 있습니다.

러스트 코드 생성 프롬프트

// GitLab REST API에 쿼리
// gitlab-org/gitlab에 대한 모든 열린 병합 요청 가져오기

use serde_json::Value;

fn main() {

    let client = reqwest::blocking::Client::new();
    let url = "https://gitlab.com/api/v4/projects/278964/merge_requests?state=opened";
    let response = client.get(url).send().unwrap().text().unwrap();
    let json: Value = serde_json::from_str(&response).unwrap();

    // TODO: 페이지네이션, 기본 검색 결과: 20
    // 응답 헤더를 읽어 다음 페이지에 액세스

    println!("{}", json.to_string());

    for mr in json.as_array().unwrap() {
        println!("{} - URL: {}", mr["title"], mr["web_url"]);
    }
}

RSS 피드 리더 앱을 생성하세요. AI의 도움을 받아 고급 Rust 프로그래밍 배우기 블로그 게시물 예제.

    // 소스 배열을 반복하고 HTTP를 통해 RSS 피드 항목에서 데이터를 가져오는 함수 생성
    // 결과를 새 해시 맵에 저장
    // 해시 맵을 터미널에 출력

AI가 생성한 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 rust 디렉토리에서 확인할 수 있습니다.

스칼라 코드 생성 프롬프트

// Newton's Method 구현
// main 함수가 있는 객체 생성
// 방정식 해결에 Newton's Method를 구현하는 함수 추가
// 구현된 함수를 테스트하는 드라이버 함수 추가
object NewtonsMethod {
  def solveEquation(f: Double => Double, df: Double => Double, x0: Double, tolerance: Double): Double = {
    var x = x0
    var error = Double.PositiveInfinity
    while (math.abs(error) > tolerance) {
      error = f(x) / df(x)
      x -= error
    }
    x
  }

  def main(args: Array[String]): Unit = {
    val f: Double => Double = x => x * x - 4
    val df: Double => Double = x => 2 * x
    val x0 = 3.0
    val tolerance = 1e-6
    val root = solveEquation(f, df, x0, tolerance)
    println(s"The root is: $root")
  }
}

AI가 생성한 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 scala 디렉토리에서 확인할 수 있습니다.

셸 스크립트 코드 생성 프롬프트

mytop.sh 스크립트를 생성하여 상위 10개 프로세스를 CPU, 메모리 및 디스크 I/O 사용량에 따라 표시하세요.

#!/bin/bash

# CPU 사용량 상위 10개 프로세스 가져오기
top -b -n 1 | head -n 11 | awk '{print $1, $2, $3, $9}' | column -t

# 메모리 사용량 상위 10개 프로세스 가져오기
top -b -n 1 | head -n 11 | awk '{print $1, $2, $4, $6}' | column -t

# 디스크 I/O별 상위 10개 프로세스 가져오기
top -b -n 1 | head -n 11 | awk '{print $1, $2, $7, $8}' | column -t

# 네트워크 I/O별 상위 10개 프로세스 가져오기
top -b -n 1 | head -n 11 | awk '{print $1, $2, $10, $11}' | column -t

AI가 생성한 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 shell 디렉토리에서 확인할 수 있습니다.

TypeScript 코드 생성 프롬프트

IPv6 및 IPv4 주소 형식을 구문 분석하는 유틸리티 함수를 작성합니다.

"use strict";
// IPv6 및 IPv4 주소 형식을 구문 분석하는 TypeScript 함수 생성
// 정규 표현식 사용
function parseAddress(address) {
    const ipv6Regex = /^((([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
    const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
    if (ipv6Regex.test(address)) {
        return {
            ipVersion: 6,
            address
        };
    }
    else if (ipv4Regex.test(address)) {
        return {
            ipVersion: 4,
            address
        };
    }
    else {
        throw new Error('잘못된 IP 주소입니다');
    }
}
// 임의의 입력으로 함수 테스트
const testInputs = [
    '2001:0db8:85a3:0000:0000:8a2e:0370:7334',
    '192.168.0.1',
    'not-an-ip'
];
for (const input of testInputs) {
    try {
        const result = parseAddress(input);
        console.log(result);
    }
    catch (error) {
        console.error(`유효하지 않은 주소: ${input}`);
    }
}

AI가 생성한 소스 코드 예제는 GitLab Duo Prompts 프로젝트의 typescript 디렉토리에서 확인할 수 있습니다.

리소스

다양한 사용 사례 중 많은 것들이 GitLab Duo Coffee Chat YouTube 재생 목록에서 실습 영상으로 제공됩니다. GitLab Duo Coffee Chat개발자 관계 팀‘이 유지 보수하는 학습 시리즈입니다.

블로그 리소스

다음 블로그 글은 이러한 사용 사례에 대한 자습서를 제공합니다:

위 언어에 대한 코드 제안 자습서 블로그 글은 다음과 같습니다: