带有子软件包的golang源的AWS CodeBuild失败

时间:2018-11-19 20:30:27

标签: go aws-codebuild

当我尝试使用CodeBuild golang映像1.10构建golang项目时,它失败,无法找到子包。一些背景:

应用程序的组织方式如下:

/go/src/company/app
/go/src/company/app/sub1
/go/src/company/app/sub2
etc...

这在我的开发机器上构建良好。但是,当由codebuild提取时,它会被提取到另一个目录(/codebuild/output/srcNNN/src/<some path>)中,其中<some path>根据触发生成的原因而有所不同。

我最初是通过将代码从提取位置复制到golang目录(/codebuild/output/srcNNN)来工作的,但是由于GOPATH目录的CodeBuild环境变量插入/ go:({ {1}}),我使用观察到的.. / .. / ...进行复制。但是,这很丑陋,一旦我以另一种方式触发了构建,就会失败。

我的问题是,是否有一种很好的方法来使它起作用?我的下一个想法是将字符串操作应用于观察到的路径,并在该路径中复制以(希望)提高可靠性。但这仅在/go:/codebuild/output/srcNNN符合我的假设的情况下有效。

任何想法都将不胜感激。


说明: 在代码中导入包时,将按以下方式导入外部包:

GOPATH

子包未显式导入,但在如上所示部署代码时找到(import ( "context" ... } )。但是,AWS CodeBuild不会以这种方式引入代码。

2 个答案:

答案 0 :(得分:1)

我能够得到一个答案。如果对其他用户有帮助,我将在此处发布,但是它依赖于AWS​​ CodeBuild中观察到的行为才能起作用,因此我认为这不是理想的选择。

在我的buildspec.yaml中,我可以通过以下方式来运行该构建:

  1. 通过从开头删除“ / go:”来从${THEGOPATH}获取${GOPATH}
  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

答案 1 :(得分:1)

这是我采用的方法。

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中创建一个新目录。

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

这将创建从CodeBuild项目的根目录到Go包的符号链接。

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

这将使其余的Codebuild操作在Go软件包的CWD中进行。