Я хочу установить частный модуль 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 году.
По умолчанию инструмент Go попытается найти указанные модули в папке «src
» в пути установки инструмента Go.
Если использовать задачу GoTool@0 для установки указанной версии инструмента Go в конвейер, инструмент будет установлен в каталог «$(Agent.ToolsDirectory)/go/<version-number>/x64/
». Таким образом, инструмент попытается выполнить поиск модулей, на которые имеются ссылки, в каталоге «$(Agent.ToolsDirectory)/go/<version-number>/x64/src
».
После загрузки или извлечения модуля из репозитория git вам необходимо скопировать всю папку модуля в папку «src
», если модуль не существует в этой папке.
Ниже приведен один из моих образцов в качестве ссылки:
Приложение 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))
}
Модуль в другом частном репозитории 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
}
Трубопровод 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
» в локальной файловой системе вместо загрузки модуля из репозитория.
Точно так же, как это делает мой приведенный выше образец.