亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對于帶有子包的 golang 源,AWS CodeBuild 失敗

對于帶有子包的 golang 源,AWS CodeBuild 失敗

Go
桃花長相依 2023-05-08 17:56:29
當我嘗試使用 CodeBuild golang 映像 1.10 構建我的 golang 項目時,它失敗了,無法找到子包。一些背景:該應用程序的組織如下:/go/src/company/app/go/src/company/app/sub1/go/src/company/app/sub2etc...這在我的開發機器上構建良好。但是,當通過 codebuild 拉取時,它會被拉入不同的目錄 ( /codebuild/output/srcNNN/src/<some path>),其中<some path>根據觸發構建的內容而有所不同。我最初是通過將代碼從它被拉到 golang 目錄 ( /codebuild/output/srcNNN) 復制它來工作的,但是由于目錄的 CodeBuild 環境變量在前面GOPATH插入 /go: ( ),我使用了觀察到的 ../ /go:/codebuild/output/srcNNN../... 復制。但是,一旦我以不同的方式觸發構建,這很丑陋并且失敗了。我的問題是是否有一種好的方法可以使它正常工作?我的下一個想法是將字符串操作應用于觀察到的路徑并復制到那里以獲得(希望)更高的可靠性。但這只有在GOPATH符合我的假設的情況下才有效。任何想法,將不勝感激。澄清:在代碼中導入包時,外部包的導入方式如下:import (    "context"    ...}子包未顯式導入,但在部署代碼時發現,如上所示 ( /go/src/company/app)。但是,AWS CodeBuild 不會以這種方式引入代碼。
查看完整描述

2 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

如果您使用的是 golang 1.11 或更高版本,請參閱下面的更新以獲得完整答案......我們不再使用我最初的解決方法。

我能夠得到一個有效的答案。我會把它貼在這里以防它對其他人有幫助,但它依賴于在 AWS CodeBuild 中觀察到的行為才能工作,所以我認為它不是理想的。

在我的 buildspec.yaml 中,我可以通過以下方式使構建工作:

  1. ${THEGOPATH}${GOPATH}開頭刪除“/go: ”

  2. 將所有代碼復制到${THEGOPATH}/src/<app path>

  3. 將其他存儲庫復制到${THEGOPATH}/src/<other app path>

  4. 正常導入外部依賴項(在我們的例子中,go get ./...或顯式)

  5. 構建并強制輸出名稱(從 CodeBuild 啟動時它使用不同的目錄名稱)

buildspec.yaml 類似于以下內容:

phases:

  install:

    commands:

      - echo GOPATH - $GOPATH

      - export THEGOPATH=`echo $GOPATH | cut -c 5-`

      - echo THEGOPATH = $THEGOPATH

      - mkdir -p ${THEGOPATH}/src/company/app1

      - mkdir -p  ${THEGOPATH}/src/company/other_repository_dependency

      - echo Copy source files to go root

      - cp -a ${CODEBUILD_SRC_DIR}/. ${THEGOPATH}/src/company/app1/${PACKAGE}

      - cp -a ${CODEBUILD_SRC_DIR_other_dep}/. ${THEGOPATH}/src/app/other_repository_dependecy/.

      - ls ${THEGOPATH}/src/

  build:

    commands:

      - echo Build started on `date`

      - echo Getting packages

      - go get ./...

      - echo DOING THE BUILD

      - go build -ldflags "<some flags>" -o "appname"

      - go test ./...

  post_build:

    commands:

      - echo Build completed on `date`

      - ls -al

      - pwd

artifacts:

  files:

    - appname

更新——更好地修復 今天我們嘗試使用 go 模塊(自 1.11 起可用)進行構建,請參閱此處以獲取對 go 模塊的解釋。


company-name.com使用 go modules,我們在 go.mod 文件中定義了當前源模塊 app1,如下所示:


module company-name.com/app1


go 1.12

require (

   ... *for example*

   github.com/golang/mock v1.3.1

   github.com/google/btree v1.0.0 // indirect

   github.com/google/go-cmp v0.3.0

   ... *etc*

我們甚至以這種方式引用我們的外部文件(盡管您需要弄清楚如何使用您的 git 存儲庫進行身份驗證。我們使用構建規范中內置的憑據助手來進行 https 身份驗證)。所以,我們的導入塊現在看起來像這樣:


     import ( 

       "company-name.com/app1/subpackage1"

       abbrev "company-name.com/app1/subpackage2"

       "company-name.com/externalpkg"  // In another private git repo of ours

       ... //etc

     )

     ... //golang source follows here*


最后,我們將以下環境變量添加到構建規范中:


  variables:

    GO111MODULE: "on"

    git-credential-helper: yes

這些確保模塊在路徑中工作(感謝 amwill04 提醒我我的遺漏)并允許我們的 Git 存儲庫的憑據正確設置。

在這樣做的過程中,我們完成了我們需要的一切:

  1. 通過更改我們對 go 模塊的引用,我們可以輕松地引用子包

  2. 我們能夠鎖定所有依賴項的版本

  3. 通過在 company-name.com 上實現一個簡單的服務器,我們可以從我們的應用程序中引用其他私有模塊


查看完整回答
反對 回復 2023-05-08
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

這是我采取的方法。


version: 0.2


env:

  variables:

    PACKAGE: "github.com/rhyselsmore/foo"


phases:

  install:

    commands:

      # AWS Codebuild Go images use /go for the $GOPATH so let's copy our

      # application source code into that directory structure.

      - mkdir -p "/go/src/$(dirname ${PACKAGE})"

      - ln -s "${CODEBUILD_SRC_DIR}" "/go/src/${PACKAGE}"

      - # Make sure we're in the package directort within our GOPATH

      - cd "/go/src/${PACKAGE}"

現在假設 PACKAGE 變量是您正在構建的存儲庫的根目錄,我們可以發出 go 命令。讓我們逐行分解它。


- mkdir -p "/go/src/$(dirname ${PACKAGE})"

這會在 GOPATH 中為您的包創建一個新目錄。


- ln -s "${CODEBUILD_SRC_DIR}" "/go/src/${PACKAGE}"

這會創建一個從 CodeBuild 項目的根目錄到您的 Go 包的符號鏈接。


- cd "/go/src/${PACKAGE}"

這為您的其余 Codebuild 操作做好準備,以便在您的 Go 包的 CWD 中進行。


查看完整回答
反對 回復 2023-05-08
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號