使用 Jenkins X、Kubernetes 和 Spring Boot 實現(xiàn) CI/CD

本文首發(fā)于:Jenkins 中文社區(qū)

過去五年中的變化檐盟,如遷移到公有云以及從虛擬機向容器的轉(zhuǎn)變,已經(jīng)徹底改變了構(gòu)建和部署軟件的意義押桃。

以 Kubernetes 為例葵萎。Google 于2014年開源,現(xiàn)在所有主流的公有云供應(yīng)商都支持它---它為開發(fā)人員提供了一種很好的方式唱凯,可以將應(yīng)用程序打包到 Docker 容器中羡忘,并部署到任意 Kubernetes 集群中。

使用 CI/CD磕昼、Kubernetes 和 Jenkins X 進行高性能開發(fā)

在技術(shù)上卷雕,高性能團隊幾乎總是成功的必要條件,而持續(xù)集成票从、持續(xù)部署(CI/CD)漫雕、小迭代以及快速反饋是構(gòu)建模塊滨嘱。為你的云原生應(yīng)用程序設(shè)置 CI/CD 可能比較困難。通過自動化所有內(nèi)容蝎亚,開發(fā)人員可以花費寶貴的時間來交付實際的業(yè)務(wù)九孩。

如何使用容器、持續(xù)交付和 Kubernetes 成為高效團隊发框?這就是 Jenkins X 的切入點躺彬。

“Jenkins X 的理念是為所有開發(fā)人員提供他們自己的海軍航海管家,可以幫助你航行持續(xù)交付的海洋梅惯∠苡担” - James Strachan

Jenkins X 幫助你自動化你在 Kubernetes 中的 CI/CD - 你甚至不需要學(xué)習(xí) Docker 或 Kubernetes!

Jenkins X 能做什么铣减?

Jenkins X 在 Kubernetes 上自動安裝她君,配置和升級 Jenkins 和其他應(yīng)用程序(Helm,Skaffold葫哗,Nexus 等)缔刹。它使用 Docker 鏡像、Helm 圖表和流水線來自動化應(yīng)用程序的 CI/CD劣针。它使用 GitOps 來管理環(huán)境之間的升級校镐,并通過在拉取請求和生產(chǎn)時對其進行評論來提供大量反饋。

Jenkins X 入門

要安裝 Jenkins X捺典,首先需要在你的機器或云供應(yīng)商上安裝?jx?二進制文件鸟廓。從 Google Cloud 可以獲得300美元的積分,所以我決定從那里開始襟己。

在 Google Cloud 上安裝 Jenkins X 并創(chuàng)建群集

瀏覽到cloud.google.com并登錄引谜。如果你還沒有帳戶,請注冊免費試用擎浴。轉(zhuǎn)到控制臺(右上角有一個鏈接)并激活 Google Cloud shell员咽。將以下命令復(fù)制并粘貼到 shell 中。

curl-L https://github.com/jenkins-x/jx/releases/download/v1.3.79/jx-linux-amd64.tar.gz | tar xzvsudo mv jx /usr/local/bin

注意:Google Cloud Shell 將在一小時后終止在你的主目錄之外所做的任何更改贮预,因此你可能必須重新運行這些命令骏融。好消息是它們將在你的歷史中,所以你只需要向上箭頭并進入萌狂。你也可以刪除上面的?sudo mv?命令,并將以下內(nèi)容添加到?.bashrc?中怀泊。

exportPATH=$PATH:.

使用以下命令在 GKE(Google Kubernetes Engine)上創(chuàng)建集群茫藏。你可能必須為你的帳戶啟用 GKE

jxcreatecluster gke--skip-login

如果系統(tǒng)提示你下載?helm霹琼,請確認你要安裝务傲。系統(tǒng)將提示你選擇 Google Cloud Zone凉当。我建議選擇一個靠近你的位置。我選擇?us-west1-a售葡,因為我住在?Denver, Colorado?附近看杭。對于 Google Cloud Machine 類型,我選擇了?n1-standard-2?并使用了 min(3)和 max(5)個節(jié)點數(shù)的默認值挟伙。

對于 GitHub 名稱楼雹,鍵入你自己的(例如?mraible)和你在 GitHub 上注冊的電子郵件(例如?matt.raible@okta.com)。我試圖使用?oktadeveloper(一個 GitHub 組織)尖阔,但我無法使其工作贮缅。

注意:如果你的帳戶啟用了兩步認證,則 GitHub 集成將失敗介却。如果你希望成功完成該過程谴供,則需要在 GitHub 上禁用它。

當(dāng)提示安裝 ingress controller 時齿坷,按?Enter?鍵?確定桂肌。再次按?Enter?鍵選擇默認 domain。

系統(tǒng)將提示你創(chuàng)建 GitHub API Token永淌。單擊?提供的 URL?并將其命名為 “Jenkins X”崎场。將 token 值復(fù)制并粘貼回控制臺。

在安裝完成后喝杯咖啡仰禀、飲料或做一些俯臥撐照雁。可能需要幾分鐘答恶。

下一步是將 API token 從 Jenkins 復(fù)制到你的控制臺饺蚊。按照控制臺中提供的說明進行操作。

完成后悬嗓,運行?jx console?并單擊鏈接以登錄到 Jenkins 實例污呼。單擊 Administration 并升級 Jenkins 及其所有插件(插件管理器 > 滾動到底部并選擇全部)。如果未能執(zhí)行此步驟包竹,將無法從 GitHub pull request 到 Jenkins X CI 進程燕酷。

創(chuàng)建一個 Spring Boot 應(yīng)用程序

當(dāng)我第一次開始使用 Jenkins X 時,我嘗試導(dǎo)入現(xiàn)有項目周瞎。即使我的應(yīng)用程序使用了 Spring Boot苗缩,但是根目錄中沒有?pom.xml,所以 Jenkins X 認為它是一個 Node.js 應(yīng)用程序声诸。出于這個原因酱讶,我建議首先創(chuàng)建一個空白的 Spring Boot 應(yīng)用程序,以保證 Jenkins X 正確創(chuàng)建彼乌。

從 Cloud Shell 創(chuàng)建一個簡單的 Spring Boot 應(yīng)用程序:

jxcreatespring -d web -d actuator

此命令使用?Spring Initializr泻肯,因此系統(tǒng)會提示你進行一些選擇渊迁。以下是我的選擇:

QUESTIONANSWER

Languagejava

Groupcom.okta.developer

Artifactokta-spring-jx-example

提示:為你的 artifact name 選取一個簡潔的名稱將減輕你的痛苦。Jenkins X 對于版本名稱有53個字符的限制灶挟,oktadeveloper/okta-spring-boot-jenkinsx-example?將會使它超過兩個字符琉朽。

為 git 用戶名、初始化 git 和提交消息都選擇默認值稚铣。如果你不想使用個人帳戶箱叁,可以選擇要使用的組織。運行以下命令以查看應(yīng)用程序的 CI/CD 流水線榛泛。

jxgetactivity -f okta-spring-jx-example -w

運行?jx console蝌蹂,單擊生成的鏈接,然后導(dǎo)航到你的項目(如果你想要一個更富視覺效果的視圖)曹锨。

![Image title]

此過程將執(zhí)行一些任務(wù):

為你的項目創(chuàng)建一個版本孤个。

為演示環(huán)境項目創(chuàng)建?pull request

將其自動部署到演示環(huán)境沛简,以便你可以查看它的運行情況齐鲤。

Mergestatuschecks all passed so the promotion worked!Applicationisavailableat:http://okta-spring-jx-example.jx-staging.35.230.106.169.nip.io

注意:由于 Spring Boot 默認情況下不提供歡迎頁面,所以打開上面的 URL 時將返回404椒楣。

使用 Jenkins X 將 Spring Boot 應(yīng)用程序部署到生產(chǎn)環(huán)境中

默認情況下给郊,Jenkins X 只會自動部署到演示環(huán)境。你可以手動改進從演示到生產(chǎn)使用:

jxpromoteokta-spring-jx-example--version0.0.1--envproduction

你可以使用?jx edit environment?更改生產(chǎn)環(huán)境捧灰,以使用自動部署淆九。

既然你已經(jīng)知道如何使用 Jenkins X 和一個簡單的 Spring Boot 應(yīng)用程序,讓我們來看看如何通過一個更實際的示例使其工作毛俏。

保護你的 Spring Boot 應(yīng)用程序并添加 Angular PWA

在過去的幾個月里炭庙,我寫了一系列有關(guān)使用 Ionic/Angular 和 Spring Boot 構(gòu)建 PWA(漸進式 Web 應(yīng)用程序)的博文。

使用 Okta 保護你的加密貨幣財富跟蹤 PWA

使用 Okta(而不是本地存儲)安全地存儲用戶的數(shù)據(jù)

使用 WireMock煌寇、Jest焕蹄、Protractor 和 Travis CI 測試 Spring Boot API 和 Angular 組件的 Hitchhiker 指南

將你的 Spring Boot + Angular PWA 部署為一個 Artifact 這是該系列的最后一篇博客文章。我相信這是一個真實應(yīng)用程序的很好的例子阀溶,因為它有許多單元和集成測試腻脏,包括與 Protractor 的端到端測試。讓我們看看如何使用 Jenkins X 和 Kubernetes 自動化生產(chǎn)路徑银锻!

克隆剛剛從GitHub創(chuàng)建的Spring Boot項目(確保在URL中更改{yourUsername}):

gitclonehttps://github.com/{yourUsername}/okta-spring-jx-example.git okta-jenkinsx

在鄰近目錄中永品,將創(chuàng)建的具有 Spring Boot + Angular 的項目克隆為一個 artifact:

gitclone https://github.com/oktadeveloper/okta-spring-boot-angular-auth-code-flow-example.git spring-boot-angular

在終端中,導(dǎo)航到?okta-jenkinsx?并刪除不再需要的文件:

cdokta-jenkinsxrm-rf.mvnsrcmvnw*pom.xml

結(jié)果應(yīng)該是包含以下文件的目錄結(jié)構(gòu):

$ 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.yaml4 directories, 15 files

將?spring-boot-angular?所有文件復(fù)制到?okta-jenkinsx击纬。

cp? -r ../spring-boot-angular/* .

使用 Travis CI 測試此應(yīng)用程序時净刮,我運行了?npm install?作為該過程的一部分趁冈。使用 Jenkins X荸镊,使用一個容器(例如?maven?或者?nodejs)保存所有內(nèi)容更簡單热监,因此在 frontend-maven-plugin(在?holdings-api/pom.xml)中添加執(zhí)行以運行?npm install?(提示:你將需要執(zhí)行?id==’npm install'?添加到現(xiàn)有的pom.xml中)。

現(xiàn)在是?okta-jenkinsx?在 IntelliJ IDEA殃饿、Eclipse谋作、Netbeans 或 VS Code 等 IDE 中作為項目打開目錄的好時機!

com.github.eirslettfrontend-maven-plugin${frontend-maven-plugin.version}../crypto-pwainstall node and npminstall-node-and-npm${node.version}npm installnpmgenerate-resourcesinstall --unsafe-perm...

注意:--unsafe-perm?標志是必要的乎芳,因為 Jenkins X?以 root 用戶身份運行構(gòu)建遵蚜。我從?node-sass 的故障排除說明中找到了這個解決方案。

增加 Actuator 并關(guān)閉 HTTPS

Jenkins X 依靠 Spring Boot 的 Actuator 進行健康檢查奈惑。這意味著如果你不將其包含在你的項目中(或有?/actuator/health?防護)吭净,Jenkins X 會報告你的應(yīng)用程序啟動失敗。

將 Actuator starter 作為依賴項添加到?holdings-api/pom.xml?中:

org.springframework.bootspring-boot-starter-actuator

你還需要允許訪問其運行健康檢查肴甸。Jenkins X 將部署你的應(yīng)用程序在一個 NGINX 服務(wù)器中,因此你也需要強制關(guān)閉 HTTPS寂殉,否則你將無法訪問你的應(yīng)用程序。修改?holdings-api/src/main/java/.../SecurityConfiguration.java以允許?holdings-api/src/main/java/.../SecurityConfiguration.java?和刪除?requiresSecure()原在。

publicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{@Overridepublicvoidconfigure(WebSecurity web)throwsException{? ? ? web.ignoring().antMatchers("/**/*.{js,html,css}");? }@Overrideprotectedvoidconfigure(HttpSecurity http)throwsException{? ? ? http? ? ? ? ? ? ? .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())? ? ? ? ? .and()? ? ? ? ? ? ? .authorizeRequests()? ? ? ? ? ? ? .antMatchers("/","/home","/api/user","/actuator/health").permitAll()? ? ? ? ? ? ? .anyRequest().authenticated();? }}

調(diào)整 Dockerfile 和 Jenkinsfile 中的路徑

由于此項目構(gòu)建在子目錄而不是根目錄中友扰,因此請更新?./Dockerfile?以查找?holdings-api?文件。

FROM openjdk:8-jdk-slimENV PORT8080ENV CLASSPATH /opt/libEXPOSE8080# copy pom.xml and wildcards to avoid this command failing if there's no target/lib directoryCOPY 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 somethingCOPY holdings-api/target/*.jar /opt/app.jarWORKDIR /optCMD ["java","-jar","app.jar"]

你還需要更新 Jenkinsfile,以便它可以運行?holdings-api?目錄中的任何?mvn?命令庶柿。也添加?-Pprod?配置文件村怪。例如:

//inthe'CI Build and push snapshot'stagesteps { container('maven') {? dir ('./holdings-api') {? ? sh"mvn versions:set -DnewVersion=$PREVIEW_VERSION"sh"mvn install -Pprod"} } ...}//inthe'Build Release'stagedir ('./holdings-api') {? sh"mvn versions:set -DnewVersion=\$(cat ../VERSION)"}...dir ('./holdings-api') {? sh"mvn clean deploy -Pprod"}

這應(yīng)該足以讓這個應(yīng)用程序與 Jenkins X 一起使用。但是浮庐,除非你有一個 Okta 帳戶并相應(yīng)地配置它甚负,否則你將無法登錄它。

為什么使用Okta审残?

簡而言之梭域,我們使標識管理比你可能習(xí)慣的更簡潔、更安全维苔、更具可擴展性碰辅。Okta 是一種云服務(wù),允許開發(fā)人員創(chuàng)建介时、編輯和安全存儲用戶帳戶和用戶帳戶數(shù)據(jù)没宾,并將其與一個或多個應(yīng)用程序相連接。我們的 API 使你能夠:

對用戶進行身份驗證授權(quán)

存儲關(guān)于用戶的數(shù)據(jù)

執(zhí)行基于密碼和社交登錄

使用多重身份驗證保護應(yīng)用程序

了解更多沸柔!查看我們的產(chǎn)品文檔?你心動了嗎循衰?注冊一個永遠免費的開發(fā)者帳戶,當(dāng)你完成后褐澎,請返回会钝,以便我們可以通過 Spring Boot 和 Jenkins X 了解有關(guān) CI/CD 的更多信息!

在 Okta 中為 Spring Boot 應(yīng)用程序創(chuàng)建一個 Web 應(yīng)用程序

完成設(shè)置過程后,登錄到你的帳戶并導(dǎo)航到?Applications > Add Application迁酸。單擊?Web?和?下一步先鱼。在下一頁中,輸入以下值并單擊?Done?(必須單擊?Done奸鬓,然后編輯以修改注銷重定向?URI)焙畔。

應(yīng)用名稱:?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.comtoken: XXXsecurity:? oauth2:? ? client:? ? ? access-token-uri: https://okta.okta.com/oauth2/default/v1/tokenuser-authorization-uri: https://okta.okta.com/oauth2/default/v1/authorizeclient-id: {clientId}? ? ? client-secret: {clientSecret}? ? resource:? ? ? user-info-uri: https://okta.okta.com/oauth2/default/v1/userinfo

你將注意到?token?值是?xxx串远。這是因為我更喜歡從環(huán)境變量中讀取它宏多,而不是簽入源代碼控制。你可能也想為你的客戶密鑰執(zhí)行此操作澡罚,但我只是為了簡潔而做一個屬性伸但。要創(chuàng)建 API token:

導(dǎo)航到?API?>?Tokens?,然后單擊?Create Token

為令牌命名(例如 “Jenkins X”)留搔,然后將其值設(shè)置為?OKTA_CLIENT_TOKEN?環(huán)境變量更胖。 你需要在組織的用戶配置文件中添加一個?holdings?屬性,以便將你的加密貨幣存儲在 Okta 中催式。導(dǎo)航到?Users?>?Profile Editor函喉。點擊?Profile?表格中的第一個配置文件。你可以通過其 Okta 標識來識別它荣月。單擊?Add Attribute?并使用以下值:

顯示名稱:?Holdings

變量名:?holdings

描述:?Cryptocurrency Holdings?執(zhí)行這些步驟后管呵,你應(yīng)該能夠?qū)Ш降?http://localhost:8080, 并在運行以下命令后登錄:

cdholdings-api./mvnw -Pprod packagejava -jar target/*.jar

在 Jenkins X 中存儲 Secrets 在本地存儲環(huán)境變量非常簡單。但是你如何在 Jenkins X 中做到這一點哺窄?看看它的憑證功能就知道了捐下。下面是使用方法:

在 Google Cloud Shell 上運行?jx console,以獲取 Jenkins X 網(wǎng)址

單擊該鏈接萌业,登錄坷襟,然后單擊頂部的?Administration

單擊?Credentials?>?(global)?>?Add Credentials(在左側(cè))

從下拉列表中選擇?Secret text,并為 ID 輸入 OKTA_CLIENT_TOKEN

將 Okta API token 復(fù)制/粘貼到?Secret?字段中 當(dāng)你在里面生年,添加 secrets:OKTA_APP_ID婴程、E2E_USERNAME和?E2E_PASSWORD。第一個是你創(chuàng)建的?Jenkins X?OIDC 應(yīng)用程序的 ID抱婉。您可以通過在 Okta 上導(dǎo)航到您的應(yīng)用程序并從 URL 復(fù)制值來獲得它的值档叔。該?E2E-*?密鑰應(yīng)該是要用來運行終端到終端(Protractor)測試的憑證。你可能想為此創(chuàng)建一個新用戶蒸绩。

你可以通過將這些值添加到?environment?頂部附近的部分來訪問?Jenkinsfile?中的這些值 衙四。

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')}

將環(huán)境變量轉(zhuǎn)移到 Docker 容器

要將?OKTA_CLIENT_TOKEN?環(huán)境變量轉(zhuǎn)移到 Docker 容器,請查看:

sh"make preview"

并將其更改為:

sh"make OKTA_CLIENT_TOKEN=\$OKTA_CLIENT_TOKEN preview"

此時患亿,你可以創(chuàng)建分支传蹈,提交更改,并驗證 Jenkins X 中的所有內(nèi)容是否正常工作。

cd ..git checkout -badd-secure-appgitadd.git commit -m"Add Bootiful PWA"git push originadd-secure-app

打開瀏覽器并導(dǎo)航到 GitHub 上的存儲庫并創(chuàng)建 pull request惦界。創(chuàng)建后它應(yīng)該如下所示挑格。

如果你的 pull request 測試通過,你應(yīng)該能看到一些綠色標記和 Jenkins X 的評論沾歪,說明你的應(yīng)用程序在預(yù)覽環(huán)境中可用恕齐。

如果你單擊此處鏈接并嘗試登錄,則可能會從 Okta 得到一個錯誤瞬逊,指出重定向 URI 尚未列入白名單。

在 Okta 中自動添加重定向 URI

當(dāng)你在 Okta 中創(chuàng)建應(yīng)用程序并在本地運行它們時仪或,很容易知道應(yīng)用程序的重定向 URI 將是什么确镊。對于這個特定的應(yīng)用程序,它們將?http://localhost:8080/login?用于登錄范删,http://localhost:8080?用于注銷蕾域。當(dāng)您進入生產(chǎn)環(huán)境時,URL通常也是眾所周知的到旦。但是旨巷,使用 Jenkins X,URL 是動態(tài)的添忘,并根據(jù)你的 pull request 編號動態(tài)創(chuàng)建的采呐。

要使用 Okta 進行此操作,你可以創(chuàng)建一個 Java 類搁骑,該類與 Okta API 進行交互斧吐。創(chuàng)建?holdings-api/src/test/java/.../cli/AppRedirectUriManager.java?并使用以下代碼完善它。

packagecom.okta.developer.cli;importcom.okta.sdk.client.Client;importcom.okta.sdk.lang.Collections;importcom.okta.sdk.resource.application.OpenIdConnectApplication;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.boot.ApplicationArguments;importorg.springframework.boot.ApplicationRunner;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importjava.util.LinkedHashSet;importjava.util.List;importjava.util.Set;@SpringBootApplicationpublicclassAppRedirectUriManagerimplementsApplicationRunner{privatestaticfinalLogger log = LoggerFactory.getLogger(AppRedirectUriManager.class);privatefinalClient client;@Value("${appId}")privateString appId;@Value("${redirectUri}")privateString redirectUri;@Value("${operation:add}")privateString operation;publicAppRedirectUriManager(Client client){this.client = client;? }publicstaticvoidmain(String[] args){? ? ? SpringApplication.run(AppRedirectUriManager.class, args);? }@Overridepublicvoidrun(ApplicationArguments args){? ? ? log.info("Adjusting Okta settings: {appId: {}, redirectUri: {}, operation: {}}", appId, redirectUri, operation);? ? ? OpenIdConnectApplication app = (OpenIdConnectApplication) client.getApplication(appId);? ? ? String loginRedirectUri = redirectUri +"/login";// update redirect URIsList redirectUris = app.getSettings().getOAuthClient().getRedirectUris();// use a set so values are uniqueSet updatedRedirectUris =newLinkedHashSet<>(redirectUris);if(operation.equalsIgnoreCase("add")) {? ? ? ? ? updatedRedirectUris.add(loginRedirectUri);? ? ? }elseif(operation.equalsIgnoreCase("remove")) {? ? ? ? ? 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 插件調(diào)用它煤率。要添加對 Maven 運行它的支持,請在?holdings-api/pom.xml?進行以下修改 乏冀。

...1.6.0defaultoverride-me<!-- dependencies -->spring-boot:runholdings-app-${project.version}<!-- existing plugins -->org.codehaus.mojoexec-maven-plugin${exec-maven-plugin.version}add-redirectjavacom.okta.developer.cli.AppRedirectUriManagertestappId ${appId} redirectUri ${redirectUri}

然后更新?Jenkinsfile?以在構(gòu)建鏡像之后添加一段?mvn exec:java?供運行蝶糯。

dir ('./charts/preview') {? container('maven') {? ? sh"make preview"sh"make OKTA_CLIENT_TOKEN=\$OKTA_CLIENT_TOKEN preview"sh"jx preview --app $APP_NAME --dir ../.."}}// Add redirect URIinOktadir ('./holdings-api') {? container('maven') {? ? sh'''

? ? ? yum install -y jq

? ? ? previewURL=$(jx get preview -o json|jq? -r ".items[].spec | select (.previewGitInfo.name==\\"$CHANGE_ID\\") | .previewGitInfo.applicationURL")

? ? ? mvn exec:java@add-redirect -DappId=$OKTA_APP_ID -DredirectUri=$previewURL

? ? '''}}

提交并推送你的更改,應(yīng)用程序應(yīng)該更新為?http://{yourPreviewURL}/login?的重定向 URI辆沦。你需要手動為?http://{yourPreviewURL}?添加一個注銷重定向 URI昼捍, 因為?Okta 的 Java SDK 目前不支持此功能

要將你的 pull request 上傳到演示環(huán)境众辨,請將其合并端三,并將主分支推送到演示環(huán)境。不幸的是鹃彻,你將無法登錄郊闯。這是因為沒有進程使用你的 Okta 應(yīng)用程序注冊登臺站點的重定向 URI。如果手動添加 URI,一切都應(yīng)該有效团赁。

在 Jenkins X 中運行 Protractor 測試

對我來說育拨,弄清楚如何在 Jenkins X 中運行端到端測試是最難的。我首先添加了一個新的 Maven 配置文件欢摄,它允許我使用 Maven 而不是 npm 運行測試熬丧。

注意:要使此配置文件起作用,你需要將?http://localhost:8000/login?登錄重定向 URI 添加到你的應(yīng)用程序怀挠,并將?http://localhost:8000?作為注銷重定向URI析蝴。

e2e<!-- Hard-code port instead of using build-helper-maven-plugin. --><!-- This way, you don't need to add a redirectUri to Okta app. -->8000org.springframework.bootspring-boot-maven-pluginpre-integration-teststart--server.port=${http.port}post-integration-teststopcom.github.eirslettfrontend-maven-plugin${frontend-maven-plugin.version}../crypto-pwawebdriver updatenpmpre-integration-testrun e2e-updateionic e2enpmintegration-test${http.port}truerun e2e-test

提示:你可能會注意到,我必須為?e2e-update?和?e2e-test?分兩次不同的執(zhí)行绿淋。我發(fā)現(xiàn)運行?npm e2e?與 frontend-maven-plugin 不兼容闷畸,因為它只調(diào)用其他?npm run?命令⊥讨停看來你需要在使用 frontend-maven-plugin 時直接調(diào)用二進制文件佑菩。

這里使用的不是?TRAVIS?環(huán)境變量,而是?CI?變量裁赠。此更改需要更新?crypto-pwa/test/protractor.conf.js?來匹配殿漠。

baseUrl: (process.env.CI) ?'http://localhost:'+ process.env.PORT :'http://localhost:8100',

進行這些更改,你應(yīng)該能夠運行?./mvnw verify -Pprod,e2e?以在本地運行端到端測試佩捞。請注意绞幌,你需要將?E2E_USERNAME?和?E2E_PASSWORD?定義為環(huán)境變量。

當(dāng)我第一次在 Jenkins X 中嘗試這個功能時一忱,我發(fā)現(xiàn)?jenkins-maven?代理沒有安裝 Chrome啊奄。我發(fā)現(xiàn)很難安裝并發(fā)現(xiàn)?jenkins-nodejs?預(yù)安裝了 Chrome 和 Xvfb。當(dāng)我第一次嘗試它時掀潮,我遇到以下錯誤:

[21:51:08] E/launcher - unknown error: DevToolsActivePort file doesn't exist

此錯誤是由 Chrome on Linux 問題引起的 菇夸。我發(fā)現(xiàn)解決辦法是在 Protractor 的?chromeOptions?中指定?-disable-dev-shm-usage。我還添加了一些推薦的額外標志仪吧。我特別喜歡?--headless庄新,在本地運行時,因此瀏覽器不會彈出并妨礙我薯鼠。如果我想實時看到這個過程择诈,我可以快速刪除該選項。

如果你希望在 Jenkins X 上看到項目的 Protractor 測試運行出皇,則需要修改?crypto-pwa/test/protractor.conf.js以指定以下內(nèi)容?chromeOptions:

capabilities: {'browserName':'chrome','chromeOptions': {'args': ['--headless',''--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage']

? }

},

然后向 Jenkinsfile 添加一個新的?Run e2e tests?階段羞芍,該階段位于 “CI 構(gòu)建”和“構(gòu)建發(fā)布”階段之間。如果有幫助郊艘,你可以看到最終的?Jenkins 文件荷科。

stage('Run e2e tests') { agent {? label"jenkins-nodejs"} steps {? container('nodejs') {? ? sh'''

? ? ? yum install -y jq

? ? ? previewURL=$(jx get preview -o json|jq? -r ".items[].spec | select (.previewGitInfo.name==\\"$CHANGE_ID\\") | .previewGitInfo.applicationURL")

? ? ? cd crypto-pwa && npm install --unsafe-perm && npm run e2e-update

? ? ? Xvfb :99 &

? ? ? sleep 60s

? ? ? DISPLAY=:99 npm run e2e-test -- --baseUrl=$previewURL

? ? '''} }}

完成所有這些更改后唯咬,創(chuàng)建一個新分支,簽入你的更改畏浆,并在 GitHub 上創(chuàng)建一個 pull request胆胰。

git checkout -benable-e2e-testsgit add .git commit -m"Add stage for end-to-end tests"git push originenable-e2e-tests

我確實需要做一些額外的調(diào)整才能通過所有的 Protractor 測試:

在?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草娜。 第一次運行時測試可能會失敗,因為未為新預(yù)覽環(huán)境配置注銷重定向URI痒筒。更新 Okta 應(yīng)用程序的注銷重定向 URI 以匹配你的 PR 的預(yù)覽環(huán)境 URI,重新 pull request 測試茬贵,一切都應(yīng)該通過簿透!

你可以在?GitHub?上的此示例中找到已完成應(yīng)用程序的源代碼 。

了解有關(guān) Jenkins X解藻、Kubernetes 和 Spring Boot 的更多信息

要了解有關(guān) Spring Boot老充、Jenkins X 和 Kubernetes 的更多信息,請查看以下資源:

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 上運行生產(chǎn)應(yīng)用程序螟左,我建議你研究 Jenkins X.它提供了一種在相同環(huán)境中進行 CI/CD 的方法啡浊,快速迭代并為你的客戶更快地交付業(yè)務(wù)價值。

Jenkins X 還包括一個 DevPods 功能胶背,可以在筆記本電腦上進行開發(fā)時巷嚣,可以自動部署保存。我不確定 DevPods 是否適用于需要具有生產(chǎn)轉(zhuǎn)換步驟的 JavaScript 應(yīng)用程序钳吟。我寧愿讓 webpack 和 Browsersync 在幾秒鐘內(nèi)刷新我的本地瀏覽器廷粒,而不是等待幾分鐘創(chuàng)建并部署 Docker 鏡像到 Kubernetes。

要獲得 Jenkins X 的精彩概述和演示红且,請觀看?James Strachan?在2018年6月的?Virtual JUG?會議上為 Kubernetes 發(fā)布的?Jenkins X: Continuous Delivery坝茎。

如果你有任何疑問,請在下面添加評論暇番,在?Twitter?上發(fā)帖嗤放,或在我們的開發(fā)者論壇?上發(fā)帖提問。要獲得有關(guān)未來博客文章和開發(fā)人員智慧的通知壁酬,你可以在Twitter上關(guān)注我的整個團隊次酌。

使用 Jenkins X 和 Kubernetes 將 CI/CD 添加到 Spring Boot 應(yīng)用程序中恨课,最初于2018年7月11日發(fā)布到 Okta 開發(fā)人員博客。

譯者:史彥軍

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末和措,一起剝皮案震驚了整個濱河市庄呈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌派阱,老刑警劉巖诬留,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贫母,居然都是意外死亡文兑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門腺劣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绿贞,“玉大人,你說我怎么就攤上這事橘原〖” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵趾断,是天一觀的道長拒名。 經(jīng)常有香客問我,道長芋酌,這世上最難降的妖魔是什么增显? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮脐帝,結(jié)果婚禮上同云,老公的妹妹穿的比我還像新娘。我一直安慰自己堵腹,他們只是感情好炸站,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疚顷,像睡著了一般武契。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荡含,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天咒唆,我揣著相機與錄音,去河邊找鬼释液。 笑死全释,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的误债。 我是一名探鬼主播浸船,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妄迁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了李命?” 一聲冷哼從身側(cè)響起登淘,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎封字,沒想到半個月后黔州,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡阔籽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年流妻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笆制。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绅这,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出在辆,到底是詐尸還是另有隱情证薇,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布匆篓,位于F島的核電站浑度,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奕删。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一疗认、第九天 我趴在偏房一處隱蔽的房頂上張望完残。 院中可真熱鬧,春花似錦横漏、人聲如沸谨设。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扎拣。三九已至,卻和暖如春素跺,著一層夾襖步出監(jiān)牢的瞬間二蓝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工指厌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刊愚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓踩验,卻偏偏與公主長得像鸥诽,于是被迫代替她去往敵國和親商玫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容