我们正在开发第一个 Golang API 应用程序。当执行 Azure pipelines 来发布此应用程序时,未创建 AKS pod,我们收到此错误消息:
错误:发布golang-app失败,由于设置了原子性而已被卸载:等待条件超时
第二步是执行命令:kubectl -n xxxxx get events --sort-by='{.lastTimestamp}',我们会收到以下消息:
无法拉取映像“serverdev.azurecr.io/xxxx.golang-app.go-ver:86895”:[rpc 错误:代码 = 未知 desc = 无法拉取和解压映像“serverdev.azurecr.io/xxxx.golang” -app.go-ver:86895”:无法解析引用“serverdev.azurecr.io/xxxx.golang-app.go-ver:86895”:无法授权:无法获取oauth令牌:意外状态:401未经授权, rpc 错误:代码 = 未知 desc = 无法提取和解压映像“serverdev.azurecr.io/xxxx.golang-app.go-ver:86895”:无法解析引用“serverdev.azurecr.io/xxxx.golang-app” .go-ver:86895": 授权失败:无法获取匿名令牌:意外状态:401 未授权]
最令人高兴的情况是,当我们开发 Net Core 应用程序时,因为 pod 已正确创建并且没有出现任何错误。
拜托,我需要一些建议来解决这个问题。
提前致谢。
PS:我们有 Azure Kubernetes 服务版本 1.25.6 和 Helm 3.7
我们更改了Azure管道中的许多参数,但我们得到了相同的错误,另一方面网络核心应用程序没有收到任何错误消息。
我们在部署 go 项目时遇到了同样的问题。
为什么会出现这个错误?
考虑以下文件夹结构:
my_project
/api
/config
/migrations
/submodule_1
/submodule_2
在代码中,我们这样导入包:
package main
import (
"github.com/lib/pq"
...
"gitlab.com/my_project/submodule_1"
"gitlab.com/my_project/submodule_2/models"
...
)
当我们的 CI/CD 管道运行并构建阶段到来时,它需要访问项目中使用的所有包。
由于 git 子模块被视为第三方包,构建过程会尝试获取它们。
例如
"github.com/lib/pq"
pakage 可以毫无问题地访问,因为它是公共存储库。但是 "gitlab.com/my_project/submodule_1"
可能无法从正在构建项目的计算机访问,从而导致此错误(因为缺少权限或存储库是私有的)
解决方案
您可以通过两种方式解决此问题:
确保
build
阶段可以访问您的子模块
将子模块中的所有代码复制到非子模块文件夹中。
我们选择了第二个选项:
my_project
/api
/config
/migrations
/modules/
/submodule_1
/submodule_2
/submodule_1
/submodule_2
这样,
modules
文件夹中的所有代码都成为my_project
代码的一部分。所以build
阶段不需要获取它
P.S:您可以使用此脚本将所有子模块复制到新文件夹中:
// Makefile
submodule-gen:
rm -rf modules/${SUBMODULE_1_FOLDERNAME}
rm -rf modules/${SUBMODULE_2_FOLDERNAME}
mkdir -p modules/${SUBMODULE_1_FOLDERNAME}
mkdir -p modules/${SUBMODULE_2_FOLDERNAME}
rsync -r --exclude '.git' ${SUBMODULE_1_FOLDERNAME}/ modules/${SUBMODULE_1_FOLDERNAME}
rsync -r --exclude '.git' ${SUBMODULE_2_FOLDERNAME}/ modules/${SUBMODULE_2_FOLDERNAME}