跳到内容

部署内容英格兰vs伊朗让球rstudio / connect-api-deploy-shinyGitHub存储库中包含了一个示例Shiny应用程序,并在部署脚本中使用了本节中的食谱,你可以在构建自己的工作流时作为示例使用。

连接服务器API参考包含这些菜谱中使用的每个端点的文档。

请注意

这些食谱使用bash代码片段和依赖旋度来执行HTTP请求。我们使用CONNECT_SERVERCONNECT_API_KEY中引入的环境变量开始这本烹饪书的部分。

例子工作流创建一个新的内容项;内容可以接收多次部署。
  • 创建一个包捕获代码及其依赖项。
  • 上传bundle存档RSt英格兰vs伊朗让球udio连接。
  • 可选地,设置环境变量内容在运行时需要的。
  • 部署(激活)那个bundle并监控其进展。
  • 轮询任务的更新;获取已派遣行动的最新信息。
  • 您可以选择在每次部署时创建一个新的内容项,或者重复瞄准相同的内容项。在继续开发该应用程序或报告时重用现有内容项是一种很好的实践。为新的工件创建新的内容项。

    重要的

    在更改内容类型时,必须创建一个新的内容项。例如,不能将包含R Markdown文档的包部署到已经运行Dash应用程序的内容项上。

    创建内容POST / v1 /内容API是用于在RStudio Connect中创建新内容项的端点。英格兰vs伊朗让球它接受一个JSON文档作为输入。Connect Server API Reference描述了可能提供给这个端点的全部字段。

    我们的例子只会提供两个字段:的名字标题:

    • 的名字:该字段是必需的,并且必须在您的帐户内的所有内容中是唯一的。这是一个描述性的,url友好的标识符。

    • 标题:该字段是可选的,是定义用户友好标识符的地方。当设置时,标题显示在RStudio Conne英格兰vs伊朗让球ct仪表板上,而不是的名字

    举个例子:

    出口数据=` {"name": "shakespeare", "title": "shakespeare Word Clouds"}'curl—silent—show-error—l—max-redirs0- - -失败- x的帖子\- h“授权:关键$ {CONNECT_API_KEY}\——数据$ {数据}\$ {CONNECT_SERVER}__api__ / v1 /内容”# = > {# => "guid": "ccbd1a41-90a0-4b7b-89c7-16dd9ad47eb5",# =>“name”:“shakespeare”,# => "title": "Shakespeare Word Clouds",# = >…# => "owner_guid": "0b609163-aad5-4bfd-a723-444e446344e3",# = >}

    额外的内容字段:

    让我们定义一个CONTENT_GUID环境变量,包含GUID我们刚刚创建的内容。我们将在剩下的部署示例中使用这个变量:

    出口CONTENT_GUID=“ccbd1a41 - 90 - a0 - 4 - b7b - 89 - c7 - 16 - dd9ad47eb5”

    创建一个包
    这个目录应该是你当前的工作目录。Rscript - e“rsconnect:: writeManifest()”

  • 来自R控制台:

    这个目录应该是你当前的工作目录。rsconnect::writeManifest()

    请注意

    请使用rsconnect版本0.8.15或更高,当生成清单文件。

  • 对于基于python的内容,你可以使用rsconnect-python包来创建manifest.json。确保你的项目使用的Python环境是激活的,然后创建一个特定于你的项目类型的清单(笔记本,api,破折号,散景,或streamlit):

    rsconnect write-manifest$ {类型}。/
    看到
    rsconnect-python文档获取详细信息。

  • 我们建议提交manifest.json到您的源代码控制系统中,并在您推送代码的新版本时重新生成它——特别是在更新包或以其他方式更改其依赖关系时!指的是用户指南有关创建清单的更多信息。

    请注意

    如果你的RStu英格兰vs伊朗让球dio Connect安装使用了Kubernetes的脱机内容执行(这个功能目前还在beta中),你可以选择指定你想要Connect在构建你的内容时使用哪个图像:

    #从一个R控制台(这个目录应该是你当前的工作目录):rsconnect::writeManifest(图像=“ghcr.io 英格兰vs伊朗让球/ rstudio /内容:r4.0.5-py3.8.8-bionic”)
    #使用' rsconnect-python '包:rsconnect write-manifest$ {类型}——图片“ghcr.io 英格兰vs伊朗让球/ rstudio /内容:r4.0.5-py3.8.8-bionic”。/

    您只能使用管理员已配置的映像。您可以通过登录RStudio Connect并单击英格兰vs伊朗让球文档按钮在页面顶部。参见《用户指南》页面出版从R从命令行发布为更多的细节。

    创建您的包gz收集了要包含的文件集后进行归档。这里有一个归档一个简单的Shiny应用程序的例子;的app.R包含R源和数据是应用程序加载的数据文件目录:

    Tar CZF bundle.tar.gz清单。json app.R数据

    上传包POST / v1 /内容/ {guid} /包端点来上传内容包bundle.tar.gz文件作为其有效载荷:

    curl—silent—show-error—l—max-redirs0- - -失败- x的帖子\- h“授权:关键$ {CONNECT_API_KEY}\——data-binary @“bundle.tar.gz”\$ {CONNECT_SERVER}__api__ / v1 /内容/$ {CONTENT_GUID}/包”# = >{“bundle_id”:“485”,“bundle_size”:162987}

    来自上传端点的响应包含创建的bundle的标识符和接收到的字节数。

    重要的

    必须使用——data-binary参数旋度,它发送数据文件而不进行额外处理。做使用——数据论点:当你“提交”一个表单时,它以与浏览器相同的方式提交数据,这是不合适的。

    从上传响应中提取bundle ID,并将其分配给aBUNDLE_ID环境变量:

    出口BUNDLE_ID=“485”

    设置环境变量
    #构建JSON输入来设置环境变量。SECRET_TOKEN=数据='[{"name": "TOKEN", "value": "'$ {SECRET_TOKEN}"},{" name ": " DATA_URL”、“价值”:“https://example.com/data”}]“#设置环境变量。curl—silent—show-error—l—max-redirs0- - -失败- x片\- h“授权:关键$ {CONNECT_API_KEY}\——数据$ {数据}\$ {CONNECT_SERVER}__api__ / v1 /内容/$ {CONTENT_GUID}/环境”# = >(“DATA_URL”,“令牌”)

    部署包POST / v1 /内容/ {guid} /部署端点:

    注意:这个例子保存了从Connect服务器返回的cookie,所以它可以被传递到下面的任务轮询端点。在Connect的单节点配置中,可以省略cookie。

    #构建命名要部署的bundle的JSON输入。出口数据=“{”bundle_id”:“”$ {BUNDLE_ID}“}”#触发部署。curl—silent—show-error—l—max-redirs0- - -失败- x的帖子\- h“授权:关键$ {CONNECT_API_KEY}\——数据$ {数据}\- c cookie.txt\$ {CONNECT_SERVER}__api__ / v1 /内容/$ {CONTENT_GUID}/部署”# = >{“task_id”:“BkkakQAXicqIGxC1”}

    部署请求的结果包含一个任务标识符,我们用它来轮询该部署任务的进度:

    出口任务=“BkkakQAXicqIGxC1”

    轮询任务GET / v1 /任务/ {id}Endpoint检索关于已分派操作的最新信息。

    注意:在Connect的高可用性集群部署中,任务请求必须由执行任务的节点提供服务。这是通过确保从部署操作返回的cookie包含在后续的请求中来实现的,以便负载均衡器能够适当地指导请求。在单节点配置中,可以省略cookie。

    有两种方式来轮询任务信息:

    • 你可以请求完整的任务输出
    • 你可以请求增量任务输出

    第一个URL查询参数控制返回多少数据。

    下面是一个典型的初始任务进度请求。它没有指定第一个URL查询参数,意味着返回所有可用的输出。当第一个是不是给出了,价值第一次= 0假定。

    curl—silent—show-error—l—max-redirs0——失败\- h“授权:关键$ {CONNECT_API_KEY}\- b cookie.txt\$ {CONNECT_SERVER}__api__ / v1 /任务/$ {任务}?等待= 1”# = > {# => "id": "BkkakQAXicqIGxC1",# => "output": [# =>“Building Shiny application…”,# => "Bundle requested R version 3.5.1;使用……”# = >),# => "finished": false,# => "code": 0,# => "error": "",# =>“last”:2 .# = >}

    等待= 1参数告诉服务器收集最多1秒的输出。这种长轮询方法是在轮询循环中显式休眠的一种替代方法。

    最后的字段可以让我们增量地获取任务输出。我们的初始请求返回两个输出行;我们希望下一个请求从该点开始继续。

    这里是一个任务进度的请求,它不包括前两行输出:

    出口第一个=2curl—silent—show-error—l—max-redirs0——失败\- h“授权:关键$ {CONNECT_API_KEY}\$ {CONNECT_SERVER}__api__ / v1 /任务/$ {任务}?等待= 1和=$ {第一个}# = > {# => "id": "BkkakQAXicqIGxC1",# => "output": [# => "删除先前的清单。Json to packrat transform .",# =>“执行清单。Json to packrat transform .",# = >),# => "finished": false,# => "code": 0,# => "error": "",# => "last": 4# = >}

    继续增量地获取任务进度,直到响应被标记为完成。输出的最后一行包含在这个响应中。

    出口第一个=86curl—silent—show-error—l—max-redirs0——失败\- h“授权:关键$ {CONNECT_API_KEY}\$ {CONNECT_SERVER}__api__ / v1 /任务/$ {任务}?等待= 1和=$ {第一个}# = > {# => "id": "BkkakQAXicqIGxC1",# => "output": [# => "Completed packrat build against R version: '3.4.4'",# =>“Launching Shiny application…”# = >),# => "finished": true,# => "code": 0,# => "error": "",# => "last": 88# = >}

    错误在响应中用非零表示代码和一个错误消息。很可能输出流还包括信息,将帮助您理解错误的原因。例如,安装R包的问题会出现在输出

    访问部署内容
    #获取仪表盘URLDASHBOARD_URL=$ (curl—silent—show-error—l—max-redirs0——失败\- h“授权:关键$ {CONNECT_API_KEY}\$ {CONNECT_SERVER}__api__ / v1 /内容/$ {CONTENT_GUID}|金桥- r .dashboard_url)

    内容也可以直接访问,无需连接仪表板框架,通过content_url:

    #获取内容URLCONTENT_URL=$ (curl—silent—show-error—l—max-redirs0——失败\- h“授权:关键$ {CONNECT_API_KEY}\$ {CONNECT_SERVER}__api__ / v1 /内容/$ {CONTENT_GUID}|金桥- r .content_url)

    你可以在浏览器中访问CONTENT_URL,或者使用它来访问诸如Plumber或Flask api等内容。例如,如果你部署了一个管道工API来响应帖子请求的/评估端点:

    curl—silent—show-error—l—max-redirs0- - -失败- x的帖子\- h“授权:关键$ {CONNECT_API_KEY}\$ {CONTENT_URL}评估”

    部署新版本通过名称识别内容
    出口的名字=“my-unique-app-name”出口数据=“{”名称”:“”$ {的名字}“}”curl—silent—show-error—l—max-redirs0- - -失败- x的帖子\- h“授权:关键$ {CONNECT_API_KEY}\——数据$ {数据}\$ {CONNECT_SERVER}__api__ / v1 /内容”

    部署更新时,可以获取内容GUID使用这个名字。内容名称保证在单个用户的帐户内是唯一的,但也有可能多个用户创建具有相同名称的内容。要确保返回单个内容项,请提供GUID创建内容的用户帐户。

    #获取内容创建者的GUID(这个API键的所有者)curl—silent—show-error—l—max-redirs0——失败- x\- h“授权:关键$ {CONNECT_API_KEY}\$ {CONNECT_SERVER}__api__ / v1 /用户”# = > {# => "email": "user@example.com",# => "username": "user",# = >…# => "guid": "0b609163-aad5-4bfd-a723-444e446344e3",# = >}OWNER_GUID=“0 b609163 aad5 - 4 - bfd a723 - 444 e446344e3”#按名称和所有者查找应用程序curl—silent—show-error—l—max-redirs0——失败- x\- h“授权:关键$ {CONNECT_API_KEY}\$ {CONNECT_SERVER}__api__ / v1 /内容?name =$ {的名字}&owner_guid =$ {OWNER_GUID}# = > [# = > {# => "guid": "ccbd1a41-90a0-4b7b-89c7-16dd9ad47eb5",# =>“name”:“my-unique-app-name”,# = >…# => "owner_guid": "0b609163-aad5-4bfd-a723-444e446344e3",# = >}# = >]CONTENT_GUID=“ccbd1a41 - 90 - a0 - 4 - b7b - 89 - c7 - 16 - dd9ad47eb5”

    然后遵循通常的更新步骤,传入CONTENT_GUID在上传和部署bundle时。