本文首發(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 使你能夠:
存儲關(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ā)人員博客。
譯者:史彥軍