我有一个包含AWS Lambda函数的GitHub存储库。我目前正在使用Travis CI来构建、测试这个函数,如果所有的测试都成功地使用
deploy:
provider: lambda
(other settings here)
我的函数在其requirements.txt
中指定了以下依赖项
我使用下面的命令将Travis CI的构建脚本设置为在工作目录中构建,以便将依赖关系正确地复制到AWS Lambda函数中。在
pip install --target=$TRAVIS_BUILD_DIR -r requirements.txt
问题是,虽然内置Travis CI成功,并且所有内容都成功部署到Lambda函数,但测试Lambda函数会导致以下错误:
Unable to import module 'mymodule':
Importing the multiarray numpy extension module failed. Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control). Otherwise reinstall numpy.
关于为什么会发生这种情况,我最好的猜测是,numpy是在travisci使用的linux的Ubuntu发行版中构建的,但是它作为Lambda函数运行的Amazon linux无法正常运行。有许多论坛帖子和博客文章,如this详细说明,需要在EC2实例上构建需要构建C/C++扩展的Python模块。在
我的问题是:这是一个真正的麻烦,必须增加另一个复杂的CD管道,必须搞乱EC2实例。Amazon有没有想出更好的方法来实现这一点(因为确实应该有更好的方法来做到这一点),还是有某种方法可以在Travis CI或其他CI解决方案中正确编译所有内容?在
另外,我想有可能是我误认了问题所在,还有其他原因导致进口纽比失败。如果有人对如何解决这个问题提出建议,那就太好了!在
编辑:根据@jordann的建议,在运行TravisCI时,可以使用amazonlinux映像加载docker容器,然后在该容器中执行构建和测试。不幸的是,虽然这肯定比使用EC2更容易——我不认为我可以在TravisCI中使用普通的lambda部署工具——但我必须使用awscli编写自己的部署脚本,这有点麻烦。还有什么其他的想法或者方法可以让这个过程更顺利吗?理想情况下,我会指定我的构建在TravisCI中运行的docker映像,因为它们的默认构建环境已经在使用docker……但是它们似乎还不支持该功能:https://github.com/travis-ci/travis-ci/issues/7726
虽然我很感激您可能不想给您的项目增加更多的复杂性,但是您可以使用一个以Python为中心的Lambda管理工具来设置构建和部署,比如Gordon。您也可以使用这个工具在Travis中运行的amazonluxdocker容器中进行部署。在
如果您希望更改CI提供程序,CodeShip允许您使用您选择的任何Docker容器进行构建,然后使用deploy to Lambda。在
Wercker还运行完整的基于Docker的构建,并有许多用户提交的部署“步骤”,其中一些步骤support deployment to Lambda。在
经过一番修修补补,我想我找到了一些有用的东西。我想我会把它贴在这里,以防其他人有同样的问题。在
我决定使用Wercker,因为它们有相当大的免费层,并且允许您为您的构建定制docker映像。在
原来有一个docker镜像被创建来复制执行Lambda函数的环境!请参见:https://github.com/lambci/docker-lambda在这个docker容器中运行构建时,将正确构建扩展,以便它们可以在Lambda上成功执行。在
如果有人想使用Wercker,这里是我使用的
wercker.yml
,作为模板可能很有用:相关问题 更多 >
编程相关推荐