Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Jenkins 中文社区
Jenkins 中文社区官方网站
提交
502d7769
J
Jenkins 中文社区官方网站
项目概览
Jenkins 中文社区
/
Jenkins 中文社区官方网站
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
Jenkins 中文社区官方网站
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
502d7769
编写于
6月 15, 2019
作者:
LinuxSuRen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Auto commit by hugo-plugin.
上级
e676bcdc
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
210 addition
and
53 deletion
+210
-53
index.html
index.html
+13
-13
index.json
index.json
+6
-6
index.xml
index.xml
+5
-3
sitemap.xml
sitemap.xml
+5
-5
tags/cd/index.xml
tags/cd/index.xml
+3
-1
tags/ci/index.html
tags/ci/index.html
+26
-1
tags/ci/index.xml
tags/ci/index.xml
+5
-3
tags/index.xml
tags/index.xml
+2
-2
tags/jenkins-x/index.xml
tags/jenkins-x/index.xml
+3
-1
tags/jenkins/index.html
tags/jenkins/index.html
+26
-1
tags/jenkins/index.xml
tags/jenkins/index.xml
+2
-2
tags/jenkins/page/2/index.html
tags/jenkins/page/2/index.html
+25
-0
tags/jenkins/page/3/index.html
tags/jenkins/page/3/index.html
+25
-0
tags/k8s/index.xml
tags/k8s/index.xml
+3
-1
tags/kubernetes/index.xml
tags/kubernetes/index.xml
+3
-1
tags/spring-boot/index.xml
tags/spring-boot/index.xml
+3
-1
wechat/articles/2019/05/2019-05-24-achieve-cicd-with-jenkins-x-kubernetes-and-spring/index.html
...ieve-cicd-with-jenkins-x-kubernetes-and-spring/index.html
+6
-2
wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/index.html
...9/06/2019-06-14-setup-jenkins-ci-in-30-minutes/index.html
+5
-5
wechat/index.html
wechat/index.html
+26
-1
wechat/index.xml
wechat/index.xml
+5
-3
wechat/management/auto-reply/keywords-event-group.yml
wechat/management/auto-reply/keywords-event-group.yml
+11
-0
wechat/management/auto-reply/keywords-wechat-group.yml
wechat/management/auto-reply/keywords-wechat-group.yml
+1
-0
wechat/management/auto-reply/keywords-welcome.yml
wechat/management/auto-reply/keywords-welcome.yml
+1
-1
未找到文件。
index.html
浏览文件 @
502d7769
...
@@ -39,7 +39,7 @@
...
@@ -39,7 +39,7 @@
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
itemprop=
"name"
content=
"Jenkins 中文社区"
>
<meta
itemprop=
"name"
content=
"Jenkins 中文社区"
>
<meta
itemprop=
"description"
content=
""
>
<meta
itemprop=
"description"
content=
""
>
...
@@ -279,15 +279,15 @@ var trackOutboundLink = function(id, url) {
...
@@ -279,15 +279,15 @@ var trackOutboundLink = function(id, url) {
<a
href=
"/event/
shenzhen
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<a
href=
"/event/
beijing-2019-11
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
shenzhen.jpe
g"
></img>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
hacktberfest.jp
g"
></img>
</a>
</a>
<a
href=
"/event/
beijing-2019-11
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<a
href=
"/event/
shenzhen
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
hacktberfest.jp
g"
></img>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
shenzhen.jpe
g"
></img>
</a>
</a>
...
@@ -300,25 +300,25 @@ var trackOutboundLink = function(id, url) {
...
@@ -300,25 +300,25 @@ var trackOutboundLink = function(id, url) {
<a
href=
"/event/shanghai-2019-06/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/shanghai.jpeg"
></img>
</a>
<a
href=
"/event/wuhang/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/hacktberfest.jpg"
></img>
</a>
<a
href=
"/event/
shanghai-2019-06
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<a
href=
"/event/
beijing-2019-06-22
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
shanghai
.jpeg"
></img>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
ci-cd
.jpeg"
></img>
</a>
</a>
<a
href=
"/event/
beijing-2019-06-22
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<a
href=
"/event/
wuhang
/"
class=
"tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5"
>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
ci-cd.jpe
g"
></img>
<img
width=
"400px"
height=
"200px"
src=
"/images/meetup/
hacktberfest.jp
g"
></img>
</a>
</a>
...
...
index.json
浏览文件 @
502d7769
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
"uri"
:
"https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
,
"uri"
:
"https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
,
"title"
:
"30分钟搞定 Jenkins CI"
,
"title"
:
"30分钟搞定 Jenkins CI"
,
"type"
:
"wechat"
,
"type"
:
"wechat"
,
"date"
:
"2019-06-1
5
00:00:00 +0000 UTC"
,
"date"
:
"2019-06-1
4
00:00:00 +0000 UTC"
,
"tags"
:
[
"jenkins"
,
"ci"
],
"tags"
:
[
"jenkins"
,
"ci"
],
"description"
:
"设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件"
,
"description"
:
"设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件"
,
"content"
:
" 你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
\n
1.先决条件 开始之前,我们需要以下先决条件:
\n
我们使用了 Ubuntu 18.04; 必须安装 Docker,有关安装说明,请参见此处; 我们需要在 Docker registry 来推送我们的 Docker 镜像。最简单的方法是在DockerHub上创建一个帐户。你可以免费创建帐户。也不会收到垃圾广告邮件; 构建工作的 Spring Boot 应用程序。我们将使用前一篇文章中的 Spring Boot MVC 应用程序。源代码可以在GitHub上找到,相应的Docker图像可以在DockerHub上找到。该应用程序包含 http://localhost:8080/hello 上的一个 HTTP 端点,并只返回一条 Hello Kubernetes 欢迎消息。
\n
2.运行 Jenkins CI 我们将使用 Jenkins CI Docker 官方镜像运行 Jenkins 服务。完整的文档可以在这里找到。用以下命令启动容器:
\n
$ docker run -p 8080:8080 --name myjenkins -v jenkins_home:/var/jenkins_home -v jenkins_downloads:/var/jenkins_home/downloads jenkins/jenkins:lts 让我们来仔细看看我们正在做什么:
\n
-p 8080:8080:我们将内部 Jenkins 端口(冒号后)映射到外部端口,该端口可从我们的 Docker 主机访问;
\u
0026ndash;name myjenkins:我们为容器提供一个名称;否则,Docker将为你生成一个名称。最好给它起个名字;这样,你可以轻松地启动和停止容器; -v jenkins_home:/var/jenkins_home:我们希望将内部 Jenkins 主目录(冒号之后)映射到 Docker 主机上的一个目录。通过这种方式,Jenkins 数据将被保存在我们的主机上,这让我们有机会备份数据; -v jenkins_downloads:/var/jenkins_home/downloads:我们需要在Jenkins中安装额外的工具; 因此,我们创建一个目录来复制 *.tar.gz 文件。在这篇文章的后面,我们将清楚地知道我们将使用目录做什么; jenkins/jenkins:lts:要使用的 Docker 镜像。我们将使用 LTS 版本,但如果你愿意,也可以使用不太稳定的版本。在撰写本文时,v2.150.1 是 LTS 版本。 在此之后,你可以通过其名称停止和启动容器: ··· $ docker stop myjenkins $ docker start myjenkins ···
\n
3.配置 Jenkins 以供首次使用 一旦容器启动后,我们就可以访问 Jenkins Web 控制台了。当然,我们需要知道 Jenkins 实例的 IP 地址。因此,请执行以下命令:
\n
$ docker inspect myjenkins 这将显示一些 JSON 输出。转到该 Networks 部分,参数 IPAddress 显示我们的 Jenkins IP 地址(在我们的例子中为172.17.0.3):
\n\u
0026quot;Networks
\u
0026quot;: {
\u
0026quot;bridge
\u
0026quot;: {
\u
0026quot;IPAMConfig
\u
0026quot;: null, ...
\u
0026quot;IPAddress
\u
0026quot;:
\u
0026quot;172.17.0.3
\u
0026quot;, ...
\u
0026quot;DriverOpts
\u
0026quot;: null } } Jenkins Web 控制台可通过浏览器访问 http://172.17.0.3:8080/。
\n
这将向我们显示以下页面:
\n
我们使用临时密码,启动容器后在控制台输出中显示:
\n
************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: f586346583e04fa78e2cc8edbf7566e1 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 输入临时密码后,将显示一个页面,在这里我们可以选择要安装的默认插件集或自定义插件集。我们将选择默认设置。
\n
现在,坐等插件安装好:
\n
接下来,创建第一个管理员用户:
\n
最后,配置 Jenkins 实例:
\n
太棒了!Jenkins 现在已经准备好可以使用了:
\n
4.安装所需的工具 我们的构建需要在 Jenkins 中提供一些工具。我们需要 JDK11,Maven 和 Docker。在下一节中,我们将展示如何在容器中使用这些属性。
\n
在启动容器期间,我们在容器中创建了 /var/jenkins_home/downloads 的挂载卷。首先,我们将验证是否可以从容器中访问此路径。执行以下命令:
\n
··· $ docker exec -it myjenkins ls -l /var/jenkins_home/downloads total 0 ···
\n
如上所述返回0个结果时,那么我们就可以继续了。否则,你必须检查在启动容器期间是否输入正确。
\n
4.1 安装 JDK 11 我们将使用 Adopt OpenJDK 11,可在此处下载。我们必须将下载的 *.tar.gz 文件复制到已安装在主机上的卷 jenkins_home/downloads 中。为了检索我们机器上的路径,我们再次执行 docker inspect 命令,就像以前检索Jenkins IP地址一样。这一次,转到分段 Mounts:
\n\u
0026quot;Mounts
\u
0026quot;: [ ... {
\u
0026quot;Type
\u
0026quot;:
\u
0026quot;volume
\u
0026quot;,
\u
0026quot;Name
\u
0026quot;:
\u
0026quot;jenkins_downloads
\u
0026quot;,
\u
0026quot;Source
\u
0026quot;:
\u
0026quot;/var/lib/docker/volumes/jenkins_downloads/_data
\u
0026quot;,
\u
0026quot;Destination
\u
0026quot;:
\u
0026quot;/var/jenkins_home/downloads
\u
0026quot;, ... } ], 在我们的示例中,卷位于 /var/lib/docker/volumes/jenkins_downloads/_data 上。将 *.tar.gz 文件复制到此位置。
\n
跳转到 Manage Jenkins – Global Tool Configuration 和 *JDK 安装部分*。单击 Add JDK 按钮。默认情况下,java.sun.com 会添加安装程序。我们不会使用这个,所以删除它并添加一个 Extract *.zip/*.tar.gzinstaller。根据下面的屏幕截图填写字段。二进制存档的路径是 file:/var/jenkins_home/downloads/OpenJDK11U-jdk_x64_linux_hotspot_11.0.1_13.tar.gz。Label 留空是很重要的;否则,JDK的安装将失败。
\n
跳转到 *Manage Jenkins – Configure System*,到 Global properties 部分并启用 *环境变量*。为其添加环境变量 JAVA_HOME 并填充路径 /var/jenkins_home/tools/hudson.model.JDK/JDK11/jdk-11.0.1+13。
\n
4.2 安装 Maven 我们将使用 Maven 3.6.0,可以在这里下载。安装过程与 JDK 安装相同:下载 *.tar.gz 文件并将其复制到 jenkins_home/downloads。
\n
转到 Manage Jenkins – Global Tool Configuration 和 Maven 安装部分。单击 Add Maven 按钮。默认情况下,Apache 会添加安装程序。我们不会使用这个,所以删除它并添加一个 Extract *.zip/*.tar.gzinstaller。根据下面的屏幕截图填写字段。二进制存档的路径是 file:/var/jenkins_home/downloads/apache-maven-3.6.0-bin.tar.gz。Label 留空是很重要的;否则,Maven 的安装将失败。将子目录设置为 apache-maven-3.6.0 也很重要;否则,Maven 主目录没有正确设置,mvn 可执行文件将无法找到。
\n
4.3 配置 Docker 在 Docker 内部安装 Docker 不是一个好主意,请参阅本文。因此,我们将使用宿主机的 Docker 安装,并将宿主机的 Docker 套接字挂载到容器。实际上,这也不是一个好主意,但是对于我们的 Jenkins 实验环境来说,这是可以的,但是出于安全原因,永远不要以这种方式暴露 Docker 套接字。
\n
我们删除现有的容器(这不是有害的,因为我们的所有数据都保存在我们的主机上,我们不会丢失任何数据),然后使用 -v /var/run/docker.sock:/var/run/docker.sock 重新启动容器。
\n
$ docker rm myjenkins $ docker run -p 8080:8080 --name myjenkins -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home -v jenkins_downloads:/var/jenkins_home/downloads jenkins/jenkins:lts 为了使其工作,我们还必须设置 docker.sock 的权限给 jenkins 用户。默认情况下,它被挂载为 root,因此,由于 Permission Denied 错误,我们的构建将失败。
\n
以 root 身份登录 Docker 容器:
\n
$ docker exec -it -u root myjenkins 检查权限 docker.sock,这表明它拥有者 root:
\n
$ ls -l /var/run/docker.sock srw-rw---- 1 root 999 0 Jan 6 11:45 /var/run/docker.sock 让 jenkins 成为新所有者,并再次列出权限:
\n
$ chown jenkins: /var/run/docker.sock $ ls -l /var/run/docker.sock srw-rw---- 1 jenkins jenkins 0 Jan 6 11:45 /var/run/docker.sock 现在,jenkins 是所有者,我们不会再得到 Permission Denied 的错误。
\n
为了将 Docker 镜像推入 Docker registry,我们需要通过 settings.xml 将凭据提供给 Maven。我们可以通过配置文件提供程序插件轻松地提供 settings.xml。去 Manage Jenkins – Manage plugins 并安装插件(不重启安装)。
\n
转到 *Manage Jenkins – Managed files*,然后单击 *Add a new Config*。创建 Global Maven settings.xml 并使用 DockerHub 帐户凭据添加以下部分:
\n\u
0026lt;servers
\u
0026gt;
\u
0026lt;server
\u
0026gt;
\u
0026lt;id
\u
0026gt;docker.io
\u
0026lt;/id
\u
0026gt;
\u
0026lt;username
\u
0026gt;docker_username
\u
0026lt;/username
\u
0026gt;
\u
0026lt;password
\u
0026gt;docker_password
\u
0026lt;/password
\u
0026gt;
\u
0026lt;/server
\u
0026gt;
\u
0026lt;/servers
\u
0026gt; 5.创建构建工作 最后要做的是创建我们的构建工作。转到 Jenkins CI 主页,然后单击 *New Item*。我们将把构建工作命名为 *MyKubernetesPlanet*,并选择一个 *Freestyle Project*。
\n
在构建工作的配置部分,我们转到 Source Code Management 部分,并填写 Git URL https://github.com/mydeveloperplanet/mykubernetesplanet.git 和 branch */feature/jenkinsci。
\n
在 Build 部分,我们添加了一个 Invoke top-level Maven targets 的构建步骤。我们将调用以下 Maven 目标来构建我们的应用程序并将 Docker 镜像推送到 Docker registry:
\n
$ clean install dockerfile:push 我们还需要设置之前创建的 Maven版本 和 *全局配置文件*。
\n
手动为我们的工作启动构建,这将创建 jar 文件,创建我们的 Docker 镜像,并将其推送到 Docker registry。
\n
6.结论 在本文中,我们提供了一种让 Jenkins 实例运行的快速方法,包括执行 Maven 构建、创建 Docker 镜像并将其推入 Docker registry 的构建作业。请注意,这不是一种安全的方法,但是对于实验用例来说,它并没有太大的危害。现在我们已经有了一个完全运行的 Jenkins 实例,我们可以使用它来测试新的 Jenkins 插件。
\n
"
,
"content"
:
" 你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
\n
1.先决条件 开始之前,我们需要以下先决条件:
\n
我们使用了 Ubuntu 18.04; 必须安装 Docker,有关安装说明,请参见此处; 我们需要在 Docker registry 来推送我们的 Docker 镜像。最简单的方法是在DockerHub上创建一个帐户。你可以免费创建帐户。也不会收到垃圾广告邮件; 构建工作的 Spring Boot 应用程序。我们将使用前一篇文章中的 Spring Boot MVC 应用程序。源代码可以在GitHub上找到,相应的Docker图像可以在DockerHub上找到。该应用程序包含 http://localhost:8080/hello 上的一个 HTTP 端点,并只返回一条 Hello Kubernetes 欢迎消息。
\n
2.运行 Jenkins CI 我们将使用 Jenkins CI Docker 官方镜像运行 Jenkins 服务。完整的文档可以在这里找到。用以下命令启动容器:
\n
$ docker run -p 8080:8080 --name myjenkins -v jenkins_home:/var/jenkins_home -v jenkins_downloads:/var/jenkins_home/downloads jenkins/jenkins:lts 让我们来仔细看看我们正在做什么:
\n
-p 8080:8080:我们将内部 Jenkins 端口(冒号后)映射到外部端口,该端口可从我们的 Docker 主机访问;
\u
0026ndash;name myjenkins:我们为容器提供一个名称;否则,Docker将为你生成一个名称。最好给它起个名字;这样,你可以轻松地启动和停止容器; -v jenkins_home:/var/jenkins_home:我们希望将内部 Jenkins 主目录(冒号之后)映射到 Docker 主机上的一个目录。通过这种方式,Jenkins 数据将被保存在我们的主机上,这让我们有机会备份数据; -v jenkins_downloads:/var/jenkins_home/downloads:我们需要在Jenkins中安装额外的工具; 因此,我们创建一个目录来复制 *.tar.gz 文件。在这篇文章的后面,我们将清楚地知道我们将使用目录做什么; jenkins/jenkins:lts:要使用的 Docker 镜像。我们将使用 LTS 版本,但如果你愿意,也可以使用不太稳定的版本。在撰写本文时,v2.150.1 是 LTS 版本。 在此之后,你可以通过其名称停止和启动容器: ··· $ docker stop myjenkins $ docker start myjenkins ···
\n
3.配置 Jenkins 以供首次使用 一旦容器启动后,我们就可以访问 Jenkins Web 控制台了。当然,我们需要知道 Jenkins 实例的 IP 地址。因此,请执行以下命令:
\n
$ docker inspect myjenkins 这将显示一些 JSON 输出。转到该 Networks 部分,参数 IPAddress 显示我们的 Jenkins IP 地址(在我们的例子中为172.17.0.3):
\n\u
0026quot;Networks
\u
0026quot;: {
\u
0026quot;bridge
\u
0026quot;: {
\u
0026quot;IPAMConfig
\u
0026quot;: null, ...
\u
0026quot;IPAddress
\u
0026quot;:
\u
0026quot;172.17.0.3
\u
0026quot;, ...
\u
0026quot;DriverOpts
\u
0026quot;: null } } Jenkins Web 控制台可通过浏览器访问 http://172.17.0.3:8080/。
\n
这将向我们显示以下页面:
\n
我们使用临时密码,启动容器后在控制台输出中显示:
\n
************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: f586346583e04fa78e2cc8edbf7566e1 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 输入临时密码后,将显示一个页面,在这里我们可以选择要安装的默认插件集或自定义插件集。我们将选择默认设置。
\n
现在,坐等插件安装好:
\n
接下来,创建第一个管理员用户:
\n
最后,配置 Jenkins 实例:
\n
太棒了!Jenkins 现在已经准备好可以使用了:
\n
4.安装所需的工具 我们的构建需要在 Jenkins 中提供一些工具。我们需要 JDK11,Maven 和 Docker。在下一节中,我们将展示如何在容器中使用这些属性。
\n
在启动容器期间,我们在容器中创建了 /var/jenkins_home/downloads 的挂载卷。首先,我们将验证是否可以从容器中访问此路径。执行以下命令:
\n
··· $ docker exec -it myjenkins ls -l /var/jenkins_home/downloads total 0 ···
\n
如上所述返回0个结果时,那么我们就可以继续了。否则,你必须检查在启动容器期间是否输入正确。
\n
4.1 安装 JDK 11 我们将使用 Adopt OpenJDK 11,可在此处下载。我们必须将下载的 *.tar.gz 文件复制到已安装在主机上的卷 jenkins_home/downloads 中。为了检索我们机器上的路径,我们再次执行 docker inspect 命令,就像以前检索Jenkins IP地址一样。这一次,转到分段 Mounts:
\n\u
0026quot;Mounts
\u
0026quot;: [ ... {
\u
0026quot;Type
\u
0026quot;:
\u
0026quot;volume
\u
0026quot;,
\u
0026quot;Name
\u
0026quot;:
\u
0026quot;jenkins_downloads
\u
0026quot;,
\u
0026quot;Source
\u
0026quot;:
\u
0026quot;/var/lib/docker/volumes/jenkins_downloads/_data
\u
0026quot;,
\u
0026quot;Destination
\u
0026quot;:
\u
0026quot;/var/jenkins_home/downloads
\u
0026quot;, ... } ], 在我们的示例中,卷位于 /var/lib/docker/volumes/jenkins_downloads/_data 上。将 *.tar.gz 文件复制到此位置。
\n
跳转到 Manage Jenkins – Global Tool Configuration 和 *JDK 安装部分*。单击 Add JDK 按钮。默认情况下,java.sun.com 会添加安装程序。我们不会使用这个,所以删除它并添加一个 Extract *.zip/*.tar.gzinstaller。根据下面的屏幕截图填写字段。二进制存档的路径是 file:/var/jenkins_home/downloads/OpenJDK11U-jdk_x64_linux_hotspot_11.0.1_13.tar.gz。Label 留空是很重要的;否则,JDK的安装将失败。
\n
跳转到 *Manage Jenkins – Configure System*,到 Global properties 部分并启用 *环境变量*。为其添加环境变量 JAVA_HOME 并填充路径 /var/jenkins_home/tools/hudson.model.JDK/JDK11/jdk-11.0.1+13。
\n
4.2 安装 Maven 我们将使用 Maven 3.6.0,可以在这里下载。安装过程与 JDK 安装相同:下载 *.tar.gz 文件并将其复制到 jenkins_home/downloads。
\n
转到 Manage Jenkins – Global Tool Configuration 和 Maven 安装部分。单击 Add Maven 按钮。默认情况下,Apache 会添加安装程序。我们不会使用这个,所以删除它并添加一个 Extract *.zip/*.tar.gzinstaller。根据下面的屏幕截图填写字段。二进制存档的路径是 file:/var/jenkins_home/downloads/apache-maven-3.6.0-bin.tar.gz。Label 留空是很重要的;否则,Maven 的安装将失败。将子目录设置为 apache-maven-3.6.0 也很重要;否则,Maven 主目录没有正确设置,mvn 可执行文件将无法找到。
\n
4.3 配置 Docker 在 Docker 内部安装 Docker 不是一个好主意,请参阅本文。因此,我们将使用宿主机的 Docker 安装,并将宿主机的 Docker 套接字挂载到容器。实际上,这也不是一个好主意,但是对于我们的 Jenkins 实验环境来说,这是可以的,但是出于安全原因,永远不要以这种方式暴露 Docker 套接字。
\n
我们删除现有的容器(这不是有害的,因为我们的所有数据都保存在我们的主机上,我们不会丢失任何数据),然后使用 -v /var/run/docker.sock:/var/run/docker.sock 重新启动容器。
\n
$ docker rm myjenkins $ docker run -p 8080:8080 --name myjenkins -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home -v jenkins_downloads:/var/jenkins_home/downloads jenkins/jenkins:lts 为了使其工作,我们还必须设置 docker.sock 的权限给 jenkins 用户。默认情况下,它被挂载为 root,因此,由于 Permission Denied 错误,我们的构建将失败。
\n
以 root 身份登录 Docker 容器:
\n
$ docker exec -it -u root myjenkins 检查权限 docker.sock,这表明它拥有者 root:
\n
$ ls -l /var/run/docker.sock srw-rw---- 1 root 999 0 Jan 6 11:45 /var/run/docker.sock 让 jenkins 成为新所有者,并再次列出权限:
\n
$ chown jenkins: /var/run/docker.sock $ ls -l /var/run/docker.sock srw-rw---- 1 jenkins jenkins 0 Jan 6 11:45 /var/run/docker.sock 现在,jenkins 是所有者,我们不会再得到 Permission Denied 的错误。
\n
为了将 Docker 镜像推入 Docker registry,我们需要通过 settings.xml 将凭据提供给 Maven。我们可以通过配置文件提供程序插件轻松地提供 settings.xml。去 Manage Jenkins – Manage plugins 并安装插件(不重启安装)。
\n
转到 *Manage Jenkins – Managed files*,然后单击 *Add a new Config*。创建 Global Maven settings.xml 并使用 DockerHub 帐户凭据添加以下部分:
\n\u
0026lt;servers
\u
0026gt;
\u
0026lt;server
\u
0026gt;
\u
0026lt;id
\u
0026gt;docker.io
\u
0026lt;/id
\u
0026gt;
\u
0026lt;username
\u
0026gt;docker_username
\u
0026lt;/username
\u
0026gt;
\u
0026lt;password
\u
0026gt;docker_password
\u
0026lt;/password
\u
0026gt;
\u
0026lt;/server
\u
0026gt;
\u
0026lt;/servers
\u
0026gt; 5.创建构建工作 最后要做的是创建我们的构建工作。转到 Jenkins CI 主页,然后单击 *New Item*。我们将把构建工作命名为 *MyKubernetesPlanet*,并选择一个 *Freestyle Project*。
\n
在构建工作的配置部分,我们转到 Source Code Management 部分,并填写 Git URL https://github.com/mydeveloperplanet/mykubernetesplanet.git 和 branch */feature/jenkinsci。
\n
在 Build 部分,我们添加了一个 Invoke top-level Maven targets 的构建步骤。我们将调用以下 Maven 目标来构建我们的应用程序并将 Docker 镜像推送到 Docker registry:
\n
$ clean install dockerfile:push 我们还需要设置之前创建的 Maven版本 和 *全局配置文件*。
\n
手动为我们的工作启动构建,这将创建 jar 文件,创建我们的 Docker 镜像,并将其推送到 Docker registry。
\n
6.结论 在本文中,我们提供了一种让 Jenkins 实例运行的快速方法,包括执行 Maven 构建、创建 Docker 镜像并将其推入 Docker registry 的构建作业。请注意,这不是一种安全的方法,但是对于实验用例来说,它并没有太大的危害。现在我们已经有了一个完全运行的 Jenkins 实例,我们可以使用它来测试新的 Jenkins 插件。
\n
"
,
...
@@ -110,7 +110,7 @@
...
@@ -110,7 +110,7 @@
"date"
:
"2019-05-24 00:00:00 +0000 UTC"
,
"date"
:
"2019-05-24 00:00:00 +0000 UTC"
,
"tags"
:
[
"jenkins-x"
,
"k8s"
,
"kubernetes"
,
"ci"
,
"cd"
,
"spring boot"
],
"tags"
:
[
"jenkins-x"
,
"k8s"
,
"kubernetes"
,
"ci"
,
"cd"
,
"spring boot"
],
"description"
:
"通过使用 Jenkins X 和 Kubernetes 来改进 Spring Boot 应用程序,使 Jenkins X 成为 CI/CD 过程的关键部分。"
,
"description"
:
"通过使用 Jenkins X 和 Kubernetes 来改进 Spring Boot 应用程序,使 Jenkins X 成为 CI/CD 过程的关键部分。"
,
"content"
:
" 过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
\n
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
\u
0026mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
\n
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
\n
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
\n
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
\n
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
\n
在 Google Cloud 上安装 Jenkins X 并创建群集 浏览到cloud.google.com并登录。如果你还没有帐户,请注册免费试用。转到控制台(右上角有一个链接)并激活 Google Cloud shell。将以下命令复制并粘贴到 shell 中。
\n
curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.79/jx-linux-amd64.tar.gz | tar xzv sudo mv jx /usr/local/bin 注意:Google Cloud Shell 将在一小时后终止在你的主目录之外所做的任何更改,因此你可能必须重新运行这些命令。好消息是它们将在你的历史中,所以你只需要向上箭头并进入。你也可以删除上面的 sudo mv 命令,并将以下内容添加到 .bashrc 中。
\n
export PATH=$PATH:. 使用以下命令在 GKE(Google Kubernetes Engine)上创建集群。你可能必须为你的帐户启用 GKE。
\n
jx create cluster gke --skip-login 如果系统提示你下载 helm,请确认你要安装。系统将提示你选择 Google Cloud Zone。我建议选择一个靠近你的位置。我选择 us-west1-a,因为我住在 Denver, Colorado 附近。对于 Google Cloud Machine 类型,我选择了 n1-standard-2 并使用了 min(3)和 max(5)个节点数的默认值。
\n
对于 GitHub 名称,键入你自己的(例如 mraible)和你在 GitHub 上注册的电子邮件(例如 matt.raible@okta.com)。我试图使用 oktadeveloper(一个 GitHub 组织),但我无法使其工作。
\n
注意:如果你的帐户启用了两步认证,则 GitHub 集成将失败。如果你希望成功完成该过程,则需要在 GitHub 上禁用它。
\n
当提示安装 ingress controller 时,按 Enter 键 确定。再次按 Enter 键选择默认 domain。
\n
系统将提示你创建 GitHub API Token。单击 提供的 URL 并将其命名为 “Jenkins X”。将 token 值复制并粘贴回控制台。
\n
在安装完成后喝杯咖啡、饮料或做一些俯卧撑。可能需要几分钟。
\n
下一步是将 API token 从 Jenkins 复制到你的控制台。按照控制台中提供的说明进行操作。
\n
完成后,运行 jx console 并单击链接以登录到 Jenkins 实例。单击 Administration 并升级 Jenkins 及其所有插件(插件管理器
\u
0026gt; 滚动到底部并选择全部)。如果未能执行此步骤,将无法从 GitHub pull request 到 Jenkins X CI 进程。
\n
创建一个 Spring Boot 应用程序 当我第一次开始使用 Jenkins X 时,我尝试导入现有项目。即使我的应用程序使用了 Spring Boot,但是根目录中没有 pom.xml,所以 Jenkins X 认为它是一个 Node.js 应用程序。出于这个原因,我建议首先创建一个空白的 Spring Boot 应用程序,以保证 Jenkins X 正确创建。
\n
从 Cloud Shell 创建一个简单的 Spring Boot 应用程序:
\n
jx create spring -d web -d actuator 此命令使用 Spring Initializr,因此系统会提示你进行一些选择。以下是我的选择:
\n
QUESTION ANSWER Language java Group com.okta.developer Artifact okta-spring-jx-example 提示:为你的 artifact name 选取一个简洁的名称将减轻你的痛苦。Jenkins X 对于版本名称有53个字符的限制,oktadeveloper/okta-spring-boot-jenkinsx-example 将会使它超过两个字符。
\n
为 git 用户名、初始化 git 和提交消息都选择默认值。如果你不想使用个人帐户,可以选择要使用的组织。运行以下命令以查看应用程序的 CI/CD 流水线。
\n
jx get activity -f okta-spring-jx-example -w 运行 jx console,单击生成的链接,然后导航到你的项目(如果你想要一个更富视觉效果的视图)。
\n
此过程将执行一些任务:
\n
为你的项目创建一个版本。 为演示环境项目创建 pull request。 将其自动部署到演示环境,以便你可以查看它的运行情况。 Merge status checks all passed so the promotion worked! Application is available at: http://okta-spring-jx-example.jx-staging.35.230.106.169.nip.io 注意:由于 Spring Boot 默认情况下不提供欢迎页面,所以打开上面的 URL 时将返回404。
\n
使用 Jenkins X 将 Spring Boot 应用程序部署到生产环境中 默认情况下,Jenkins X 只会自动部署到演示环境。你可以手动改进从演示到生产使用:
\n
jx promote okta-spring-jx-example --version 0.0.1 --env production 你可以使用 jx edit environment 更改生产环境,以使用自动部署。
\n
既然你已经知道如何使用 Jenkins X 和一个简单的 Spring Boot 应用程序,让我们来看看如何通过一个更实际的示例使其工作。
\n
保护你的 Spring Boot 应用程序并添加 Angular PWA 在过去的几个月里,我写了一系列有关使用 Ionic/Angular 和 Spring Boot 构建 PWA(渐进式 Web 应用程序)的博文。
\n
使用 Okta 保护你的加密货币财富跟踪 PWA 使用 Okta(而不是本地存储)安全地存储用户的数据 使用 WireMock、Jest、Protractor 和 Travis CI 测试 Spring Boot API 和 Angular 组件的 Hitchhiker 指南 将你的 Spring Boot + Angular PWA 部署为一个 Artifact 这是该系列的最后一篇博客文章。我相信这是一个真实应用程序的很好的例子,因为它有许多单元和集成测试,包括与 Protractor 的端到端测试。让我们看看如何使用 Jenkins X 和 Kubernetes 自动化生产路径! 克隆刚刚从GitHub创建的Spring Boot项目(确保在URL中更改{yourUsername}):
\n
git clone https://github.com/{yourUsername}/okta-spring-jx-example.git okta-jenkinsx 在邻近目录中,将创建的具有 Spring Boot + Angular 的项目克隆为一个 artifact:
\n
git clone https://github.com/oktadeveloper/okta-spring-boot-angular-auth-code-flow-example.git spring-boot-angular 在终端中,导航到 okta-jenkinsx 并删除不再需要的文件:
\n
cd okta-jenkinsx rm -rf .mvn src mvnw* pom.xml 结果应该是包含以下文件的目录结构:
\n
$ tree . . ├── charts │ ├── okta-spring-jx-example │ │ ├── Chart.yaml │ │ ├── Makefile │ │ ├── README.md │ │ ├── templates │ │ │ ├── deployment.yaml │ │ │ ├── _helpers.tpl │ │ │ ├── NOTES.txt │ │ │ └── service.yaml │ │ └── values.yaml │ └── preview │ ├── Chart.yaml │ ├── Makefile │ ├── requirements.yaml │ └── values.yaml ├── Dockerfile ├── Jenkinsfile └── skaffold.yaml 4 directories, 15 files 将 spring-boot-angular 所有文件复制到 okta-jenkinsx。
\n
cp -r ../spring-boot-angular/* . 使用 Travis CI 测试此应用程序时,我运行了 npm install 作为该过程的一部分。使用 Jenkins X,使用一个容器(例如 maven 或者 nodejs)保存所有内容更简单,因此在 frontend-maven-plugin(在 holdings-api/pom.xml)中添加执行以运行 npm install (提示:你将需要执行 id==’npm install' 添加到现有的pom.xml中)。
\n
现在是 okta-jenkinsx 在 IntelliJ IDEA、Eclipse、Netbeans 或 VS Code 等 IDE 中作为项目打开目录的好时机!
\n\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;com.github.eirslett
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;frontend-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;version
\u
0026gt;${frontend-maven-plugin.version}
\u
0026lt;/version
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;workingDirectory
\u
0026gt;../crypto-pwa
\u
0026lt;/workingDirectory
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;install node and npm
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;install-node-and-npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;nodeVersion
\u
0026gt;${node.version}
\u
0026lt;/nodeVersion
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;npm install
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;phase
\u
0026gt;generate-resources
\u
0026lt;/phase
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;install --unsafe-perm
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt; ...
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt; 注意:--unsafe-perm 标志是必要的,因为 Jenkins X 以 root 用户身份运行构建。我从 node-sass 的故障排除说明中找到了这个解决方案。
\n
增加 Actuator 并关闭 HTTPS Jenkins X 依靠 Spring Boot 的 Actuator 进行健康检查。这意味着如果你不将其包含在你的项目中(或有 /actuator/health 防护),Jenkins X 会报告你的应用程序启动失败。
\n
将 Actuator starter 作为依赖项添加到 holdings-api/pom.xml 中:
\n\u
0026lt;dependency
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;org.springframework.boot
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;spring-boot-starter-actuator
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;/dependency
\u
0026gt; 你还需要允许访问其运行健康检查。Jenkins X 将部署你的应用程序在一个 NGINX 服务器中,因此你也需要强制关闭 HTTPS,否则你将无法访问你的应用程序。修改 holdings-api/src/main/java/.../SecurityConfiguration.java 以允许 holdings-api/src/main/java/.../SecurityConfiguration.java 和删除 requiresSecure()。
\n
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(
\u
0026quot;/**/*.{js,html,css}
\u
0026quot;); } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() .authorizeRequests() .antMatchers(
\u
0026quot;/
\u
0026quot;,
\u
0026quot;/home
\u
0026quot;,
\u
0026quot;/api/user
\u
0026quot;,
\u
0026quot;/actuator/health
\u
0026quot;).permitAll() .anyRequest().authenticated(); } } 调整 Dockerfile 和 Jenkinsfile 中的路径 由于此项目构建在子目录而不是根目录中,因此请更新 ./Dockerfile 以查找 holdings-api 文件。
\n
FROM openjdk:8-jdk-slim ENV PORT 8080 ENV CLASSPATH /opt/lib EXPOSE 8080 # copy pom.xml and wildcards to avoid this command failing if there's no target/lib directory COPY holdings-api/pom.xml holdings-api/target/lib* /opt/lib/ # NOTE we assume there's only 1 jar in the target dir # but at least this means we don't have to guess the name # we could do with a better way to know the name - or to always create an app.jar or something COPY holdings-api/target/*.jar /opt/app.jar WORKDIR /opt CMD [
\u
0026quot;java
\u
0026quot;,
\u
0026quot;-jar
\u
0026quot;,
\u
0026quot;app.jar
\u
0026quot;] 你还需要更新 Jenkinsfile,以便它可以运行 holdings-api 目录中的任何 mvn 命令。也添加 -Pprod 配置文件。例如:
\n
// in the 'CI Build and push snapshot' stage steps { container('maven') { dir ('./holdings-api') { sh
\u
0026quot;mvn versions:set -DnewVersion=$PREVIEW_VERSION
\u
0026quot; sh
\u
0026quot;mvn install -Pprod
\u
0026quot; } } ... } // in the 'Build Release' stage dir ('./holdings-api') { sh
\u
0026quot;mvn versions:set -DnewVersion=
\\
$(cat ../VERSION)
\u
0026quot; } ... dir ('./holdings-api') { sh
\u
0026quot;mvn clean deploy -Pprod
\u
0026quot; } 这应该足以让这个应用程序与 Jenkins X 一起使用。但是,除非你有一个 Okta 帐户并相应地配置它,否则你将无法登录它。
\n
为什么使用Okta? 简而言之,我们使标识管理比你可能习惯的更简洁、更安全、更具可扩展性。Okta 是一种云服务,允许开发人员创建、编辑和安全存储用户帐户和用户帐户数据,并将其与一个或多个应用程序相连接。我们的 API 使你能够:
\n
对用户进行身份验证和授权 存储关于用户的数据 执行基于密码和社交登录 使用多重身份验证保护应用程序 了解更多!查看我们的产品文档 你心动了吗?注册一个永远免费的开发者帐户,当你完成后,请返回,以便我们可以通过 Spring Boot 和 Jenkins X 了解有关 CI/CD 的更多信息! 在 Okta 中为 Spring Boot 应用程序创建一个 Web 应用程序 完成设置过程后,登录到你的帐户并导航到 Applications
\u
0026gt; Add Application。单击 Web 和 下一步。在下一页中,输入以下值并单击 Done (必须单击 Done,然后编辑以修改注销重定向 URI)。
\n
应用名称: Jenkins X 默认 URI: http://localhost:8080 登录重定向 URI: http://localhost:8080/login 注销重定向 URI: http://localhost:8080 打开 holdings-api/src/main/resources/application.yml 并将你 org/app 中的值粘贴到其中。 okta: client: orgUrl: https://okta.okta.com token: XXX security: oauth2: client: access-token-uri: https://okta.okta.com/oauth2/default/v1/token user-authorization-uri: https://okta.okta.com/oauth2/default/v1/authorize client-id: {clientId} client-secret: {clientSecret} resource: user-info-uri: https://okta.okta.com/oauth2/default/v1/userinfo 你将注意到 token 值是 xxx。这是因为我更喜欢从环境变量中读取它,而不是签入源代码控制。你可能也想为你的客户密钥执行此操作,但我只是为了简洁而做一个属性。要创建 API token:
\n
导航到 API
\u
0026gt; Tokens ,然后单击 Create Token 为令牌命名(例如 “Jenkins X”),然后将其值设置为 OKTA_CLIENT_TOKEN 环境变量。 你需要在组织的用户配置文件中添加一个 holdings 属性,以便将你的加密货币存储在 Okta 中。导航到 Users
\u
0026gt; Profile Editor。点击 Profile 表格中的第一个配置文件。你可以通过其 Okta 标识来识别它。单击 Add Attribute 并使用以下值: 显示名称: Holdings 变量名: holdings 描述: Cryptocurrency Holdings 执行这些步骤后,你应该能够导航到 http://localhost:8080, 并在运行以下命令后登录: cd holdings-api ./mvnw -Pprod package java -jar target/*.jar 在 Jenkins X 中存储 Secrets 在本地存储环境变量非常简单。但是你如何在 Jenkins X 中做到这一点?看看它的凭证功能就知道了。下面是使用方法:
\n
在 Google Cloud Shell 上运行 jx console,以获取 Jenkins X 网址 单击该链接,登录,然后单击顶部的 Administration 单击 Credentials
\u
0026gt; (global)
\u
0026gt; Add Credentials(在左侧) 从下拉列表中选择 Secret text,并为 ID 输入 OKTA_CLIENT_TOKEN 将 Okta API token 复制/粘贴到 Secret 字段中 当你在里面,添加 secrets:OKTA_APP_ID、E2E_USERNAME 和 E2E_PASSWORD。第一个是你创建的 Jenkins X OIDC 应用程序的 ID。您可以通过在 Okta 上导航到您的应用程序并从 URL 复制值来获得它的值。该 E2E-* 密钥应该是要用来运行终端到终端(Protractor)测试的凭证。你可能想为此创建一个新用户。 你可以通过将这些值添加到 environment 顶部附近的部分来访问 Jenkinsfile 中的这些值 。
\n
environment { ORG = 'mraible' APP_NAME = 'okta-spring-jx-example' CHARTMUSEUM_CREDS = credentials('jenkins-x-chartmuseum') OKTA_CLIENT_TOKEN = credentials('OKTA_CLIENT_TOKEN') OKTA_APP_ID = credentials('OKTA_APP_ID') E2E_USERNAME = credentials('E2E_USERNAME') E2E_PASSWORD = credentials('E2E_PASSWORD') } 将环境变量转移到 Docker 容器 要将 OKTA_CLIENT_TOKEN 环境变量转移到 Docker 容器,请查看:
\n
sh
\u
0026quot;make preview
\u
0026quot; 并将其更改为:
\n
sh
\u
0026quot;make OKTA_CLIENT_TOKEN=
\\
$OKTA_CLIENT_TOKEN preview
\u
0026quot; 此时,你可以创建分支,提交更改,并验证 Jenkins X 中的所有内容是否正常工作。
\n
cd .. git checkout -b add-secure-app git add . git commit -m
\u
0026quot;Add Bootiful PWA
\u
0026quot; git push origin add-secure-app 打开浏览器并导航到 GitHub 上的存储库并创建 pull request。创建后它应该如下所示。
\n
如果你的 pull request 测试通过,你应该能看到一些绿色标记和 Jenkins X 的评论,说明你的应用程序在预览环境中可用。
\n
如果你单击此处链接并尝试登录,则可能会从 Okta 得到一个错误,指出重定向 URI 尚未列入白名单。
\n
在 Okta 中自动添加重定向 URI 当你在 Okta 中创建应用程序并在本地运行它们时,很容易知道应用程序的重定向 URI 将是什么。对于这个特定的应用程序,它们将 http://localhost:8080/login 用于登录,http://localhost:8080 用于注销。当您进入生产环境时,URL通常也是众所周知的。但是,使用 Jenkins X,URL 是动态的,并根据你的 pull request 编号动态创建的。
\n
要使用 Okta 进行此操作,你可以创建一个 Java 类,该类与 Okta API 进行交互。创建 holdings-api/src/test/java/.../cli/AppRedirectUriManager.java 并使用以下代码完善它。
\n
package com.okta.developer.cli; import com.okta.sdk.client.Client; import com.okta.sdk.lang.Collections; import com.okta.sdk.resource.application.OpenIdConnectApplication; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @SpringBootApplication public class AppRedirectUriManager implements ApplicationRunner { private static final Logger log = LoggerFactory.getLogger(AppRedirectUriManager.class); private final Client client; @Value(
\u
0026quot;${appId}
\u
0026quot;) private String appId; @Value(
\u
0026quot;${redirectUri}
\u
0026quot;) private String redirectUri; @Value(
\u
0026quot;${operation:add}
\u
0026quot;) private String operation; public AppRedirectUriManager(Client client) { this.client = client; } public static void main(String[] args) { SpringApplication.run(AppRedirectUriManager.class, args); } @Override public void run(ApplicationArguments args) { log.info(
\u
0026quot;Adjusting Okta settings: {appId: {}, redirectUri: {}, operation: {}}
\u
0026quot;, appId, redirectUri, operation); OpenIdConnectApplication app = (OpenIdConnectApplication) client.getApplication(appId); String loginRedirectUri = redirectUri +
\u
0026quot;/login
\u
0026quot;; // update redirect URIs List
\u
0026lt;String
\u
0026gt; redirectUris = app.getSettings().getOAuthClient().getRedirectUris(); // use a set so values are unique Set
\u
0026lt;String
\u
0026gt; updatedRedirectUris = new LinkedHashSet
\u
0026lt;
\u
0026gt;(redirectUris); if (operation.equalsIgnoreCase(
\u
0026quot;add
\u
0026quot;)) { updatedRedirectUris.add(loginRedirectUri); } else if (operation.equalsIgnoreCase(
\u
0026quot;remove
\u
0026quot;)) { updatedRedirectUris.remove(loginRedirectUri); } // todo: update logout redirect URIs with redirectUri (not currently available in Java SDK) app.getSettings().getOAuthClient().setRedirectUris(Collections.toList(updatedRedirectUris)); app.update(); System.exit(0); } } 该类使用 Spring Boot 的 CLI(命令行接口)支持,这使得可以使用 Exec Maven 插件调用它。要添加对 Maven 运行它的支持,请在 holdings-api/pom.xml 进行以下修改 。
\n\u
0026lt;properties
\u
0026gt; ...
\u
0026lt;exec-maven-plugin.version
\u
0026gt;1.6.0
\u
0026lt;/exec-maven-plugin.version
\u
0026gt;
\u
0026lt;appId
\u
0026gt;default
\u
0026lt;/appId
\u
0026gt;
\u
0026lt;redirectUri
\u
0026gt;override-me
\u
0026lt;/redirectUri
\u
0026gt;
\u
0026lt;/properties
\u
0026gt;
\u
0026lt;!-- dependencies --
\u
0026gt;
\u
0026lt;build
\u
0026gt;
\u
0026lt;defaultGoal
\u
0026gt;spring-boot:run
\u
0026lt;/defaultGoal
\u
0026gt;
\u
0026lt;finalName
\u
0026gt;holdings-app-${project.version}
\u
0026lt;/finalName
\u
0026gt;
\u
0026lt;plugins
\u
0026gt;
\u
0026lt;!-- existing plugins --
\u
0026gt;
\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;org.codehaus.mojo
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;exec-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;version
\u
0026gt;${exec-maven-plugin.version}
\u
0026lt;/version
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;add-redirect
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;java
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;mainClass
\u
0026gt;com.okta.developer.cli.AppRedirectUriManager
\u
0026lt;/mainClass
\u
0026gt;
\u
0026lt;classpathScope
\u
0026gt;test
\u
0026lt;/classpathScope
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;
\u
0026lt;argument
\u
0026gt;appId ${appId} redirectUri ${redirectUri}
\u
0026lt;/argument
\u
0026gt;
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt;
\u
0026lt;/plugins
\u
0026gt;
\u
0026lt;/build
\u
0026gt; 然后更新 Jenkinsfile 以在构建镜像之后添加一段 mvn exec:java 供运行。
\n
dir ('./charts/preview') { container('maven') { sh
\u
0026quot;make preview
\u
0026quot; sh
\u
0026quot;make OKTA_CLIENT_TOKEN=
\\
$OKTA_CLIENT_TOKEN preview
\u
0026quot; sh
\u
0026quot;jx preview --app $APP_NAME --dir ../..
\u
0026quot; } } // Add redirect URI in Okta dir ('./holdings-api') { container('maven') { sh ''' yum install -y jq previewURL=$(jx get preview -o json|jq -r
\u
0026quot;.items[].spec | select (.previewGitInfo.name==
\\\\\u
0026quot;$CHANGE_ID
\\\\\u
0026quot;) | .previewGitInfo.applicationURL
\u
0026quot;) mvn exec:java@add-redirect -DappId=$OKTA_APP_ID -DredirectUri=$previewURL ''' } } 提交并推送你的更改,应用程序应该更新为 http://{yourPreviewURL}/login 的重定向 URI。你需要手动为 http://{yourPreviewURL} 添加一个注销重定向 URI, 因为 Okta 的 Java SDK 目前不支持此功能。
\n
要将你的 pull request 上传到演示环境,请将其合并,并将主分支推送到演示环境。不幸的是,你将无法登录。这是因为没有进程使用你的 Okta 应用程序注册登台站点的重定向 URI。如果手动添加 URI,一切都应该有效。
\n
在 Jenkins X 中运行 Protractor 测试 对我来说,弄清楚如何在 Jenkins X 中运行端到端测试是最难的。我首先添加了一个新的 Maven 配置文件,它允许我使用 Maven 而不是 npm 运行测试。
\n
注意:要使此配置文件起作用,你需要将 http://localhost:8000/login 登录重定向 URI 添加到你的应用程序,并将 http://localhost:8000 作为注销重定向URI。
\n\u
0026lt;profile
\u
0026gt;
\u
0026lt;id
\u
0026gt;e2e
\u
0026lt;/id
\u
0026gt;
\u
0026lt;properties
\u
0026gt;
\u
0026lt;!-- Hard-code port instead of using build-helper-maven-plugin. --
\u
0026gt;
\u
0026lt;!-- This way, you don't need to add a redirectUri to Okta app. --
\u
0026gt;
\u
0026lt;http.port
\u
0026gt;8000
\u
0026lt;/http.port
\u
0026gt;
\u
0026lt;/properties
\u
0026gt;
\u
0026lt;build
\u
0026gt;
\u
0026lt;plugins
\u
0026gt;
\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;org.springframework.boot
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;spring-boot-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;pre-integration-test
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;start
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;
\u
0026lt;argument
\u
0026gt;--server.port=${http.port}
\u
0026lt;/argument
\u
0026gt;
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;post-integration-test
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;stop
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt;
\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;com.github.eirslett
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;frontend-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;version
\u
0026gt;${frontend-maven-plugin.version}
\u
0026lt;/version
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;workingDirectory
\u
0026gt;../crypto-pwa
\u
0026lt;/workingDirectory
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;webdriver update
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;phase
\u
0026gt;pre-integration-test
\u
0026lt;/phase
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;run e2e-update
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;ionic e2e
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;phase
\u
0026gt;integration-test
\u
0026lt;/phase
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;environmentVariables
\u
0026gt;
\u
0026lt;PORT
\u
0026gt;${http.port}
\u
0026lt;/PORT
\u
0026gt;
\u
0026lt;CI
\u
0026gt;true
\u
0026lt;/CI
\u
0026gt;
\u
0026lt;/environmentVariables
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;run e2e-test
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt;
\u
0026lt;/plugins
\u
0026gt;
\u
0026lt;/build
\u
0026gt;
\u
0026lt;/profile
\u
0026gt; 提示:你可能会注意到,我必须为 e2e-update 和 e2e-test 分两次不同的执行。我发现运行 npm e2e 与 frontend-maven-plugin 不兼容,因为它只调用其他 npm run 命令。看来你需要在使用 frontend-maven-plugin 时直接调用二进制文件。
\n
这里使用的不是 TRAVIS 环境变量,而是 CI 变量。此更改需要更新 crypto-pwa/test/protractor.conf.js 来匹配。
\n
baseUrl: (process.env.CI) ? 'http://localhost:' + process.env.PORT : 'http://localhost:8100', 进行这些更改,你应该能够运行 ./mvnw verify -Pprod,e2e 以在本地运行端到端测试。请注意,你需要将 E2E_USERNAME 和 E2E_PASSWORD 定义为环境变量。
\n
当我第一次在 Jenkins X 中尝试这个功能时,我发现 jenkins-maven 代理没有安装 Chrome。我发现很难安装并发现 jenkins-nodejs 预安装了 Chrome 和 Xvfb。当我第一次尝试它时,我遇到以下错误:
\n
[21:51:08] E/launcher - unknown error: DevToolsActivePort file doesn't exist 此错误是由 Chrome on Linux 问题引起的 。我发现解决办法是在 Protractor 的 chromeOptions 中指定 -disable-dev-shm-usage。我还添加了一些推荐的额外标志。我特别喜欢 --headless,在本地运行时,因此浏览器不会弹出并妨碍我。如果我想实时看到这个过程,我可以快速删除该选项。
\n
如果你希望在 Jenkins X 上看到项目的 Protractor 测试运行,则需要修改 crypto-pwa/test/protractor.conf.js 以指定以下内容 chromeOptions:
\n
capabilities: { 'browserName': 'chrome', 'chromeOptions': { 'args': ['--headless', ''--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage'] } }, 然后向 Jenkinsfile 添加一个新的 Run e2e tests 阶段,该阶段位于 “CI 构建”和“构建发布”阶段之间。如果有帮助,你可以看到最终的 Jenkins 文件。
\n
stage('Run e2e tests') { agent { label
\u
0026quot;jenkins-nodejs
\u
0026quot; } steps { container('nodejs') { sh ''' yum install -y jq previewURL=$(jx get preview -o json|jq -r
\u
0026quot;.items[].spec | select (.previewGitInfo.name==
\\\\\u
0026quot;$CHANGE_ID
\\\\\u
0026quot;) | .previewGitInfo.applicationURL
\u
0026quot;) cd crypto-pwa
\u
0026amp;
\u
0026amp; npm install --unsafe-perm
\u
0026amp;
\u
0026amp; npm run e2e-update Xvfb :99
\u
0026amp; sleep 60s DISPLAY=:99 npm run e2e-test -- --baseUrl=$previewURL ''' } } } 完成所有这些更改后,创建一个新分支,签入你的更改,并在 GitHub 上创建一个 pull request。
\n
git checkout -b enable-e2e-tests git add . git commit -m
\u
0026quot;Add stage for end-to-end tests
\u
0026quot; git push origin enable-e2e-tests 我确实需要做一些额外的调整才能通过所有的 Protractor 测试:
\n
在 crypto-pwa/e2e/spec/login.e2e-spec.ts 中,我无法通过 should show a login button 测试,所以我忽略了它,将 it(…) 改为 xit(…)。 在同一个文件中,我将2000 ms 超时更改为5000 ms,将5000 ms 超时更改为30000 ms。 在 crypto-pwa/test/protractor.conf.js 中,我将 defaultTimeoutInterval 更改为 600000。 第一次运行时测试可能会失败,因为未为新预览环境配置注销重定向URI。更新 Okta 应用程序的注销重定向 URI 以匹配你的 PR 的预览环境 URI,重新 pull request 测试,一切都应该通过! 你可以在 GitHub 上的此示例中找到已完成应用程序的源代码 。
\n
了解有关 Jenkins X、Kubernetes 和 Spring Boot 的更多信息 要了解有关 Spring Boot、Jenkins X 和 Kubernetes 的更多信息,请查看以下资源:
\n
Deploy Your Secure Spring Boot + Angular PWA as a Single Artifact Build a Basic CRUD App with Angular 5.0 and Spring Boot 2.0 Introducing Jenkins X: a CI/CD solution for modern cloud applications on Kubernetes Kubernetes The Hard Way by Kelsey Hightower 如果你在 Kubernetes 上运行生产应用程序,我建议你研究 Jenkins X.它提供了一种在相同环境中进行 CI/CD 的方法,快速迭代并为你的客户更快地交付业务价值。 Jenkins X 还包括一个 DevPods 功能,可以在笔记本电脑上进行开发时,可以自动部署保存。我不确定 DevPods 是否适用于需要具有生产转换步骤的 JavaScript 应用程序。我宁愿让 webpack 和 Browsersync 在几秒钟内刷新我的本地浏览器,而不是等待几分钟创建并部署 Docker 镜像到 Kubernetes。
\n
要获得 Jenkins X 的精彩概述和演示,请观看 James Strachan 在2018年6月的 Virtual JUG 会议上为 Kubernetes 发布的 Jenkins X: Continuous Delivery。
\n
如果你有任何疑问,请在下面添加评论,在 Twitter 上发帖,或在我们的开发者论坛 上发帖提问。要获得有关未来博客文章和开发人员智慧的通知,你可以在Twitter上关注我的整个团队。
\n
使用 Jenkins X 和 Kubernetes 将 CI/CD 添加到 Spring Boot 应用程序中,最初于2018年7月11日发布到 Okta 开发人员博客。
\n
"
,
"content"
:
" 过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
\n
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
\u
0026mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
\n
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
\n
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
\n
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
\n
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
\n
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
\n
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
\n
在 Google Cloud 上安装 Jenkins X 并创建群集 浏览到cloud.google.com并登录。如果你还没有帐户,请注册免费试用。转到控制台(右上角有一个链接)并激活 Google Cloud shell。将以下命令复制并粘贴到 shell 中。
\n
curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.79/jx-linux-amd64.tar.gz | tar xzv sudo mv jx /usr/local/bin 注意:Google Cloud Shell 将在一小时后终止在你的主目录之外所做的任何更改,因此你可能必须重新运行这些命令。好消息是它们将在你的历史中,所以你只需要向上箭头并进入。你也可以删除上面的 sudo mv 命令,并将以下内容添加到 .bashrc 中。
\n
export PATH=$PATH:. 使用以下命令在 GKE(Google Kubernetes Engine)上创建集群。你可能必须为你的帐户启用 GKE。
\n
jx create cluster gke --skip-login 如果系统提示你下载 helm,请确认你要安装。系统将提示你选择 Google Cloud Zone。我建议选择一个靠近你的位置。我选择 us-west1-a,因为我住在 Denver, Colorado 附近。对于 Google Cloud Machine 类型,我选择了 n1-standard-2 并使用了 min(3)和 max(5)个节点数的默认值。
\n
对于 GitHub 名称,键入你自己的(例如 mraible)和你在 GitHub 上注册的电子邮件(例如 matt.raible@okta.com)。我试图使用 oktadeveloper(一个 GitHub 组织),但我无法使其工作。
\n
注意:如果你的帐户启用了两步认证,则 GitHub 集成将失败。如果你希望成功完成该过程,则需要在 GitHub 上禁用它。
\n
当提示安装 ingress controller 时,按 Enter 键 确定。再次按 Enter 键选择默认 domain。
\n
系统将提示你创建 GitHub API Token。单击 提供的 URL 并将其命名为 “Jenkins X”。将 token 值复制并粘贴回控制台。
\n
在安装完成后喝杯咖啡、饮料或做一些俯卧撑。可能需要几分钟。
\n
下一步是将 API token 从 Jenkins 复制到你的控制台。按照控制台中提供的说明进行操作。
\n
完成后,运行 jx console 并单击链接以登录到 Jenkins 实例。单击 Administration 并升级 Jenkins 及其所有插件(插件管理器
\u
0026gt; 滚动到底部并选择全部)。如果未能执行此步骤,将无法从 GitHub pull request 到 Jenkins X CI 进程。
\n
创建一个 Spring Boot 应用程序 当我第一次开始使用 Jenkins X 时,我尝试导入现有项目。即使我的应用程序使用了 Spring Boot,但是根目录中没有 pom.xml,所以 Jenkins X 认为它是一个 Node.js 应用程序。出于这个原因,我建议首先创建一个空白的 Spring Boot 应用程序,以保证 Jenkins X 正确创建。
\n
从 Cloud Shell 创建一个简单的 Spring Boot 应用程序:
\n
jx create spring -d web -d actuator 此命令使用 Spring Initializr,因此系统会提示你进行一些选择。以下是我的选择:
\n
QUESTION ANSWER Language java Group com.okta.developer Artifact okta-spring-jx-example 提示:为你的 artifact name 选取一个简洁的名称将减轻你的痛苦。Jenkins X 对于版本名称有53个字符的限制,oktadeveloper/okta-spring-boot-jenkinsx-example 将会使它超过两个字符。
\n
为 git 用户名、初始化 git 和提交消息都选择默认值。如果你不想使用个人帐户,可以选择要使用的组织。运行以下命令以查看应用程序的 CI/CD 流水线。
\n
jx get activity -f okta-spring-jx-example -w 运行 jx console,单击生成的链接,然后导航到你的项目(如果你想要一个更富视觉效果的视图)。
\n
此过程将执行一些任务:
\n
为你的项目创建一个版本。 为演示环境项目创建 pull request。 将其自动部署到演示环境,以便你可以查看它的运行情况。 Merge status checks all passed so the promotion worked! Application is available at: http://okta-spring-jx-example.jx-staging.35.230.106.169.nip.io 注意:由于 Spring Boot 默认情况下不提供欢迎页面,所以打开上面的 URL 时将返回404。
\n
使用 Jenkins X 将 Spring Boot 应用程序部署到生产环境中 默认情况下,Jenkins X 只会自动部署到演示环境。你可以手动改进从演示到生产使用:
\n
jx promote okta-spring-jx-example --version 0.0.1 --env production 你可以使用 jx edit environment 更改生产环境,以使用自动部署。
\n
既然你已经知道如何使用 Jenkins X 和一个简单的 Spring Boot 应用程序,让我们来看看如何通过一个更实际的示例使其工作。
\n
保护你的 Spring Boot 应用程序并添加 Angular PWA 在过去的几个月里,我写了一系列有关使用 Ionic/Angular 和 Spring Boot 构建 PWA(渐进式 Web 应用程序)的博文。
\n
使用 Okta 保护你的加密货币财富跟踪 PWA 使用 Okta(而不是本地存储)安全地存储用户的数据 使用 WireMock、Jest、Protractor 和 Travis CI 测试 Spring Boot API 和 Angular 组件的 Hitchhiker 指南 将你的 Spring Boot + Angular PWA 部署为一个 Artifact 这是该系列的最后一篇博客文章。我相信这是一个真实应用程序的很好的例子,因为它有许多单元和集成测试,包括与 Protractor 的端到端测试。让我们看看如何使用 Jenkins X 和 Kubernetes 自动化生产路径! 克隆刚刚从GitHub创建的Spring Boot项目(确保在URL中更改{yourUsername}):
\n
git clone https://github.com/{yourUsername}/okta-spring-jx-example.git okta-jenkinsx 在邻近目录中,将创建的具有 Spring Boot + Angular 的项目克隆为一个 artifact:
\n
git clone https://github.com/oktadeveloper/okta-spring-boot-angular-auth-code-flow-example.git spring-boot-angular 在终端中,导航到 okta-jenkinsx 并删除不再需要的文件:
\n
cd okta-jenkinsx rm -rf .mvn src mvnw* pom.xml 结果应该是包含以下文件的目录结构:
\n
$ tree . . ├── charts │ ├── okta-spring-jx-example │ │ ├── Chart.yaml │ │ ├── Makefile │ │ ├── README.md │ │ ├── templates │ │ │ ├── deployment.yaml │ │ │ ├── _helpers.tpl │ │ │ ├── NOTES.txt │ │ │ └── service.yaml │ │ └── values.yaml │ └── preview │ ├── Chart.yaml │ ├── Makefile │ ├── requirements.yaml │ └── values.yaml ├── Dockerfile ├── Jenkinsfile └── skaffold.yaml 4 directories, 15 files 将 spring-boot-angular 所有文件复制到 okta-jenkinsx。
\n
cp -r ../spring-boot-angular/* . 使用 Travis CI 测试此应用程序时,我运行了 npm install 作为该过程的一部分。使用 Jenkins X,使用一个容器(例如 maven 或者 nodejs)保存所有内容更简单,因此在 frontend-maven-plugin(在 holdings-api/pom.xml)中添加执行以运行 npm install (提示:你将需要执行 id==’npm install' 添加到现有的pom.xml中)。
\n
现在是 okta-jenkinsx 在 IntelliJ IDEA、Eclipse、Netbeans 或 VS Code 等 IDE 中作为项目打开目录的好时机!
\n\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;com.github.eirslett
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;frontend-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;version
\u
0026gt;${frontend-maven-plugin.version}
\u
0026lt;/version
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;workingDirectory
\u
0026gt;../crypto-pwa
\u
0026lt;/workingDirectory
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;install node and npm
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;install-node-and-npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;nodeVersion
\u
0026gt;${node.version}
\u
0026lt;/nodeVersion
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;npm install
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;phase
\u
0026gt;generate-resources
\u
0026lt;/phase
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;install --unsafe-perm
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt; ...
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt; 注意:--unsafe-perm 标志是必要的,因为 Jenkins X 以 root 用户身份运行构建。我从 node-sass 的故障排除说明中找到了这个解决方案。
\n
增加 Actuator 并关闭 HTTPS Jenkins X 依靠 Spring Boot 的 Actuator 进行健康检查。这意味着如果你不将其包含在你的项目中(或有 /actuator/health 防护),Jenkins X 会报告你的应用程序启动失败。
\n
将 Actuator starter 作为依赖项添加到 holdings-api/pom.xml 中:
\n\u
0026lt;dependency
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;org.springframework.boot
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;spring-boot-starter-actuator
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;/dependency
\u
0026gt; 你还需要允许访问其运行健康检查。Jenkins X 将部署你的应用程序在一个 NGINX 服务器中,因此你也需要强制关闭 HTTPS,否则你将无法访问你的应用程序。修改 holdings-api/src/main/java/.../SecurityConfiguration.java 以允许 holdings-api/src/main/java/.../SecurityConfiguration.java 和删除 requiresSecure()。
\n
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(
\u
0026quot;/**/*.{js,html,css}
\u
0026quot;); } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() .authorizeRequests() .antMatchers(
\u
0026quot;/
\u
0026quot;,
\u
0026quot;/home
\u
0026quot;,
\u
0026quot;/api/user
\u
0026quot;,
\u
0026quot;/actuator/health
\u
0026quot;).permitAll() .anyRequest().authenticated(); } } 调整 Dockerfile 和 Jenkinsfile 中的路径 由于此项目构建在子目录而不是根目录中,因此请更新 ./Dockerfile 以查找 holdings-api 文件。
\n
FROM openjdk:8-jdk-slim ENV PORT 8080 ENV CLASSPATH /opt/lib EXPOSE 8080 # copy pom.xml and wildcards to avoid this command failing if there's no target/lib directory COPY holdings-api/pom.xml holdings-api/target/lib* /opt/lib/ # NOTE we assume there's only 1 jar in the target dir # but at least this means we don't have to guess the name # we could do with a better way to know the name - or to always create an app.jar or something COPY holdings-api/target/*.jar /opt/app.jar WORKDIR /opt CMD [
\u
0026quot;java
\u
0026quot;,
\u
0026quot;-jar
\u
0026quot;,
\u
0026quot;app.jar
\u
0026quot;] 你还需要更新 Jenkinsfile,以便它可以运行 holdings-api 目录中的任何 mvn 命令。也添加 -Pprod 配置文件。例如:
\n
// in the 'CI Build and push snapshot' stage steps { container('maven') { dir ('./holdings-api') { sh
\u
0026quot;mvn versions:set -DnewVersion=$PREVIEW_VERSION
\u
0026quot; sh
\u
0026quot;mvn install -Pprod
\u
0026quot; } } ... } // in the 'Build Release' stage dir ('./holdings-api') { sh
\u
0026quot;mvn versions:set -DnewVersion=
\\
$(cat ../VERSION)
\u
0026quot; } ... dir ('./holdings-api') { sh
\u
0026quot;mvn clean deploy -Pprod
\u
0026quot; } 这应该足以让这个应用程序与 Jenkins X 一起使用。但是,除非你有一个 Okta 帐户并相应地配置它,否则你将无法登录它。
\n
为什么使用Okta? 简而言之,我们使标识管理比你可能习惯的更简洁、更安全、更具可扩展性。Okta 是一种云服务,允许开发人员创建、编辑和安全存储用户帐户和用户帐户数据,并将其与一个或多个应用程序相连接。我们的 API 使你能够:
\n
对用户进行身份验证和授权 存储关于用户的数据 执行基于密码和社交登录 使用多重身份验证保护应用程序 了解更多!查看我们的产品文档 你心动了吗?注册一个永远免费的开发者帐户,当你完成后,请返回,以便我们可以通过 Spring Boot 和 Jenkins X 了解有关 CI/CD 的更多信息! 在 Okta 中为 Spring Boot 应用程序创建一个 Web 应用程序 完成设置过程后,登录到你的帐户并导航到 Applications
\u
0026gt; Add Application。单击 Web 和 下一步。在下一页中,输入以下值并单击 Done (必须单击 Done,然后编辑以修改注销重定向 URI)。
\n
应用名称: Jenkins X 默认 URI: http://localhost:8080 登录重定向 URI: http://localhost:8080/login 注销重定向 URI: http://localhost:8080 打开 holdings-api/src/main/resources/application.yml 并将你 org/app 中的值粘贴到其中。 okta: client: orgUrl: https://okta.okta.com token: XXX security: oauth2: client: access-token-uri: https://okta.okta.com/oauth2/default/v1/token user-authorization-uri: https://okta.okta.com/oauth2/default/v1/authorize client-id: {clientId} client-secret: {clientSecret} resource: user-info-uri: https://okta.okta.com/oauth2/default/v1/userinfo 你将注意到 token 值是 xxx。这是因为我更喜欢从环境变量中读取它,而不是签入源代码控制。你可能也想为你的客户密钥执行此操作,但我只是为了简洁而做一个属性。要创建 API token:
\n
导航到 API
\u
0026gt; Tokens ,然后单击 Create Token 为令牌命名(例如 “Jenkins X”),然后将其值设置为 OKTA_CLIENT_TOKEN 环境变量。 你需要在组织的用户配置文件中添加一个 holdings 属性,以便将你的加密货币存储在 Okta 中。导航到 Users
\u
0026gt; Profile Editor。点击 Profile 表格中的第一个配置文件。你可以通过其 Okta 标识来识别它。单击 Add Attribute 并使用以下值: 显示名称: Holdings 变量名: holdings 描述: Cryptocurrency Holdings 执行这些步骤后,你应该能够导航到 http://localhost:8080, 并在运行以下命令后登录: cd holdings-api ./mvnw -Pprod package java -jar target/*.jar 在 Jenkins X 中存储 Secrets 在本地存储环境变量非常简单。但是你如何在 Jenkins X 中做到这一点?看看它的凭证功能就知道了。下面是使用方法:
\n
在 Google Cloud Shell 上运行 jx console,以获取 Jenkins X 网址 单击该链接,登录,然后单击顶部的 Administration 单击 Credentials
\u
0026gt; (global)
\u
0026gt; Add Credentials(在左侧) 从下拉列表中选择 Secret text,并为 ID 输入 OKTA_CLIENT_TOKEN 将 Okta API token 复制/粘贴到 Secret 字段中 当你在里面,添加 secrets:OKTA_APP_ID、E2E_USERNAME 和 E2E_PASSWORD。第一个是你创建的 Jenkins X OIDC 应用程序的 ID。您可以通过在 Okta 上导航到您的应用程序并从 URL 复制值来获得它的值。该 E2E-* 密钥应该是要用来运行终端到终端(Protractor)测试的凭证。你可能想为此创建一个新用户。 你可以通过将这些值添加到 environment 顶部附近的部分来访问 Jenkinsfile 中的这些值 。
\n
environment { ORG = 'mraible' APP_NAME = 'okta-spring-jx-example' CHARTMUSEUM_CREDS = credentials('jenkins-x-chartmuseum') OKTA_CLIENT_TOKEN = credentials('OKTA_CLIENT_TOKEN') OKTA_APP_ID = credentials('OKTA_APP_ID') E2E_USERNAME = credentials('E2E_USERNAME') E2E_PASSWORD = credentials('E2E_PASSWORD') } 将环境变量转移到 Docker 容器 要将 OKTA_CLIENT_TOKEN 环境变量转移到 Docker 容器,请查看:
\n
sh
\u
0026quot;make preview
\u
0026quot; 并将其更改为:
\n
sh
\u
0026quot;make OKTA_CLIENT_TOKEN=
\\
$OKTA_CLIENT_TOKEN preview
\u
0026quot; 此时,你可以创建分支,提交更改,并验证 Jenkins X 中的所有内容是否正常工作。
\n
cd .. git checkout -b add-secure-app git add . git commit -m
\u
0026quot;Add Bootiful PWA
\u
0026quot; git push origin add-secure-app 打开浏览器并导航到 GitHub 上的存储库并创建 pull request。创建后它应该如下所示。
\n
如果你的 pull request 测试通过,你应该能看到一些绿色标记和 Jenkins X 的评论,说明你的应用程序在预览环境中可用。
\n
如果你单击此处链接并尝试登录,则可能会从 Okta 得到一个错误,指出重定向 URI 尚未列入白名单。
\n
在 Okta 中自动添加重定向 URI 当你在 Okta 中创建应用程序并在本地运行它们时,很容易知道应用程序的重定向 URI 将是什么。对于这个特定的应用程序,它们将 http://localhost:8080/login 用于登录,http://localhost:8080 用于注销。当您进入生产环境时,URL通常也是众所周知的。但是,使用 Jenkins X,URL 是动态的,并根据你的 pull request 编号动态创建的。
\n
要使用 Okta 进行此操作,你可以创建一个 Java 类,该类与 Okta API 进行交互。创建 holdings-api/src/test/java/.../cli/AppRedirectUriManager.java 并使用以下代码完善它。
\n
package com.okta.developer.cli; import com.okta.sdk.client.Client; import com.okta.sdk.lang.Collections; import com.okta.sdk.resource.application.OpenIdConnectApplication; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @SpringBootApplication public class AppRedirectUriManager implements ApplicationRunner { private static final Logger log = LoggerFactory.getLogger(AppRedirectUriManager.class); private final Client client; @Value(
\u
0026quot;${appId}
\u
0026quot;) private String appId; @Value(
\u
0026quot;${redirectUri}
\u
0026quot;) private String redirectUri; @Value(
\u
0026quot;${operation:add}
\u
0026quot;) private String operation; public AppRedirectUriManager(Client client) { this.client = client; } public static void main(String[] args) { SpringApplication.run(AppRedirectUriManager.class, args); } @Override public void run(ApplicationArguments args) { log.info(
\u
0026quot;Adjusting Okta settings: {appId: {}, redirectUri: {}, operation: {}}
\u
0026quot;, appId, redirectUri, operation); OpenIdConnectApplication app = (OpenIdConnectApplication) client.getApplication(appId); String loginRedirectUri = redirectUri +
\u
0026quot;/login
\u
0026quot;; // update redirect URIs List
\u
0026lt;String
\u
0026gt; redirectUris = app.getSettings().getOAuthClient().getRedirectUris(); // use a set so values are unique Set
\u
0026lt;String
\u
0026gt; updatedRedirectUris = new LinkedHashSet
\u
0026lt;
\u
0026gt;(redirectUris); if (operation.equalsIgnoreCase(
\u
0026quot;add
\u
0026quot;)) { updatedRedirectUris.add(loginRedirectUri); } else if (operation.equalsIgnoreCase(
\u
0026quot;remove
\u
0026quot;)) { updatedRedirectUris.remove(loginRedirectUri); } // todo: update logout redirect URIs with redirectUri (not currently available in Java SDK) app.getSettings().getOAuthClient().setRedirectUris(Collections.toList(updatedRedirectUris)); app.update(); System.exit(0); } } 该类使用 Spring Boot 的 CLI(命令行接口)支持,这使得可以使用 Exec Maven 插件调用它。要添加对 Maven 运行它的支持,请在 holdings-api/pom.xml 进行以下修改 。
\n\u
0026lt;properties
\u
0026gt; ...
\u
0026lt;exec-maven-plugin.version
\u
0026gt;1.6.0
\u
0026lt;/exec-maven-plugin.version
\u
0026gt;
\u
0026lt;appId
\u
0026gt;default
\u
0026lt;/appId
\u
0026gt;
\u
0026lt;redirectUri
\u
0026gt;override-me
\u
0026lt;/redirectUri
\u
0026gt;
\u
0026lt;/properties
\u
0026gt;
\u
0026lt;!-- dependencies --
\u
0026gt;
\u
0026lt;build
\u
0026gt;
\u
0026lt;defaultGoal
\u
0026gt;spring-boot:run
\u
0026lt;/defaultGoal
\u
0026gt;
\u
0026lt;finalName
\u
0026gt;holdings-app-${project.version}
\u
0026lt;/finalName
\u
0026gt;
\u
0026lt;plugins
\u
0026gt;
\u
0026lt;!-- existing plugins --
\u
0026gt;
\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;org.codehaus.mojo
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;exec-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;version
\u
0026gt;${exec-maven-plugin.version}
\u
0026lt;/version
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;add-redirect
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;java
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;mainClass
\u
0026gt;com.okta.developer.cli.AppRedirectUriManager
\u
0026lt;/mainClass
\u
0026gt;
\u
0026lt;classpathScope
\u
0026gt;test
\u
0026lt;/classpathScope
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;
\u
0026lt;argument
\u
0026gt;appId ${appId} redirectUri ${redirectUri}
\u
0026lt;/argument
\u
0026gt;
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt;
\u
0026lt;/plugins
\u
0026gt;
\u
0026lt;/build
\u
0026gt; 然后更新 Jenkinsfile 以在构建镜像之后添加一段 mvn exec:java 供运行。
\n
dir ('./charts/preview') { container('maven') { sh
\u
0026quot;make preview
\u
0026quot; sh
\u
0026quot;make OKTA_CLIENT_TOKEN=
\\
$OKTA_CLIENT_TOKEN preview
\u
0026quot; sh
\u
0026quot;jx preview --app $APP_NAME --dir ../..
\u
0026quot; } } // Add redirect URI in Okta dir ('./holdings-api') { container('maven') { sh ''' yum install -y jq previewURL=$(jx get preview -o json|jq -r
\u
0026quot;.items[].spec | select (.previewGitInfo.name==
\\\\\u
0026quot;$CHANGE_ID
\\\\\u
0026quot;) | .previewGitInfo.applicationURL
\u
0026quot;) mvn exec:java@add-redirect -DappId=$OKTA_APP_ID -DredirectUri=$previewURL ''' } } 提交并推送你的更改,应用程序应该更新为 http://{yourPreviewURL}/login 的重定向 URI。你需要手动为 http://{yourPreviewURL} 添加一个注销重定向 URI, 因为 Okta 的 Java SDK 目前不支持此功能。
\n
要将你的 pull request 上传到演示环境,请将其合并,并将主分支推送到演示环境。不幸的是,你将无法登录。这是因为没有进程使用你的 Okta 应用程序注册登台站点的重定向 URI。如果手动添加 URI,一切都应该有效。
\n
在 Jenkins X 中运行 Protractor 测试 对我来说,弄清楚如何在 Jenkins X 中运行端到端测试是最难的。我首先添加了一个新的 Maven 配置文件,它允许我使用 Maven 而不是 npm 运行测试。
\n
注意:要使此配置文件起作用,你需要将 http://localhost:8000/login 登录重定向 URI 添加到你的应用程序,并将 http://localhost:8000 作为注销重定向URI。
\n\u
0026lt;profile
\u
0026gt;
\u
0026lt;id
\u
0026gt;e2e
\u
0026lt;/id
\u
0026gt;
\u
0026lt;properties
\u
0026gt;
\u
0026lt;!-- Hard-code port instead of using build-helper-maven-plugin. --
\u
0026gt;
\u
0026lt;!-- This way, you don't need to add a redirectUri to Okta app. --
\u
0026gt;
\u
0026lt;http.port
\u
0026gt;8000
\u
0026lt;/http.port
\u
0026gt;
\u
0026lt;/properties
\u
0026gt;
\u
0026lt;build
\u
0026gt;
\u
0026lt;plugins
\u
0026gt;
\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;org.springframework.boot
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;spring-boot-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;pre-integration-test
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;start
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;
\u
0026lt;argument
\u
0026gt;--server.port=${http.port}
\u
0026lt;/argument
\u
0026gt;
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;post-integration-test
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;stop
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt;
\u
0026lt;plugin
\u
0026gt;
\u
0026lt;groupId
\u
0026gt;com.github.eirslett
\u
0026lt;/groupId
\u
0026gt;
\u
0026lt;artifactId
\u
0026gt;frontend-maven-plugin
\u
0026lt;/artifactId
\u
0026gt;
\u
0026lt;version
\u
0026gt;${frontend-maven-plugin.version}
\u
0026lt;/version
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;workingDirectory
\u
0026gt;../crypto-pwa
\u
0026lt;/workingDirectory
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;executions
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;webdriver update
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;phase
\u
0026gt;pre-integration-test
\u
0026lt;/phase
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;run e2e-update
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;execution
\u
0026gt;
\u
0026lt;id
\u
0026gt;ionic e2e
\u
0026lt;/id
\u
0026gt;
\u
0026lt;goals
\u
0026gt;
\u
0026lt;goal
\u
0026gt;npm
\u
0026lt;/goal
\u
0026gt;
\u
0026lt;/goals
\u
0026gt;
\u
0026lt;phase
\u
0026gt;integration-test
\u
0026lt;/phase
\u
0026gt;
\u
0026lt;configuration
\u
0026gt;
\u
0026lt;environmentVariables
\u
0026gt;
\u
0026lt;PORT
\u
0026gt;${http.port}
\u
0026lt;/PORT
\u
0026gt;
\u
0026lt;CI
\u
0026gt;true
\u
0026lt;/CI
\u
0026gt;
\u
0026lt;/environmentVariables
\u
0026gt;
\u
0026lt;arguments
\u
0026gt;run e2e-test
\u
0026lt;/arguments
\u
0026gt;
\u
0026lt;/configuration
\u
0026gt;
\u
0026lt;/execution
\u
0026gt;
\u
0026lt;/executions
\u
0026gt;
\u
0026lt;/plugin
\u
0026gt;
\u
0026lt;/plugins
\u
0026gt;
\u
0026lt;/build
\u
0026gt;
\u
0026lt;/profile
\u
0026gt; 提示:你可能会注意到,我必须为 e2e-update 和 e2e-test 分两次不同的执行。我发现运行 npm e2e 与 frontend-maven-plugin 不兼容,因为它只调用其他 npm run 命令。看来你需要在使用 frontend-maven-plugin 时直接调用二进制文件。
\n
这里使用的不是 TRAVIS 环境变量,而是 CI 变量。此更改需要更新 crypto-pwa/test/protractor.conf.js 来匹配。
\n
baseUrl: (process.env.CI) ? 'http://localhost:' + process.env.PORT : 'http://localhost:8100', 进行这些更改,你应该能够运行 ./mvnw verify -Pprod,e2e 以在本地运行端到端测试。请注意,你需要将 E2E_USERNAME 和 E2E_PASSWORD 定义为环境变量。
\n
当我第一次在 Jenkins X 中尝试这个功能时,我发现 jenkins-maven 代理没有安装 Chrome。我发现很难安装并发现 jenkins-nodejs 预安装了 Chrome 和 Xvfb。当我第一次尝试它时,我遇到以下错误:
\n
[21:51:08] E/launcher - unknown error: DevToolsActivePort file doesn't exist 此错误是由 Chrome on Linux 问题引起的 。我发现解决办法是在 Protractor 的 chromeOptions 中指定 -disable-dev-shm-usage。我还添加了一些推荐的额外标志。我特别喜欢 --headless,在本地运行时,因此浏览器不会弹出并妨碍我。如果我想实时看到这个过程,我可以快速删除该选项。
\n
如果你希望在 Jenkins X 上看到项目的 Protractor 测试运行,则需要修改 crypto-pwa/test/protractor.conf.js 以指定以下内容 chromeOptions:
\n
capabilities: { 'browserName': 'chrome', 'chromeOptions': { 'args': ['--headless', ''--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage'] } }, 然后向 Jenkinsfile 添加一个新的 Run e2e tests 阶段,该阶段位于 “CI 构建”和“构建发布”阶段之间。如果有帮助,你可以看到最终的 Jenkins 文件。
\n
stage('Run e2e tests') { agent { label
\u
0026quot;jenkins-nodejs
\u
0026quot; } steps { container('nodejs') { sh ''' yum install -y jq previewURL=$(jx get preview -o json|jq -r
\u
0026quot;.items[].spec | select (.previewGitInfo.name==
\\\\\u
0026quot;$CHANGE_ID
\\\\\u
0026quot;) | .previewGitInfo.applicationURL
\u
0026quot;) cd crypto-pwa
\u
0026amp;
\u
0026amp; npm install --unsafe-perm
\u
0026amp;
\u
0026amp; npm run e2e-update Xvfb :99
\u
0026amp; sleep 60s DISPLAY=:99 npm run e2e-test -- --baseUrl=$previewURL ''' } } } 完成所有这些更改后,创建一个新分支,签入你的更改,并在 GitHub 上创建一个 pull request。
\n
git checkout -b enable-e2e-tests git add . git commit -m
\u
0026quot;Add stage for end-to-end tests
\u
0026quot; git push origin enable-e2e-tests 我确实需要做一些额外的调整才能通过所有的 Protractor 测试:
\n
在 crypto-pwa/e2e/spec/login.e2e-spec.ts 中,我无法通过 should show a login button 测试,所以我忽略了它,将 it(…) 改为 xit(…)。 在同一个文件中,我将2000 ms 超时更改为5000 ms,将5000 ms 超时更改为30000 ms。 在 crypto-pwa/test/protractor.conf.js 中,我将 defaultTimeoutInterval 更改为 600000。 第一次运行时测试可能会失败,因为未为新预览环境配置注销重定向URI。更新 Okta 应用程序的注销重定向 URI 以匹配你的 PR 的预览环境 URI,重新 pull request 测试,一切都应该通过! 你可以在 GitHub 上的此示例中找到已完成应用程序的源代码 。
\n
了解有关 Jenkins X、Kubernetes 和 Spring Boot 的更多信息 要了解有关 Spring Boot、Jenkins X 和 Kubernetes 的更多信息,请查看以下资源:
\n
Deploy Your Secure Spring Boot + Angular PWA as a Single Artifact Build a Basic CRUD App with Angular 5.0 and Spring Boot 2.0 Introducing Jenkins X: a CI/CD solution for modern cloud applications on Kubernetes Kubernetes The Hard Way by Kelsey Hightower 如果你在 Kubernetes 上运行生产应用程序,我建议你研究 Jenkins X.它提供了一种在相同环境中进行 CI/CD 的方法,快速迭代并为你的客户更快地交付业务价值。 Jenkins X 还包括一个 DevPods 功能,可以在笔记本电脑上进行开发时,可以自动部署保存。我不确定 DevPods 是否适用于需要具有生产转换步骤的 JavaScript 应用程序。我宁愿让 webpack 和 Browsersync 在几秒钟内刷新我的本地浏览器,而不是等待几分钟创建并部署 Docker 镜像到 Kubernetes。
\n
要获得 Jenkins X 的精彩概述和演示,请观看 James Strachan 在2018年6月的 Virtual JUG 会议上为 Kubernetes 发布的 Jenkins X: Continuous Delivery。
\n
如果你有任何疑问,请在下面添加评论,在 Twitter 上发帖,或在我们的开发者论坛 上发帖提问。要获得有关未来博客文章和开发人员智慧的通知,你可以在Twitter上关注我的整个团队。
\n
使用 Jenkins X 和 Kubernetes 将 CI/CD 添加到 Spring Boot 应用程序中,最初于2018年7月11日发布到 Okta 开发人员博客。
\n
"
,
"auhtor"
:
"Matt Raible"
,
"auhtor"
:
"Matt Raible"
,
"translator"
:
"yJunS"
,
"translator"
:
"yJunS"
,
"original"
:
"https://dzone.com/articles/achieve-cicd-with-jenkins-x-kubernetes-and-spring"
,
"original"
:
"https://dzone.com/articles/achieve-cicd-with-jenkins-x-kubernetes-and-spring"
,
...
@@ -1108,7 +1108,7 @@
...
@@ -1108,7 +1108,7 @@
"uri"
:
"https://jenkins-zh.cn/tags/ci/"
,
"uri"
:
"https://jenkins-zh.cn/tags/ci/"
,
"title"
:
"Ci"
,
"title"
:
"Ci"
,
"type"
:
"tags"
,
"type"
:
"tags"
,
"date"
:
"2019-06-1
5
00:00:00 +0000 UTC"
,
"date"
:
"2019-06-1
4
00:00:00 +0000 UTC"
,
"tags"
:
[],
"tags"
:
[],
"description"
:
""
,
"description"
:
""
,
"content"
:
""
,
"content"
:
""
,
...
@@ -1459,7 +1459,7 @@
...
@@ -1459,7 +1459,7 @@
"uri"
:
"https://jenkins-zh.cn/tags/jenkins/"
,
"uri"
:
"https://jenkins-zh.cn/tags/jenkins/"
,
"title"
:
"Jenkins"
,
"title"
:
"Jenkins"
,
"type"
:
"tags"
,
"type"
:
"tags"
,
"date"
:
"2019-06-1
5
00:00:00 +0000 UTC"
,
"date"
:
"2019-06-1
4
00:00:00 +0000 UTC"
,
"tags"
:
[],
"tags"
:
[],
"description"
:
""
,
"description"
:
""
,
"content"
:
""
,
"content"
:
""
,
...
@@ -1511,7 +1511,7 @@
...
@@ -1511,7 +1511,7 @@
"uri"
:
"https://jenkins-zh.cn/"
,
"uri"
:
"https://jenkins-zh.cn/"
,
"title"
:
"Jenkins 中文社区"
,
"title"
:
"Jenkins 中文社区"
,
"type"
:
"page"
,
"type"
:
"page"
,
"date"
:
"2019-06-1
5
00:00:00 +0000 UTC"
,
"date"
:
"2019-06-1
4
00:00:00 +0000 UTC"
,
"tags"
:
[],
"tags"
:
[],
"description"
:
""
,
"description"
:
""
,
"content"
:
""
,
"content"
:
""
,
...
@@ -1992,7 +1992,7 @@
...
@@ -1992,7 +1992,7 @@
"uri"
:
"https://jenkins-zh.cn/wechat/"
,
"uri"
:
"https://jenkins-zh.cn/wechat/"
,
"title"
:
"Wechats"
,
"title"
:
"Wechats"
,
"type"
:
"wechat"
,
"type"
:
"wechat"
,
"date"
:
"2019-06-1
5
00:00:00 +0000 UTC"
,
"date"
:
"2019-06-1
4
00:00:00 +0000 UTC"
,
"tags"
:
[],
"tags"
:
[],
"description"
:
""
,
"description"
:
""
,
"content"
:
""
,
"content"
:
""
,
...
...
index.xml
浏览文件 @
502d7769
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<description>
Recent content on Jenkins 中文社区
</description>
<description>
Recent content on Jenkins 中文社区
</description>
<generator>
Hugo -- gohugo.io
</generator>
<generator>
Hugo -- gohugo.io
</generator>
<language>
zh-CN
</language>
<language>
zh-CN
</language>
<lastBuildDate>
Sat, 15
Jun 2019 00:00:00 +0000
</lastBuildDate>
<lastBuildDate>
Fri, 14
Jun 2019 00:00:00 +0000
</lastBuildDate>
<atom:link
href=
"https://jenkins-zh.cn/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
<atom:link
href=
"https://jenkins-zh.cn/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
...
@@ -27,7 +27,7 @@ GitHub 请您使用同一个 GitHub 账号来与大家交流,不欢迎使用
...
@@ -27,7 +27,7 @@ GitHub 请您使用同一个 GitHub 账号来与大家交流,不欢迎使用
<item>
<item>
<title>
30分钟搞定 Jenkins CI
</title>
<title>
30分钟搞定 Jenkins CI
</title>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<pubDate>
Sat, 15
Jun 2019 00:00:00 +0000
</pubDate>
<pubDate>
Fri, 14
Jun 2019 00:00:00 +0000
</pubDate>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
...
@@ -132,7 +132,9 @@ GitHub 作为全球最大、最为专业的开源社交平台,不仅仅是研
...
@@ -132,7 +132,9 @@ GitHub 作为全球最大、最为专业的开源社交平台,不仅仅是研
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
sitemap.xml
浏览文件 @
502d7769
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
<url>
<url>
<loc>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</loc>
<loc>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</loc>
<lastmod>
2019-06-1
5
T00:00:00+00:00
</lastmod>
<lastmod>
2019-06-1
4
T00:00:00+00:00
</lastmod>
</url>
</url>
<url>
<url>
...
@@ -409,7 +409,7 @@
...
@@ -409,7 +409,7 @@
<url>
<url>
<loc>
https://jenkins-zh.cn/tags/ci/
</loc>
<loc>
https://jenkins-zh.cn/tags/ci/
</loc>
<lastmod>
2019-06-1
5
T00:00:00+00:00
</lastmod>
<lastmod>
2019-06-1
4
T00:00:00+00:00
</lastmod>
<priority>
0
</priority>
<priority>
0
</priority>
</url>
</url>
...
@@ -563,7 +563,7 @@
...
@@ -563,7 +563,7 @@
<url>
<url>
<loc>
https://jenkins-zh.cn/tags/jenkins/
</loc>
<loc>
https://jenkins-zh.cn/tags/jenkins/
</loc>
<lastmod>
2019-06-1
5
T00:00:00+00:00
</lastmod>
<lastmod>
2019-06-1
4
T00:00:00+00:00
</lastmod>
<priority>
0
</priority>
<priority>
0
</priority>
</url>
</url>
...
@@ -583,7 +583,7 @@
...
@@ -583,7 +583,7 @@
<url>
<url>
<loc>
https://jenkins-zh.cn/
</loc>
<loc>
https://jenkins-zh.cn/
</loc>
<lastmod>
2019-06-1
5
T00:00:00+00:00
</lastmod>
<lastmod>
2019-06-1
4
T00:00:00+00:00
</lastmod>
<priority>
0
</priority>
<priority>
0
</priority>
</url>
</url>
...
@@ -784,7 +784,7 @@
...
@@ -784,7 +784,7 @@
<url>
<url>
<loc>
https://jenkins-zh.cn/wechat/
</loc>
<loc>
https://jenkins-zh.cn/wechat/
</loc>
<lastmod>
2019-06-1
5
T00:00:00+00:00
</lastmod>
<lastmod>
2019-06-1
4
T00:00:00+00:00
</lastmod>
<priority>
0
</priority>
<priority>
0
</priority>
</url>
</url>
...
...
tags/cd/index.xml
浏览文件 @
502d7769
...
@@ -20,7 +20,9 @@
...
@@ -20,7 +20,9 @@
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
tags/ci/index.html
浏览文件 @
502d7769
...
@@ -38,7 +38,7 @@
...
@@ -38,7 +38,7 @@
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/tags/ci/"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/tags/ci/"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
itemprop=
"name"
content=
"Ci"
>
<meta
itemprop=
"name"
content=
"Ci"
>
<meta
itemprop=
"description"
content=
""
>
<meta
itemprop=
"description"
content=
""
>
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"bg-white mb2 pa3 pa4-l gray"
>
<h1
class=
"near-black f3"
>
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"link primary-color dim"
>
30分钟搞定 Jenkins CI
</a>
</h1>
<div
class=
"lh-copy links"
>
设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"f6 mt2 db link primary-color dim"
>
查看更多
»
</a>
</div>
</div>
</div>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
...
...
tags/ci/index.xml
浏览文件 @
502d7769
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<description>
Recent content in Ci on Jenkins 中文社区
</description>
<description>
Recent content in Ci on Jenkins 中文社区
</description>
<generator>
Hugo -- gohugo.io
</generator>
<generator>
Hugo -- gohugo.io
</generator>
<language>
zh-CN
</language>
<language>
zh-CN
</language>
<lastBuildDate>
Sat, 15
Jun 2019 00:00:00 +0000
</lastBuildDate>
<lastBuildDate>
Fri, 14
Jun 2019 00:00:00 +0000
</lastBuildDate>
<atom:link
href=
"https://jenkins-zh.cn/tags/ci/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
<atom:link
href=
"https://jenkins-zh.cn/tags/ci/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
<item>
<item>
<title>
30分钟搞定 Jenkins CI
</title>
<title>
30分钟搞定 Jenkins CI
</title>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<pubDate>
Sat, 15
Jun 2019 00:00:00 +0000
</pubDate>
<pubDate>
Fri, 14
Jun 2019 00:00:00 +0000
</pubDate>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
...
@@ -33,7 +33,9 @@
...
@@ -33,7 +33,9 @@
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
tags/index.xml
浏览文件 @
502d7769
...
@@ -68,7 +68,7 @@
...
@@ -68,7 +68,7 @@
<item>
<item>
<title>
Ci
</title>
<title>
Ci
</title>
<link>
https://jenkins-zh.cn/tags/ci/
</link>
<link>
https://jenkins-zh.cn/tags/ci/
</link>
<pubDate>
Sat, 15
Jun 2019 00:00:00 +0000
</pubDate>
<pubDate>
Fri, 14
Jun 2019 00:00:00 +0000
</pubDate>
<guid>
https://jenkins-zh.cn/tags/ci/
</guid>
<guid>
https://jenkins-zh.cn/tags/ci/
</guid>
<description></description>
<description></description>
...
@@ -293,7 +293,7 @@
...
@@ -293,7 +293,7 @@
<item>
<item>
<title>
Jenkins
</title>
<title>
Jenkins
</title>
<link>
https://jenkins-zh.cn/tags/jenkins/
</link>
<link>
https://jenkins-zh.cn/tags/jenkins/
</link>
<pubDate>
Sat, 15
Jun 2019 00:00:00 +0000
</pubDate>
<pubDate>
Fri, 14
Jun 2019 00:00:00 +0000
</pubDate>
<guid>
https://jenkins-zh.cn/tags/jenkins/
</guid>
<guid>
https://jenkins-zh.cn/tags/jenkins/
</guid>
<description></description>
<description></description>
...
...
tags/jenkins-x/index.xml
浏览文件 @
502d7769
...
@@ -20,7 +20,9 @@
...
@@ -20,7 +20,9 @@
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
tags/jenkins/index.html
浏览文件 @
502d7769
...
@@ -38,7 +38,7 @@
...
@@ -38,7 +38,7 @@
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/tags/jenkins/"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/tags/jenkins/"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
itemprop=
"name"
content=
"Jenkins"
>
<meta
itemprop=
"name"
content=
"Jenkins"
>
<meta
itemprop=
"description"
content=
""
>
<meta
itemprop=
"description"
content=
""
>
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"bg-white mb2 pa3 pa4-l gray"
>
<h1
class=
"near-black f3"
>
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"link primary-color dim"
>
30分钟搞定 Jenkins CI
</a>
</h1>
<div
class=
"lh-copy links"
>
设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"f6 mt2 db link primary-color dim"
>
查看更多
»
</a>
</div>
</div>
</div>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
...
...
tags/jenkins/index.xml
浏览文件 @
502d7769
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<description>
Recent content in Jenkins on Jenkins 中文社区
</description>
<description>
Recent content in Jenkins on Jenkins 中文社区
</description>
<generator>
Hugo -- gohugo.io
</generator>
<generator>
Hugo -- gohugo.io
</generator>
<language>
zh-CN
</language>
<language>
zh-CN
</language>
<lastBuildDate>
Sat, 15
Jun 2019 00:00:00 +0000
</lastBuildDate>
<lastBuildDate>
Fri, 14
Jun 2019 00:00:00 +0000
</lastBuildDate>
<atom:link
href=
"https://jenkins-zh.cn/tags/jenkins/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
<atom:link
href=
"https://jenkins-zh.cn/tags/jenkins/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
<item>
<item>
<title>
30分钟搞定 Jenkins CI
</title>
<title>
30分钟搞定 Jenkins CI
</title>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<pubDate>
Sat, 15
Jun 2019 00:00:00 +0000
</pubDate>
<pubDate>
Fri, 14
Jun 2019 00:00:00 +0000
</pubDate>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
...
...
tags/jenkins/page/2/index.html
浏览文件 @
502d7769
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"bg-white mb2 pa3 pa4-l gray"
>
<h1
class=
"near-black f3"
>
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"link primary-color dim"
>
30分钟搞定 Jenkins CI
</a>
</h1>
<div
class=
"lh-copy links"
>
设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"f6 mt2 db link primary-color dim"
>
查看更多
»
</a>
</div>
</div>
</div>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
...
...
tags/jenkins/page/3/index.html
浏览文件 @
502d7769
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"bg-white mb2 pa3 pa4-l gray"
>
<h1
class=
"near-black f3"
>
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"link primary-color dim"
>
30分钟搞定 Jenkins CI
</a>
</h1>
<div
class=
"lh-copy links"
>
设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"f6 mt2 db link primary-color dim"
>
查看更多
»
</a>
</div>
</div>
</div>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
...
...
tags/k8s/index.xml
浏览文件 @
502d7769
...
@@ -20,7 +20,9 @@
...
@@ -20,7 +20,9 @@
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
tags/kubernetes/index.xml
浏览文件 @
502d7769
...
@@ -20,7 +20,9 @@
...
@@ -20,7 +20,9 @@
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
tags/spring-boot/index.xml
浏览文件 @
502d7769
...
@@ -20,7 +20,9 @@
...
@@ -20,7 +20,9 @@
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
wechat/articles/2019/05/2019-05-24-achieve-cicd-with-jenkins-x-kubernetes-and-spring/index.html
浏览文件 @
502d7769
...
@@ -290,9 +290,13 @@ var trackOutboundLink = function(id, url) {
...
@@ -290,9 +290,13 @@ var trackOutboundLink = function(id, url) {
<p>
在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
</p>
<p>
在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
</p>
<
h2
id=
"如何使用容器-持续交付和-kubernetes-成为高效团队-这就是-jenkins-x-的切入点"
>
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
</h2
>
<
p>
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
</p
>
<h2
id=
"jenkins-x-的理念是为所有开发人员提供他们自己的海军航海管家-可以帮助你航行持续交付的海洋-james-strachan"
>
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
</h2>
<hr
/>
<p>
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
</p>
<hr
/>
<p>
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
</p>
<p>
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
</p>
...
...
wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/index.html
浏览文件 @
502d7769
...
@@ -36,15 +36,15 @@
...
@@ -36,15 +36,15 @@
<meta
property=
"og:description"
content=
"设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件"
/>
<meta
property=
"og:description"
content=
"设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件"
/>
<meta
property=
"og:type"
content=
"article"
/>
<meta
property=
"og:type"
content=
"article"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
/>
<meta
property=
"article:published_time"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
property=
"article:published_time"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
property=
"article:modified_time"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
property=
"article:modified_time"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
itemprop=
"name"
content=
"30分钟搞定 Jenkins CI"
>
<meta
itemprop=
"name"
content=
"30分钟搞定 Jenkins CI"
>
<meta
itemprop=
"description"
content=
"设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件"
>
<meta
itemprop=
"description"
content=
"设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件"
>
<meta
itemprop=
"datePublished"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
itemprop=
"datePublished"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
itemprop=
"dateModified"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
itemprop=
"dateModified"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
itemprop=
"wordCount"
content=
"525"
>
<meta
itemprop=
"wordCount"
content=
"525"
>
...
@@ -541,7 +541,7 @@ srw-rw---- 1 jenkins jenkins 0 Jan 6 11:45 /var/run/docker.sock
...
@@ -541,7 +541,7 @@ srw-rw---- 1 jenkins jenkins 0 Jan 6 11:45 /var/run/docker.sock
<span
class=
"nl3 child"
><svg
class=
"grow"
fill=
""
height=
"14px"
viewBox=
"0 0 24 24"
width=
"14px"
xmlns=
"http://www.w3.org/2000/svg"
><path
d=
"M0 0h24v24H0z"
fill=
"none"
/><path
d=
"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"
/></svg>
<span
class=
"nl3 child"
><svg
class=
"grow"
fill=
""
height=
"14px"
viewBox=
"0 0 24 24"
width=
"14px"
xmlns=
"http://www.w3.org/2000/svg"
><path
d=
"M0 0h24v24H0z"
fill=
"none"
/><path
d=
"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"
/></svg>
</span>
</span>
“30分钟搞定 Jenkins CI”
“30分钟搞定 Jenkins CI”
</a>
更新于:June 1
5
, 2019
</a>
更新于:June 1
4
, 2019
</h6>
</h6>
<a
href=
"https://github.com/jenkins-zh/jenkins-zh/edit/master/content/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes.md"
class=
"
<a
href=
"https://github.com/jenkins-zh/jenkins-zh/edit/master/content/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes.md"
class=
"
...
...
wechat/index.html
浏览文件 @
502d7769
...
@@ -38,7 +38,7 @@
...
@@ -38,7 +38,7 @@
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:type"
content=
"website"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/wechat/"
/>
<meta
property=
"og:url"
content=
"https://jenkins-zh.cn/wechat/"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
5
T00:00:00+00:00"
/>
<meta
property=
"og:updated_time"
content=
"2019-06-1
4
T00:00:00+00:00"
/>
<meta
itemprop=
"name"
content=
"Wechats"
>
<meta
itemprop=
"name"
content=
"Wechats"
>
<meta
itemprop=
"description"
content=
""
>
<meta
itemprop=
"description"
content=
""
>
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
...
@@ -194,6 +194,31 @@ var trackOutboundLink = function(id, url) {
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<section
class=
"flex-ns flex-wrap justify-between w-100"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"bg-white mb2 pa3 pa4-l gray"
>
<h1
class=
"near-black f3"
>
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"link primary-color dim"
>
30分钟搞定 Jenkins CI
</a>
</h1>
<div
class=
"lh-copy links"
>
设置新的 Jenkins CI,以便可以开始测试新的 Jenkins 插件
<a
href=
"/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/"
class=
"f6 mt2 db link primary-color dim"
>
查看更多
»
</a>
</div>
</div>
</div>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
<div
class=
"relative weight-0"
style=
"max-width: 350px"
>
...
...
wechat/index.xml
浏览文件 @
502d7769
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<description>
Recent content in Wechats on Jenkins 中文社区
</description>
<description>
Recent content in Wechats on Jenkins 中文社区
</description>
<generator>
Hugo -- gohugo.io
</generator>
<generator>
Hugo -- gohugo.io
</generator>
<language>
zh-CN
</language>
<language>
zh-CN
</language>
<lastBuildDate>
Sat, 15
Jun 2019 00:00:00 +0000
</lastBuildDate>
<lastBuildDate>
Fri, 14
Jun 2019 00:00:00 +0000
</lastBuildDate>
<atom:link
href=
"https://jenkins-zh.cn/wechat/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
<atom:link
href=
"https://jenkins-zh.cn/wechat/index.xml"
rel=
"self"
type=
"application/rss+xml"
/>
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
<item>
<item>
<title>
30分钟搞定 Jenkins CI
</title>
<title>
30分钟搞定 Jenkins CI
</title>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<link>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</link>
<pubDate>
Sat, 15
Jun 2019 00:00:00 +0000
</pubDate>
<pubDate>
Fri, 14
Jun 2019 00:00:00 +0000
</pubDate>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<guid>
https://jenkins-zh.cn/wechat/articles/2019/06/2019-06-14-setup-jenkins-ci-in-30-minutes/
</guid>
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
<description>
你想在本地设置中使用 Jenkins CI 进行实验吗?在本文中,我们将设置一个本地 Jenkins CI 服务,为一个简单的 Spring Boot Maven 项目创建一个构建工作,并将创建的 Docker 镜像推送到 DockerHub。这将是一个本地实验的设置,但如果你想尝试一个 Jenkins 插件,它会非常方便。
...
@@ -119,7 +119,9 @@ GitHub 作为全球最大、最为专业的开源社交平台,不仅仅是研
...
@@ -119,7 +119,9 @@ GitHub 作为全球最大、最为专业的开源社交平台,不仅仅是研
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
<description>
过去五年中的变化,如迁移到公有云以及从虚拟机向容器的转变,已经彻底改变了构建和部署软件的意义。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
以 Kubernetes 为例。Google 于2014年开源,现在所有主流的公有云供应商都支持它
&
mdash;它为开发人员提供了一种很好的方式,可以将应用程序打包到 Docker 容器中,并部署到任意 Kubernetes 集群中。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
使用 CI/CD、Kubernetes 和 Jenkins X 进行高性能开发 在技术上,高性能团队几乎总是成功的必要条件,而持续集成、持续部署(CI/CD)、小迭代以及快速反馈是构建模块。为你的云原生应用程序设置 CI/CD 可能比较困难。通过自动化所有内容,开发人员可以花费宝贵的时间来交付实际的业务。
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。 “Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
如何使用容器、持续交付和 Kubernetes 成为高效团队?这就是 Jenkins X 的切入点。
“Jenkins X 的理念是为所有开发人员提供他们自己的海军航海管家,可以帮助你航行持续交付的海洋。” - James Strachan
Jenkins X 帮助你自动化你在 Kubernetes 中的 CI/CD - 你甚至不需要学习 Docker 或 Kubernetes!
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 能做什么? Jenkins X 在 Kubernetes 上自动安装,配置和升级 Jenkins 和其他应用程序(Helm,Skaffold,Nexus 等)。它使用 Docker 镜像、Helm 图表和流水线来自动化应用程序的 CI/CD。它使用 GitOps 来管理环境之间的升级,并通过在拉取请求和生产时对其进行评论来提供大量反馈。
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
Jenkins X 入门 要安装 Jenkins X,首先需要在你的机器或云供应商上安装 jx 二进制文件。从 Google Cloud 可以获得300美元的积分,所以我决定从那里开始。
</description>
</item>
</item>
...
...
wechat/management/auto-reply/keywords-event-group.yml
0 → 100644
浏览文件 @
502d7769
keyword
:
社区活动
msgType
:
random
items
:
-
361981269
-
116480283
-
JenkinsInChina
-
zhaizhijun0
-
977675308
content
:
|-
请加下面社区志愿者的微信号,并备注“Jenkins社区活动”。
注意,请在社区活动群中交流,遵守群公告,不要频繁地打扰我们的志愿者。
wechat/management/auto-reply/keywords-wechat-group.yml
浏览文件 @
502d7769
...
@@ -11,6 +11,7 @@ items:
...
@@ -11,6 +11,7 @@ items:
-
gf1475939799
-
gf1475939799
-
gstangming
-
gstangming
-
1078390336
-
1078390336
-
JenkinsInChina
content
:
|-
content
:
|-
请加下面社区志愿者的微信号,并备注“Jenkins技术交流”。
请加下面社区志愿者的微信号,并备注“Jenkins技术交流”。
注意,请在技术交流群中提问,遵守群公告,不要频繁地打扰我们的志愿者。
注意,请在技术交流群中提问,遵守群公告,不要频繁地打扰我们的志愿者。
wechat/management/auto-reply/keywords-welcome.yml
浏览文件 @
502d7769
...
@@ -4,7 +4,7 @@ content: |-
...
@@ -4,7 +4,7 @@ content: |-
您好,欢迎关注 Jenkins 中文社区微信公众号!
您好,欢迎关注 Jenkins 中文社区微信公众号!
我们会在这里发布 Jenkins 社区的最新动态,包括:Jenkins 版本发布、线上(下)活动、技术文章等。
我们会在这里发布 Jenkins 社区的最新动态,包括:Jenkins 版本发布、线上(下)活动、技术文章等。
支持的关键字回复:微信群、社区
咨询
、转载、帮助
支持的关键字回复:微信群、社区
活动
、转载、帮助
小贴士:在每篇文章的末尾,点击阅读原文可以给我们留言。
小贴士:在每篇文章的末尾,点击阅读原文可以给我们留言。
官网网址 https://jenkins-zh.cn/
官网网址 https://jenkins-zh.cn/
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录