单节点安装
选择以下安装单节点管道的方法之一:
使用管道命令行安装程序安装
可以通过Docker和Docker Compose的pipes命令行安装程序安装管道,这将自动执行大多数安装过程。的命令行安装程序还用于更改配置设置、重新启动和升级管道。
当使用命令行安装程序时,它将代表您执行以下过程。
- 安装以下。
- 第三方依赖项(PostgreSQL数据库,RabbitMQ消息传递,包含在归档中)
- 管道
- 连接到Artifactory(使用
joinKey
而且jfrogUrl
). - 管道服务的配置,包括
- 用于构建节点访问的网络IP/URL分配
- 为REST api和补充UI分配网络IP/URL
- 连接到可选的外部数据库
- 默认生成映像的注册表
- 启动服务。
在安装先决条件
管道命令行安装程序调用码头工人组成来编排包含pipeline的多个Docker容器的安装。
为了方便命令行安装程序使用Docker Compose,您必须安装:
- 码头工人版本18.09或以上
- 码头工人组成版本1.24.1或以上
- Python版本2.7或以上
- 如果您使用HTTP或HTTPS代理服务器,请为Docker Daemon设置代理。有关更多信息,请参见https://docs.docker.com/config/daemon/systemd/在码头工人文档。
安装步骤
从下载的
rpm程序
,. deb
,或gz
文件(见系统目录查看JFrog根目录的值JFROG_HOME美元
).Linux存档(tar.gz)$ mkdir -p installer && tar - c installer -xvzf pipes -
.tar.gz $ cd installer/ pipes - $ ./ pipes——help #打印所有可用的命令行安装程序选项 RPM$ sudo rpm - uvh pipeline -<版本>。rpm $ cd $JFROG_HOME\ pipes \安装程序
Debian$ sudo dpkg -i pipeline -
.deb $ cd $JFROG_HOME\pipeline \installer . sh 使用RPM或Debian安装pipeline将使管道命令行安装命令可以从任何目录访问。
通过通用的Linux安装程序(.tar)进行安装涉及到提取管道文件(这是“管道”可执行文件与“。/pipeline”发挥作用的地方)。
运行安装程序。
$ sudo pipeline install \——base-url-ui
\——artifactory-joinkey \——install -ip \——api-url http:// :8082/ pipes /api . sh 现在可以对节点执行运行状况检查,以验证其运行正常
$ curl -XGET http://localhost:8046/router/api/v1/topology/health | jq '.'
如果在安装后重新启动计算机,请运行以下命令启动Pipilines。
美元JFROG_HOME /管道/安装/管道重新启动
舵安装
先决条件
在使用Helm Chart部署管道之前,您需要将以下内容准备就绪:
- 一个安装Artifactory
- DeployedNginx-ingress控制器
pipeline需要用Kubernetes入口控制器来设置Artifactory,以便所有功能都能工作。
有关更多信息,请参见舵手图表高级用户.
添加https://charts.jfrog.io给你的海尔姆客户
头盔回购添加jfrog https://charts.jfrog.io
更新存储库。
执掌回购更新
要将pipeline连接到Artifactory安装,您将需要使用连接键。要向管道安装提供连接键、jfrogururl和jfrogUrlUI,请检索从UI中获取Artifactory安装的连接细节,如下所示。有关更多信息,请参见查看连接键.
如果Artifactory和pipeline在同一个命名空间中,jfrogUrl是Artifactory的服务名称,否则它的Artifactory的外部URL jfrogUrl: "" ## Artifactory UI URL -必选##这必须是Artifactory的外部URL,例如:https://artifactory.example.com jfrogUrlUI: "" ##连接Artifactory的Join Key ##重要:您不应该在生产部署中使用joinKey示例!joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE # #管道需要一个独特的万能钥匙# #你可以生成一个命令:“openssl兰德十六进制32”# #重要:你不应该使用生产部署的例子万能钥匙!万能钥匙:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
得到管道
执掌图表
获取所需的配置文件。舵手取jfrog/管道-untar
文件的本地副本来配置安装
values-ingress.yaml
而且
values-ingress-passwords.yaml
使用所需的配置值。编辑url的
values-ingress.yaml
文件(Artifactory URL,输入主机,输入tls秘密)。
设置密码
uiUserPassword
,postgresqlPassword
而且auth.password
在本地副本中。设置
万能钥匙
而且joinKey
在values-ingress-passwords.yaml
.与其他安装不同的是,Helm Chart配置是针对
values.yaml
然后应用到system.yaml
.按照以下步骤应用配置更改。
- 做出更改
values.yaml。
运行该命令。
执掌升级——
安装
管道——命名空间管道-f values.yaml
- 做出更改
安装管道。
Kubectl创建ns pipeline helm upgrade -install pipeline -命名空间管道jfrog/pipeline -f pipeline /values-ingress。yaml - f管道/ values-ingress-passwords.yaml
从浏览器访问管道:
http:// < jfrogUrl > / ui /
,然后去管道选项卡中应用程序模块。检查已部署的头盔释放装置的状态。
领导地位的管道
有关高级安装选项,请参见赫尔姆海图安装高级用户.
HA安装
下面介绍如何设置包含两个或两个以上节点的pipes HA集群。有关更多信息,请参见系统架构.
选择以下安装单节点管道的方法之一:
先决条件
相同pipeline HA安装中的所有节点必须运行相同的pipeline版本。
许可
支持HA企业+执照.集群中的每个节点必须使用不同的license激活。
数据库
管路HA需要外部PostgreSQL数据库.确保你有完成外部数据库的设置在继续安装第一个节点之前。数据库连接详细信息用于每个节点的安装。
有几种方法可以设置PostgreSQL实现冗余。包括:HA、负载均衡和复制。更多的信息,请参阅PostgreSQL文档。.
RabbitMQ
RabbitMQ作为每个节点的pipeline安装的一部分安装。在HA架构中,它使用不同RabbitMQ节点之间的队列镜像。
网络
- 所有的pipeline HA组件(集群节点、数据库服务器和RabbitMQ)必须在同一个快速局域网内。
- 所有HA节点之间必须通过专用的TCP端口通信。
- 必须为每个集群节点启用集群节点之间的网络通信。
使用管道命令行安装程序安装HA
安装第一个节点
- 从下载的
rpm程序
,. deb
,或gz
文件,如所示单节点安装. 使用pipes命令行安装程序在第一个节点中执行安装过程。
注意:你得去拿你的jfrourl(自定义基URL)而且连接键链接您的管道安装到平台。$ sudo pipeline install \——base-url-ui
\——artifactory-joinkey \——db-connection-string postgres:// : @ : / \——install -ip \——api-url http:// :8082/pipeline /api \ 您可以对节点执行健康检查,以确认其运行正常。
$ curl -XGET http://localhost:8046/router/api/v1/topology/health | jq '.'
安装额外的节点
对每个额外的节点重复以下过程。
- 在新节点实例中,从下载的
rpm程序
,. deb
,或gz
文件,如对第一个节点执行的那样。 从第一个节点实例复制该文件JFROG_HOME美元/管道/ var / etc / system.yaml到新实例中的相同位置。
使用pipes命令行安装程序在新节点中执行安装过程。
$ sudo管道安装——install -ip
您可以对节点执行健康检查,以确认其运行正常。
$ curl -XGET http://localhost:8046/router/api/v1/topology/health | jq '.'
配置负载均衡器
在使用相同版本的pipeline安装了所有附加节点之后,必须将负载平衡器配置为分发通过公共基URI发出的请求。
例如,如果您希望管道可访问为mypipelines.jfrog.io通过HTTPS,那么端口映射应该配置如下:
URI | 磅(nginx / ELB) | 后端实例(年代) |
---|---|---|
https://mypipelines.jfrog.io | (端口:30001](TCP) (SSL终止) | (端口:30001) |
https://mypipelines-api.jfrog.io | (端口:8082](HTTP) (SSL终止) | (端口:8082) |
(端口:30200](TCP) (SSL终止) | (端口:30200) | |
(端口:30201](TCP) (SSL终止) | (端口:30201) |
更新节点
在每个节点上(包括第一个节点),再次运行pipes命令行安装程序,为负载均衡的URI更新安装:
$ sudo管道安装\——api-url https://mypipelines-api.jfrog.io/pipelines/api \
管道现在应该可以在你的JFrog平台在https://myartifactory.jfrog.io
.
安装舵哈
先决条件
在使用Helm Chart部署管道之前,您需要将以下内容准备就绪:
- 一个安装Artifactory
- p重新创建存储库
jfrogpipelines
在Artifactory类型的通用的
与一个maven-2-default
布局,和deployedNginx-ingress控制器
有关更多信息,请参见舵手图表高级用户.
重要的
目前,不可能将Kubernetes集群内的JFrog产品(例如pipeline)与集群外的另一个JFrog产品(例如Artifactory)连接起来,因为这被认为是一个单独的网络。因此,如果JFrog产品中有一个在hth华体会最新官方网站集群中,则不能将它们连接到一起。
高可用性
对于HA管路安装,请设置replicaCount在values.yaml
文件> 1(推荐3个)。强烈建议还配置RabbitMQ和Redis子图以高可用性模式运行.启动管道,每个服务有3个副本,RabbitMQ有3个副本。
helm upgrade——install pipes——命名空间管道——set replicaCount=3 jfrog/ pipes
添加ChartCenter执掌库给你的海尔姆客户
头盔回购添加jfrog https://charts.jfrog.io
更新存储库。
执掌回购更新
接下来,创建一个惟一的主密钥;pipeline需要一个惟一的主密钥,以供同一集群中的所有微服务使用。默认情况下,图表有一组
pipelines.masterKey
,在values.yaml
文件(与其他安装不同,Helm Chart配置是对values.yaml
然后应用到system.yaml
).对于生产级安装,强烈建议使用定制的主密钥。如果您最初使用默认的主密钥,那么在以后的阶段将很难更改主密钥。此密钥用于演示目的,不应在生产环境中使用。
生成一个唯一的密钥,并在安装/升级时传递给模板。
#导出MASTER_KEY=$(openssl rand -hex 32) echo ${MASTER_KEY}——命名空间管道jfrog/pipeline . masterKey=${MASTER_KEY
或者,您可以手动创建一个包含主密钥的秘密,并在安装/升级期间将其传递给模板。
#创建一个包含密钥的密钥导出MASTER_KEY=$(openssl rand -hex 32) echo ${MASTER_KEY}秘密中的密钥必须命名为master-key kubectl创建秘密通用my-secret——from-literal=master-key=${MASTER_KEY} #将创建的秘密传递给Helm Helm upgrade -install pipeline -set pipeline。masterKeySecretName=my-secret——命名空间管道jfrog/管道
在任何一种情况下,确保在所有未来的调用中传递相同的主键
舵安装
而且执掌升级
.在第一种情况下,这意味着总是通过——设置pipelines.masterKey = $ {MASTER_KEY}
.在第二种情况下,这意味着总是及格——设置pipelines.masterKeySecretName =我的秘密
并确保秘密内容不变。要将pipeline连接到Artifactory安装,您将需要使用连接键。来为您的pipeline安装提供一个连接键、jfrogururl和jfrogUrlUI,检索以以下方式从UI连接Artifactory安装的详细信息(有关更多信息,请参见查看连接键.
如果Artifactory和pipeline在同一个命名空间中,jfrogUrl是Artifactory的服务名称,否则它的Artifactory的外部URL jfrogUrl: "" ## Artifactory UI URL -必选##这必须是Artifactory的外部URL,例如:https://artifactory.example.com jfrogUrlUI: "" ##连接Artifactory的Join Key ##重要:您不应该在生产部署中使用joinKey示例!joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE # #管道需要一个独特的万能钥匙# #你可以生成一个命令:“openssl兰德十六进制32”# #重要:你不应该使用生产部署的例子万能钥匙!万能钥匙:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
得到管道
执掌图表
获取所需的配置文件。舵手取jfrog/管道-untar
文件的本地副本来配置安装
values-ingress.yaml
而且
values-ingress-passwords.yaml
使用所需的配置值。编辑url的
values-ingress.yaml
文件(Artifactory URL,输入主机,输入tls秘密)。
设置密码
uiUserPassword
,postgresqlPassword
而且auth.password
在本地副本中。设置
万能钥匙
而且joinKey
在values-ingress-passwords.yaml
.与其他安装不同的是,Helm Chart配置是针对
values.yaml
然后应用到system.yaml
.按照以下步骤应用配置更改。
- 做出更改
values.yaml。
运行该命令。
执掌升级——
安装
管道——命名空间管道-f values.yaml
- 做出更改
安装管道。
Kubectl创建ns pipeline helm upgrade -install pipeline -命名空间管道jfrog/pipeline -f pipeline /values-ingress。yaml - f管道/ values-ingress-passwords.yaml
从浏览器访问管道:
http:// < jfrogUrl > / ui /
,然后去管道选项卡中应用程序模块。检查已部署的头盔释放装置的状态。
领导地位的管道
有关高级安装选项,请参见赫尔姆海图安装高级用户.
产品配置
pipeline命令行安装程序的命令行选项可用于编排pipeline的自定义配置。这些可以在安装过程中使用管道安装
.你也可以跑步管道安装
更改配置设置。
$ sudo管道安装[flags]
所有可用的选项可以使用以下命令列出:
$ pipes help用法:./ pipes[flags]示例:./ pipes install命令:install Run pipes installation——installer-ip主机内部IP[必选]——base-url- UI统一UI URL[必选]——Artifactory -joinkey连接Artifactory的连接键[必选]——API - URL使用API提供的URL[必选]——base-url Artifactory内部URL——全球-password为所有服务(db、rabbitmq、pipes)设置一个密码。——install-user拥有安装程序生成的文件和文件夹的用户(和组)(默认为vagrant),例如obie, obie:obie, 1001:obie, 1002:1002)——Artifactory - Proxy用于连接Artifactory的代理服务器——Artifactory - Proxy -username代理服务器的用户——Artifactory - Proxy - Password代理服务器的密码——Artifactory - Service - Id注册Artifactory的服务Id。格式'jft@ '——image-registry-url用于pipeline组件映像的Docker注册表url——image-registry-creds包含映像注册表Docker凭据的文件路径,作为替代——image-registry-url——build-image-registry-url用于pipeline步骤中默认使用的映像的Docker注册表url——state-bucket用于存储状态的根桶名称——skip-image-pull不要提取映像——db-connection-string使用现有Postgres数据库的连接字符串——vault-url url——Vault - Root -token使用——Vault -url——no-verify-ssl指定现有Vault的根令牌,如果为true,在管道中使用的HTTP代理来代替从Artifactory获取的任何代理信息——global-http-proxy在管道中使用的HTTPS代理来代替从Artifactory获取的任何代理信息——global-no-proxy在管道中不使用代理设置来代替从Artifactory获取的任何代理信息——access-control-allow-origins API将返回这些作为允许的起源。应提供以逗号分隔的起源列表。——Disable -call-home关闭call home功能——enable-call-home如果之前禁用,则启用call home功能——RabbitMQ -health-check-interval RabbitMQ健康检查间隔时间(分钟)——Artifactory -health-check-interval Artifactory健康检查间隔时间(分钟)——db-health-check-interval数据库健康检查间隔时间(分钟)——config-backup-count保留备份配置的升级次数upgrade升级当前安装重启重启管道清洁删除管道组件和文件info打印控制台当前安装信息-j |——json打印当前安装控制和构建平面版本-j |——json打印信息为json help打印此消息
自定义安装目录
环境变量JFROG_HOME
用于确定为安装程序存储的所有配置文件和数据的位置。在任何安装命令中,将此变量导出到您所选择的位置。
$ JFROG_HOME=/my/dir/location管道安装....$ sudo JFROG_HOME=/my/dir/location管道安装....
如果没有由具有sudo权限的用户运行安装,请授予该用户的完全读/写权限JFROG_HOME
目录中。
所有安装程序命令(升级
,清洁
等)将需要JFROG_HOME
环境变量才能成功运行。
$ JFROG_HOME=/my/dir/location管道升级
为避免为每个命令导出变量,可以将其添加到全局环境文件中/etc/environment
或特定于用户的环境$ HOME / . bashrc
或$ HOME / . bash_profile
Artifactory连接细节
pipeline需要一个工作的Artifactory服务器和一个合适的许可证。到Artifactory的管道连接需要两个参数:
baseUrlUI- JFrog Artifactory所在机器的URL,或指向它的负载均衡器。建议使用DNS名称,不要直接使用ip地址。例如:
http://jfrog.acme.com
或http://10.20.30.40:8082
您还可以选择设置一个内部URL baseUrl来连接到Artifactory。如果您已经用负载平衡器设置了JFrog平台部署,那么您可能需要这样做。
使用——base-url-ui
选项将baseUrlUI和内部baseUrl设置为相同的URL,或同时使用两者——基本url
而且——base-url-ui
将它们设置为单独的url。的
——base-url-ui
是Artifactory的用户可访问URL,而——基本url
是Artifactory的“内部”路线。如果整个JFrog平台位于私有网络上,并且用户通过私有IP使用Artifactory,那么这些url将是相同的。在大多数情况下——base-url-ui
将是一个URL,而——基本url
将是内部IP、内部域名或负载均衡器IP。\在舵安装程序,
——基本url
应该是内部服务URL Artifactory。这更有效,减少了网络跳数,从而降低了大文件上传/下载期间断开连接的可能性。- joinKey-这是Artifactory注册和认证pipeline服务器所需的“秘密”密钥。
你可以取回ArtifactoryjoinKey
的JPD UI (join Key)管理模块|用户管理|设置|接入键.
使用——artifactory-joinkey
选项,通过命令行安装程序设置joinKey。
外部连接
管道需要网络配置,以支持管道CI服务器(在controlplane和所有可能的构建节点(在buildplane).构建节点必须能够通过管道REST api命令控制平面。由于构建节点可能运行在安装了pipes的私有网络或VPC之外(例如,在公有云中),因此这些通道的端口应该公开为公网IP地址。安全协议和身份验证减轻了这种暴露。
这些推荐的端口设置和公开确保了所有文档特性的完整功能,以及所有支持的构建节点类型和源代码的使用。定制配置可能支持管道功能的有限子集。
请联系JFrog支持用于帮助实现自定义安装。
安装程序选择 | 港口 | 协议 | 默认的 | 描述 |
---|---|---|---|---|
——installer-ip | 没有一个 | 没有一个 | REQUIRED: pipeline实例的基本IP。 | |
——api-url | 80822 | http / https | 没有一个 | REST api的IP或URL。例如: |
1必须对用户可访问(与base-url-ui的可访问性相同)
2必须能够从构建节点访问(对于云虚拟机来说是外部的)
例子
Artifactory: jfrog。mycompany.com
实例IP(内部):10.128.0.16
管道外部IP:34.217.93.187
|
外部URL(——API - URL)
API外部URL提供了从安装主机外部访问pipes REST API的功能。这个URL必须在第一次安装时使用——api-url选项定义;命令行安装程序没有默认的赋值。
该URL的首选形式是带有端口的IP地址,后面跟着路径/ pipes /api。例如:
——api-urlhttp://34.217.93.187:8082/pipelines/api
交替,如果您已经通过NAT网关或负载均衡器将您的服务URL设置为域名:
——api-urlhttp://mypipelines-api.mycompany.com/pipelines/api
外部数据库
先决条件
当使用外部PostgreSQL数据库时,如果连接字符串中使用的数据库用户不是master用户,请确保数据库master用户创建了Postgrespg_trgm
在安装管道之前。
创建不存在的扩展名
默认情况下,pipes安装并连接到一个PostgreSQL数据库,该数据库运行在与pipes服务相同的实例中。但是,如果需要,它可以配置为使用外部PostgreSQL数据库。这对于高可用性安装是必需的,以便pipeline的所有HA节点引用一个公共的、共享的数据库。
在继续安装pipeline之前,使用下面的命令创建具有适当权限的pipeline用户和数据库。修改相关值以匹配您的特定环境:
CREATE USER pipeline WITH PASSWORD ' PASSWORD ';CREATE DATABASE pipelesdb WITH OWNER=pipeline ENCODING= ' UTF8';授予管道所有权限
在确认脚本正确之后,您需要运行它来创建数据库并继续配置数据库。
安装pipeline时,必须在命令行安装程序中使用以下参数指定连接字符串。数据库连接详细信息用于每个节点的安装。
$ sudo pipeline install——db-connection-string postgres://: @ : /
外部库
默认情况下,pipeline安装并连接到与pipeline服务在同一实例中运行的保险库。但是,如果需要,可以将其配置为使用外部仓库。
安装pipeline时,必须指定vault-url
字符串和根令牌在命令行安装程序中使用以下参数。
$ sudo管道安装——vault-url——vault-root-token
在生产环境中使用Vault
要安全地使用保险库,您必须设置disablemlock
设置在values.yaml
来假
(见Hashicorp库建议)。
库:disablemlock:假的
代理设置
管道安装程序接受代理配置,使用代理服务器在命令行安装程序中使用以下参数连接到JFrog Artifactory实例:
$ sudo管道安装——artifactory-proxy\——artifactory-proxy-username \——artifactory-proxy-password
安装程序还从连接的JFrog Artifactory实例获取代理配置并将它们注入到所有微服务和执行节点中。这样做是为了确保所有外发连接使用相同的代理设置被父Artifactory实例使用。
状态
安装程序允许用户使用命令行安装程序设置状态提供程序。状态由管道用于存储
- 缓存
- 测试和覆盖报告
- 一步的工件
- 一步输出
- 运行输出
用户还可以使用状态间接地从UI下载控制台日志和构件。
使用——state-bucket < bucket名称>
配置用于存储状态的Artifactory存储库。如果此设置为空,则自动生成名称。
非根用户
的——安装用户<用户名>:< groupname >,
参数控制由安装程序创建的文件的用户和组设置。默认情况下,安装运行为当前登录的用户$ HOME
环境变量
先决条件
- 作为参数提供的用户和组必须在运行安装之前存在
- Ssh-keypair用于用户必须存在于
USER_HOME美元/ . ssh
目录 - 公钥应该在文件中
USER_HOME / . ssh / id_rsa . pub美元
- 私钥应该在文件中
USER_HOME / . ssh / id_rsa美元
将权限设置为600 - 正在使用的用户必须有权限
JFROG_HOME
目录(/ opt / jfrog
默认情况下) - 正在使用的用户必须的一部分
码头工人
组在主机上执行Docker命令 - 下面的附件必须可安装:Python、jq、yq、curl、nc、psql和Docker Compose
安装图像注册表
的——image-registry-url
参数指定将由pipes命令行安装程序安装的用于管道服务的Docker映像存储的端点。默认情况下,命令行安装程序将从JFrog分发注册表中安装pipelinereleases-docker.jfrog.io.
没有JFrog的指示,这是不应该更改的。
若要更改运行时生成映像的注册表,请使用——build_image_registry-url
如下所述。
更改默认生成映像注册表
标准的运行时构建映像集存储在releases-docker.jfrog.io
pipeline命令行安装程序默认设置此注册表位置。
您可能希望将构建映像复制到本地Docker注册表,以提高映像提取时间或避免需要访问远程注册表。将图像复制到新位置后,需要更新pipeline以使用该位置。这可以在安装期间完成,也可以作为升级的一部分。假设您只是移动了所有默认图像,这只需要设置——build-image-registry-url
选项,以在运行任意一个时更新管道的所有默认映像管道升级
或管道安装
.
$ sudo pipeline upgrade—build-image-registry-url my.docker.registry.io
而设置——build-image-registry-url
对于新注册表,确保新注册表允许匿名访问以进行提取。
或者,如果希望使用多个注册中心或更改默认映像的名称,则可以编辑管道系统YAML文件,然后运行管道升级
没有——build-image-registry-url
选项开始使用新的图像设置。
访问管道
一旦安装完成,管道就可以作为JFrog平台部署的一部分被访问。
- 从浏览器访问JFrog平台。例如,在:
http: / < jfrogUrl >/ ui /
. - 对于管道函数,请转到管道选项卡中应用程序模块。
一旦安装完成,开始配置管道创建构建节点池、添加集成和添加管道源.
重新启动管道
可能需要重新启动节点上的pipeline。例如,如果虚拟机重新启动,则需要重新启动pipeline使其重新开始运行。
如果管道安装了sudo和默认JFROG_HOME美元
、运行sudo管道重新启动
.O安装管道HAtherwise,跑管道重新启动
作为安装了pipeline和/或具有相同功能的用户JFROG_HOME美元
环境变量。