【问题标题】:Jenkins CI deploying docker image on HerokuJenkins CI 在 Heroku 上部署 docker 镜像
【发布时间】:2019-05-07 10:24:17
【问题描述】:

我有一个 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 容器:发布 web”,以便让我的 docker 容器从注册表运行到应用程序测功机。这就是我被卡住的地方。请参阅我的以下问题:

  1. Jenkins 无法识别 Heroku。 (我的 Jenkins 在 ec2 上运行,我已将 heroku toolbelt 安装为 ec2-user 用户。但 Jenkins 抛出错误:heroku:找不到命令)。我该如何解决这个问题?

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

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

非常感谢您帮助解决上述 2 个问题。

提前致谢。

【问题讨论】:

    标签: docker jenkins heroku jenkins-pipeline


    【解决方案1】:
    1. 您需要以运行 jenkins 的用户身份安装 heroku。或者,如果您全局安装它,它可能不在运行 jenkins 的用户的 PATH 中。 设置 PATH 有多种选择:

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

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

      • 设置jenkins slave的路径:进入[Manage Jenkins] -> [Manage Nodes],配置你的节点并将环境变量PATH设置为$PATH:/use/local/bin/。这样,在 slave 上运行的所有作业都会注入环境变量。

    2. 对于自动 cli 交互,heroku 支持 API 令牌。您可以将其放在构建机器上的~/.netrc 中,也可以作为环境变量提供(参见here)。

    【讨论】:

    • 当我执行哪个 Heroku 时,它是 /use/local/bin/Heroku。您能否提供一些有关如何将其添加到运行 Jenkins 的用户的说明
    • @AliNahid 添加到回答中
    【解决方案2】:

    (写在这里以防有人面临相同的情况) 好的,我接受了@vladimir 的建议并做了以下事情:

    Heroku 命令(适用于在 ec2 上运行的 jenkins):

    • 通过 jenkins/或其他 ci/cd 工具将构建的 docker 镜像推送到 heroku 需要以下命令;由于最近的更改 (https://devcenter.heroku.com/changelog-items/1426),推送到 heroku 注册表已经不够用了。为了执行以下命令,您需要安装 heroku toolbelt。

      heroku 容器:发布网络

    • 在 amazon linux 上安装 snap,如下所示:

    按照说明启用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 toolbelt:

    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"]
    

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 2020-05-26
      • 1970-01-01
      • 2014-11-01
      • 2019-09-16
      • 1970-01-01
      • 2018-11-20
      • 2020-08-19
      相关资源
      最近更新 更多