Jenkins CI在Heroku上部署docker映像

时间:2019-05-02 11:21:23

标签: docker jenkins heroku jenkins-pipeline

我有一个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。这就是我的王宫。请参阅我的以下问题:

  1. Jerkins无法识别Heroku。 (我的Jenkins在ec2上运行,我已经以ec2-user用户身份安装了heroku工具带。但是Jenkins抛出错误:heroku:找不到命令)。我该如何解决这个问题?

  2. 如何从Jenkins进行“ heroku登录”,因为login命令提示浏览器登录。我已经添加了ssh密钥,但是我不知道如何从命令行使用它,因此Jenkins是“ shell脚本”

我唯一想到的另一种方法是使用伪git存储库通过heroku管道进行部署,Jenkins将在成功构建后将源代码上传到虚拟git存储库上。

非常感谢您为解决上述两个问题所提供的帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

  1. 您需要以运行jenkins的用户身份安装heroku。或者,如果您是全局安装的,则它可能不在运行jenkins的用户的PATH中。 设置PATH有多个选项:

    • 设置为特定命令。 如果您的工作是管道,只需将heroku命令包装在withEnv闭包中:

      withEnv(['PATH+HEROKU=/use/local/bin/']) { your heroku command here }

    • 设置jenkins从属服务器的路径:转到[管理Jenkins]-> [管理节点],配置您的节点并将环境变量PATH设置为$PATH:/use/local/bin/。这样,在从属服务器上运行的所有作业都将注入环境变量。

  2. 对于自动cli交互,heroku支持API令牌。您可以将其放在构建计算机上的~/.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"]
相关问题