Установка частного модуля GO в конвейере ADO без использования секретов

Я хочу установить частный модуль go без использования ключа ssh, токена PAT или токена github OAuth. Этот частный репозиторий github принадлежит мне, и я могу успешно оформить заказ в репозитории, используя сервисное соединение в конвейере ADO, но я не могу установить репозиторий как модуль go, поскольку он запрашивает аутентификацию github. Clusterfleet — это частный модуль, который необходимо установить.

Есть ли способ сделать это?

resources:
  - repository: Clusterfleet
    type: github
    endpoint: "Falcon (1)"
    name: webxt-microsoft/clusterfleet
    ref: refs/tags/v0.2.7

Я попытался создать локальный пакет кластера и заставить конвейер использовать локальный пакет с файлом go.work.

- script: |
            # Set GOPATH to include the pipeline workspace
            export GOPATH=$(Pipeline.Workspace)/go
            echo "##vso[task.setvariable variable=GOPATH]$GOPATH"

            # Add the Clusterfleet module to GOPATH
            mkdir -p $GOPATH/src/github.com/webxt-microsoft
            ln -s $(Build.SourcesDirectory)/clusterfleet $GOPATH/src/github.com/webxt-microsoft/clusterfleet

            # Set GOPRIVATE to include github.com/webxt-microsoft
            go env -w GOPRIVATE=github.com/webxt-microsoft

            # Update Go module cache
            cd $GOPATH/src/github.com/webxt-microsoft/clusterfleet
            go mod download
          displayName: 'Setup Clusterfleet module'
- script: |
            echo "Creating go.work file"
            cat << EOF > $(Pipeline.Workspace)/go.work
            go 1.21

            use (
                $(GOPATH)/src/github.com/webxt-microsoft/clusterfleet
            )
            EOF
            cat $(Pipeline.Workspace)/go.work
          displayName: 'Create go.work file'

Но он не работает и выдает следующую ошибку:

перейдите: github.com/webxt-microsoft/falconfleet/cmd/apiserverproxy/app/run imports github.com/webxt-microsoft/clusterfleet/pkg/client/clientset/versioned: чтение github.com/webxt-microsoft/clusterfleet/go.mod в версии v0.2.7: git ls-remote -q origin в /mnt/vss /_work/1/go/pkg/mod/cache/vcs/cdbe37fa44eec61731b059b590c47e1b60a2c549f9a741905e85b859212d994b: статус выхода 128: фатально: не удалось прочитать имя пользователя для «https://github.com»: запросы терминала отключены Убедитесь, что путь импорта введен правильно. Если это частный репозиторий, см. https://golang.org/doc/faq#git_https для получения дополнительной информации.

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

По умолчанию инструмент Go попытается найти указанные модули в папке «src» в пути установки инструмента Go.

Если использовать задачу GoTool@0 для установки указанной версии инструмента Go в конвейер, инструмент будет установлен в каталог «$(Agent.ToolsDirectory)/go/<version-number>/x64/». Таким образом, инструмент попытается выполнить поиск модулей, на которые имеются ссылки, в каталоге «$(Agent.ToolsDirectory)/go/<version-number>/x64/src».

После загрузки или извлечения модуля из репозитория git вам необходимо скопировать всю папку модуля в папку «src», если модуль не существует в этой папке.

Ниже приведен один из моих образцов в качестве ссылки:

  1. Приложение Go (myGoApp), которому необходимо использовать модуль из другого частного репозитория git.

    // main.go
    
    package main
    
    import (
        "fmt"
        "MathCalc"
    )
    
    func main() {
        var num1 = 3.6
        var num2 = 1.2
    
        fmt.Printf("%v + %v = %.2f\n", num1, num2, Operators.Addition(num1, num2))
        fmt.Printf("%v - %v = %.2f\n", num1, num2, Operators.Subtraction(num1, num2))
        fmt.Printf("%v x %v = %.2f\n", num1, num2, Operators.Multiplication(num1, num2))
        fmt.Printf("%v ÷ %v = %.2f\n", num1, num2, Operators.Division(num1, num2))
    }
    
  2. Модуль в другом частном репозитории git (myGoModule).

    • Файл MathCalc/go.mod.

      module MathCalc
      
      go 1.14
      
    • Пакет (Operators) имеет некоторые функции, определенные внутри модуля.

      // MathCalc/Operators.go
      
      package Operators
      
      func Addition(num1 float64, num2 float64) float64 {
        return num1 + num2
      }
      
      func Subtraction(num1 float64, num2 float64) float64 {
        return num1 - num2
      }
      
      func Multiplication(num1 float64, num2 float64) float64 {
        return num1 * num2
      }
      
      func Division(num1 float64, num2 float64) float64 {
        return num1 / num2
      }
      
  3. Трубопровод myGoApp.

    # azure-pipelines.yml
    
    resources:
      repositories:
      - repository: myGoModule
        type: github
        endpoint: 'myGitHubConnection'
        name: myOrg/myGoModule
        ref: main
    
    variables:
      goVersion: '1.23.0'
    
    steps:
    - checkout: self
    - checkout: myGoModule
    
    - task: GoTool@0
      displayName: 'Install Go tool v$(goVersion)'
      inputs:
        version: '$(goVersion)'
    
    - task: CopyFiles@2
      displayName: 'Copy module into Go src folder'
      inputs:
        SourceFolder: '$(System.DefaultWorkingDirectory)/myGoModule'
        Contents: 'MathCalc/**'
        TargetFolder: '$(Agent.ToolsDirectory)/go/$(goVersion)/x64/src'
        OverWrite: true
    
    - task: Go@0
      displayName: 'Run myGoApp'
      inputs:
        command: 'custom'
        customCommand: 'run'
        arguments: 'main.go'
        workingDirectory: '$(System.DefaultWorkingDirectory)/myGoApp'
    

Если модуль не существует и не скопирован в папку «src», шаг «Запустить myGoApp» завершится неудачно и вернет сообщение об ошибке, как показано ниже.

main.go:5:2: пакет MathCalc отсутствует в стандартном формате (/opt/hostedtoolcache/go/1.23.0/x64/src/MathCalc)


Обновлено:

После того, как вы загрузили/извлекли файлы модулей из частного репозитория GitHub, вы можете скопировать в папку «src» только папку каждого модуля, а не весь репозиторий.

А в файлах .go вашего проекта, в которых необходимо использовать модули, в блоке import укажите только имя модуля, а не URL-адрес репозитория.

Таким образом, при запуске проекта инструмент Go попытается найти модуль в папке «src» в локальной файловой системе вместо загрузки модуля из репозитория.

Точно так же, как это делает мой приведенный выше образец.


Я добавил этап копирования перед запуском, но он все равно не может найти локальный модуль и ищет удаленный. Ошибка с ошибкой: github.com/webxt-microsoft/falconfleet/cmd/apiserverproxy/ap‌​p/run imports github.com/webxt-microsoft/clusterfleet/pkg/client/clientse‌​t/versioned: чтение github.com/ webxt-microsoft/clusterfleet/go.mod в версии v0.2.7: git ls-remote -q origin в /home/cloudtest/go/pkg/mod/cache/vcs/cdbe37fa44eec61731b059b‌​590c47e1b60a2c549f9a‌​741905e85b859212d 994‌​b: статус выхода 128: фатально: не удалось прочитать имя пользователя для «github.com»: запросы терминала отключены

Aryaman 26.08.2024 12:36

@Aryaman, перед шагом CopyFiles убедитесь, что файлы модуля извлечены в рабочий каталог агента. И CopyFiles шаг, убедитесь, что указанный SourceFolder соответствует каталогу извлеченного пути.

Bright Ran-MSFT 26.08.2024 12:40

@Aryaman, как вы ссылаетесь на модуль в main.go вашего проекта? Проверьте правильность указанного пути в блоке import.

Bright Ran-MSFT 26.08.2024 12:43

github.com/webxt-microsoft/clusterfleet v0.2.7 (вот как я импортирую модуль в falconfleet). Кроме того, мой шаг копирования выглядит следующим образом. SourceFolder: '$(System.DefaultWorkingDirectory)/clusterfleet' Содержимое: '**' TargetFolder:'$(Agent.ToolsDirectory)/go/$(goVersion)/x64/sr‌​c/github.com/webxt-m‌​icrosoft /clusterflee‌​t'

Aryaman 26.08.2024 13:27

import ( "fmt" "time" "github.com/spf13/cobra" "github.com/webxt-microsoft/clusterfleet/pkg/client/clients‌​et/versioned" "github.com/webxt-microsoft/clusterfleet/pkg /metrics" "github.com/webxt-microsoft/falconfleet/cmd/apiserverproxy/‌​options" "github.com/webxt-microsoft/falconfleet/internal/apiserverp‌​roxy" "github.com/webxt-microsoft/falconfleet/ Internal/globalopti‌​ons" "github.com/webxt-microsoft/falconfleet/internal/utils" ) Вот как я импортирую пакеты

Aryaman 26.08.2024 13:28

@Aryaman, я заметил, что каждый из модулей имеет несколько подкаталогов/подмодулей. Убедитесь, что файл go.mod существует в каждом подкаталоге/подмодуле, а имя модуля, определенное в файле go.mod, соответствует текущему подкаталогу/подмодулю.

Bright Ran-MSFT 26.08.2024 13:32

@Aryaman, я обновил свой ответ выше, добавив больше предложений (см. РЕДАКТИРОВАТЬ). Проверьте и попробуйте с ним.

Bright Ran-MSFT 27.08.2024 08:10
Ответ принят как подходящий

Замена удаленного пути на локальный путь модуля сработала для меня.

go mod edit -replace github.com/webxt-microsoft/clusterfleet=../clusterfleet

Другие вопросы по теме