Установка частного модуля 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 для получения дополнительной информации.

🤔 А знаете ли вы, что...
Go был представлен миру в 2009 году.


1
60
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» в локальной файловой системе вместо загрузки модуля из репозитория.

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



Решено

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

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