我有一个Jenkins CI,并使用Jenkins脚本化管道使用它来构建(mvn)和容器化(docker)我的应用程序。最后,我想将容器部署到Heroku dyno(我已经创建了一个应用程序)。
我已遵循本文档https://devcenter.heroku.com/articles/container-registry-and-runtime,并已成功将我的docker映像推送到Registry.heroku.com/sunset-sailing-4049/web。
问题是,自公告https://devcenter.heroku.com/changelog-items/1426以来,我现在需要显式执行“ heroku container:release web”,以使我的docker容器从注册表运行到应用dyno。这就是我的王宫。请参阅我的以下问题:
Jerkins无法识别Heroku。 (我的Jenkins在ec2上运行,我已经以ec2-user用户身份安装了heroku工具带。但是Jenkins抛出错误:heroku:找不到命令)。我该如何解决这个问题?
如何从Jenkins进行“ heroku登录”,因为login命令提示浏览器登录。我已经添加了ssh密钥,但是我不知道如何从命令行使用它,因此Jenkins是“ shell脚本”
我唯一想到的另一种方法是使用伪git存储库通过heroku管道进行部署,Jenkins将在成功构建后将源代码上传到虚拟git存储库上。
非常感谢您为解决上述两个问题所提供的帮助。
谢谢。
答案 0 :(得分:0)
您需要以运行jenkins的用户身份安装heroku。或者,如果您是全局安装的,则它可能不在运行jenkins的用户的PATH中。 设置PATH有多个选项:
设置为特定命令。 如果您的工作是管道,只需将heroku命令包装在withEnv闭包中:
withEnv(['PATH+HEROKU=/use/local/bin/']) {
your heroku command here
}
设置jenkins从属服务器的路径:转到[管理Jenkins]-> [管理节点],配置您的节点并将环境变量PATH
设置为$PATH:/use/local/bin/
。这样,在从属服务器上运行的所有作业都将注入环境变量。
~/.netrc
中,也可以将其作为环境变量提供(请参见here)。答案 1 :(得分:0)
(如果有人面对相同的情况,请写在这里) 好的,我接受了@vladimir的建议,并执行了以下操作:
Heroku命令(用于在ec2上运行的jenkins):
需要以下命令通过jenkins /或其他ci / cd工具将构建的docker映像推送到heroku;由于最近的更改(https://devcenter.heroku.com/changelog-items/1426),仅推送到heroku注册表已不再足够。为了执行以下命令,您需要安装heroku工具带。
heroku容器:释放网络
在Amazon Linux上安装快照,如下所示:
按照说明启用epel https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/add-repositories.html
然后修改/etc/yum.repos.d/epel.repo。在标有[epel]的部分下,将enabled = 0更改为enabled = 1。
然后做
sudo yum install epel-release
sudo yum install yum-plugin-copr
sudo yum copr enable ngompa/snapcore-el7
sudo yum -y install snapd
sudo systemctl enable --now snapd.socket
然后安装heroku工具带:
sudo snap install --classic heroku
将docker映像部署到heroku:
在Jenkins脚本化管道中:
withCredentials([string(credentialsId: 'heroku-api-cred', variable: 'herokuRegistryApiCred')]) {
sh "docker login -u email@example.com -p ${herokuRegistryApiCred} registry.heroku.com"
}
// Tag docker img (in my case it was an image in dockerhub)
sh "docker tag dockerhubusername/pvtreponame:${imageTag} registry.heroku.com/your_app_name/release_type[ie>web]"
sh "docker push registry.heroku.com/your_app_name/web"
sh "/usr/local/bin/heroku container:release web --app=your_app_name"
sh "docker logout registry.heroku.com"
为了在docker内部运行应用程序(在我的情况下是Java),我必须添加以下行(否则会崩溃,因为1.告诉应用程序heroku的端口绑定; 2.告诉Web进程运行命令。 ENTRYPOINT [“ java”,“-jar”,“ my_spring_boot_app-0.0.1-SNAPSHOT.jar”]在heroku上不起作用。):
CMD ["web", "java $JAVA_OPTS -Dserver.port=$PORT -jar /usr/app/my_spring_boot_app-0.0.1-SNAPSHOT.jar"]