雲中的 Java:持續集成設置教程
已發表: 2022-03-11年復一年,我們見證了IT行業日益快速的發展。 自從開創性的口號“一次編寫,隨處運行”為軟件開發社區設定了一個全新的期望水平以來,已經過去了二十多年。 今天,我們擁有一組不斷擴展的工具,它們共同將 Java 開發,尤其是軟件開發,帶入了一個全新的可能性世界。
敏捷、DevOps 以及持續集成和部署等方法,以及微服務的發展,共同提高了軟件開發過程的生產力,使開發軟件比以往任何時候都更加愉快。 利用自動化和設置正確的工具集可以使軟件產品的開發和交付變得異常輕鬆。
本文將從 Java 開發人員的角度來看待這個新世界,他們跨入 DevOps 並蒐索以最大限度地優化產品開發和交付。
今天,諸如 Spring Boot、Docker、Cloud、Amazon Web Services、持續交付等術語被廣泛使用,但被人們所理解的卻很少。 本文將採用最簡單的方式來介紹所有這些技術並解釋這些術語,並以教程的形式進行總結,我們將在其中開發一個小軟件,並使用所有提到的工具為生產交付做好準備。
為什麼選擇這些工具?
使用 Docker 簡化部署
“一次編寫,隨處運行”是概念上的突破,它產生了 Java 虛擬機 (JVM) 等技術,使您的代碼可以在任何地方運行。 幾十年後,現在我們來到了這裡,一個名為 Docker 的東西被呈現給了 IT 社區。 Docker 是一個包含工具,您可以在其中放置軟件並輕鬆運行它,幾乎可以在您希望的任何地方。
然而,Java 開發人員可能會看著 Docker 並說“我們為什麼需要它,我們已經有了 JVM,它被公認為主要的可移植解決方案。” 但是是嗎?
“編寫一次,隨處運行”聽起來不錯,而且效果很好……至少在大多數情況下是這樣。 直到您遇到多個 JVM 供應商、多個 Java 版本、多個操作系統以及以上所有內容的各種排列和組合。 然後,您會發現自己從優雅的“一次編寫,隨處運行”範式切換到適得其反的“一次編寫,到處調試”的陷阱。
這就是 Docker 幫助挽救局面的地方。
Docker 簡化了軟件的開發、測試和交付。 如果你有想要測試的軟件,把它放在 Docker 容器中,它就會運行,並且為所有相關方安裝都沒有痛苦。
使用 Spring Boot 加速開發
在“隨處運行”口號推出後不到十年,Spring 框架就出現了。 今天,Spring 生態系統繼續蓬勃發展,並產生了許多有價值的基於 Spring 的項目,其中最著名的可能是 Spring Boot。 如 Spring Boot 網站所述:
Spring Boot 可以輕鬆創建可以運行的獨立的、生產級的基於 Spring 的應用程序。
Spring Boot 使您能夠在幾分鐘內啟動並運行應用程序。 軟件開發人員可以專注於軟件開發,然後可以從為他們完成所有配置的工具中受益。
在本教程中,我們將使用 Spring Boot 來開發我們的微服務。
與 Jenkins 的持續集成 (CI)
DevOps 是一項快速發展的運動,它緊密集成了軟件開發和系統管理團隊,其目標是使軟件開發和交付生命週期對所有相關方盡可能無痛、無縫和高效:開發人員、系統管理員、測試人員,最終, 終端用戶。
持續集成 (CI),是 DevOps 革命的基石之一。 這個想法是,每當開發人員將代碼提交到代碼存儲庫時,都會自動對其進行測試和打包以交付(部署)到生產環境。
CI 攜手並進:
- 持續交付——自動交付為最終用戶業務測試準備的包,手動觸發生產部署。
- 持續部署——將打包產品自動部署到生產環境。
存在許多可用於實施 CI 過程的工具。 其中最流行的是 Jenkins,一種開源 CI 工具。 Jenkins 擁有超過一千個插件和龐大的社區,在開始考慮實施持續集成、交付或部署時,它是一個簡單的選擇。
在我們的教程中,Jenkins 將用於將我們的產品交付到雲端,更具體地說,是 Amazon (AWS) 雲。
使用 AWS 進行雲計算
如果您有一些系統管理員經驗,想像一下從您的肩上消除系統管理的一些擔憂。 您有一些應用程序; 您知道他們需要多少資源,但您並不確切知道您需要的硬件規模。 您進行估算,購買資源,然後系統投入生產。 如果你幸運的話,你會發現你高估了並且擁有比你需要的更多的資源。 但根據墨菲定律,您更有可能發現自己低估了資源需求,並最終在巨大的時間壓力下爭先恐後地獲得更多內存或處理能力。 相比之下,如果您要部署到雲中,您只需將系統放在那裡並根據需要調整大小,並使用雲提供商提供的靈活性。 使用雲,您無需擔心系統資源不足,也無需擔心 90% 的內存或 CPU 處於空閒狀態。
當然,在決定選擇哪個供應商方面存在挑戰。 雲戰爭仍在進行中。 微軟、亞馬遜和谷歌為計算的未來而發生的衝突是你最近可以在科技世界新聞中找到的一個示例標題。 對於這個博客,我選擇了 Amazon Web Services (AWS),主要是基於它目前的受歡迎程度和市場份額。
AWS 的優勢之一是亞馬遜在您註冊後提供了許多服務:
在本教程中,我們將使用以下兩種 AWS 服務:Elastic Compute Cloud EC2(更具體地說,Amazon EC2 Container Registry,或 Amazon ECR)和 Amazon S3(簡單存儲服務)。
亞馬遜 ECR
我們需要將 Docker 鏡像存儲在某個地方。 Amazon ECR 是一項託管的 AWS Docker 註冊表服務。 如 Amazon ECR 網站所述:
…使開發人員可以輕鬆存儲、管理和部署 Docker 容器映像。 Amazon ECR 與 Amazon EC2 Container Service (ECS) 集成,簡化了從開發到生產的工作流程。 Amazon ECR 無需操作您自己的容器存儲庫或擔心擴展底層基礎設施。
亞馬遜 S3
如前所述,我們開發的應用程序將是一個將文件上傳到 Amazon S3 的 Spring Boot 微服務。 如 Amazon S3 網站所述:
…為開發人員和 IT 團隊提供安全、持久、高度可擴展的雲存儲。 Amazon S3 是易於使用的對象存儲,具有簡單的 Web 服務界面,可以從 Web 上的任何位置存儲和檢索任意數量的數據。
實用的“操作方法”教程
目標是準備部署一個將文件上傳到 Amazon S3 的 Spring Boot 微服務。 步驟如下:
- 開發微服務
- 定義服務將被 docker 化的構建過程
- 使用 Bitbucket 託管 Git 代碼存儲庫
- 將 Bitbucket 與 Jenkins 集成,使用 Gradle 打包應用程序
- 將其推送到遠程 Amazon ECR
以下是設置所有需要的組件的教程:
- Spring Boot 示例應用程序 - 使用 Gradle 打包和 dockerized 的微服務
- 在新的 Ubuntu 服務器上安裝 Jenkins
- Bitbucket 通過 webhook 與 Jenkins 集成
- 詹金斯作業配置
- Amazon ECR 用於存儲包含我們應用程序的 Docker 映像
先決條件
為了能夠使用AWS雲資源,我們需要先在亞馬遜註冊。 通過註冊,我們將獲得一個立即獲得免費套餐使用權益的帳戶,以便在註冊後的 12 個月內獲得動手體驗。
如前所述,在本教程中,我們將使用 Amazon S3 和 Amazon ECR。 對於兩者,我們都需要訪問密鑰來連接服務。
註冊 AWS 後,我們轉到我們的帳戶安全憑證,我們選擇訪問密鑰並單擊“創建新訪問密鑰”。 單擊後,將生成一個密鑰及其 ID。 您需要將其存儲在安全的地方,因為我們稍後將在配置 AWS Jenkins 集成和開發我們的 S3 文件上傳時使用它。
下一個先決條件是我們需要一個 Amazon S3 存儲桶(存儲容器)。 我們的 Spring Boot 服務將在 Amazon S3 存儲中上傳和下載文件。 存儲桶創建非常簡單,只需點擊幾下。 Create a Bucket 文檔中提供了有關如何執行此操作的完整說明。
我們還將使用 Bitbucket 託管我們的代碼並觸發對 Jenkins 的請求,因此還需要一個 Bitbucket 帳戶。 Bitbucket 是開發人員的絕佳選擇,它的主要好處之一是您可以創建無限數量的私有存儲庫。
應用程序開發
與其深入了解 Spring 註釋的所有細節以及它們的工作原理,不如從純粹的開發人員角度關注整個設置中更具挑戰性的部分; 即安裝和配置 Linux、Jenkins 和 CI 所需的其他工具。 本教程中使用的所有代碼示例,包括 Spring Boot 微服務應用程序,都可以在項目的 Bickbucket 存儲庫中找到。
我們的應用程序組合很簡單。 我們的StorageWebserviceApplication.java
文件中有一個 Spring Boot 應用程序入口點。 上傳和下載文件的邏輯在StorageService.java
中。 StorageController.java
是一個 Rest 控制器,包含用於文件上傳和下載的 API 端點。 這是項目層次結構:
我們選擇 Gradle 作為構建工具,它將打包我們的應用程序並組成 Docker 映像。 所以接下來,我們將討論 Gradle 構建文件、服務組件和 Dockerfile。
為了能夠使用 AWS API,我們需要在構建文件中包含依賴項,如使用 Gradle 的 AWS 文檔中所定義。
總結起來,我們 Gradle 腳本的 AWS 依賴配置部分如下所示:
buildscript { ... repositories { mavenCentral() } dependencies { ... classpath("io.spring.gradle:dependency-management-plugin:0.5.4.RELEASE") } } .. apply plugin: "io.spring.dependency-management" dependencyManagement { imports { mavenBom ('com.amazonaws:aws-java-sdk-bom:1.10.47') } } dependencies { .. compile ('com.amazonaws:aws-java-sdk-s3') }
如前所述,在將文件上傳到 Amazon S3 時,我們通過將文件上傳到 S3存儲桶來實現。
要連接到存儲桶,我們的 Amazon S3 客戶端需要提供憑證。 憑據是我們之前創建的訪問密鑰。 我們在application.properties
文件中定義訪問密鑰 ID 和值; 我們將存儲桶命名為toptal-s3-example
。
現在我們的主要服務組件如下:
@Service public class StorageService { @Value("${aws.accesKeyId}") private String awsAccessKeyId; @Value("${aws.secretKey}") private String awsSecretKey; @Value("${aws.bucketName}") private String awsBucketName; private AWSCredentials credentials; private AmazonS3 s3client;; @PostConstruct public void init(){ credentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretKey); s3client = new AmazonS3Client(credentials); } public void uploadFile(MultipartFile file) throws IOException { File fileForUpload = transformMultipartToFile(file); s3client.putObject(new PutObjectRequest(awsBucketName, file.getOriginalFilename(), fileForUpload)); } public InputStream downloadFile(String amazonFileKey) throws IOException { S3Object fetchFile = s3client.getObject(new GetObjectRequest(awsBucketName, amazonFileKey)); InputStream objectData = fetchFile.getObjectContent(); return objectData; } …
StorageService
從application.properties
文件中讀取憑證,並使用它們實例化BasicAWSCredentials
對象,隨後實例化AmazonS3Client
對象。 接下來是在 Amazon S3 客戶端對像上調用putObject
進行文件上傳和getObject
進行文件下載的簡單問題。
我們將在 Docker 容器中運行該服務,並且在 Gradle 構建過程中,我們將構建 Docker 映像。 我們將通過額外配置build.gradle
文件來做到這一點,如下所示:
buildscript { ... dependencies { ... classpath('se.transmode.gradle:gradle-docker:1.2') } } ..... apply plugin: 'docker' ... task buildDocker(type: Docker, dependsOn: build) { push = false applicationName = "storageservice" dockerfile = file('src/main/docker/Dockerfile') doFirst { copy { from jar into stageDir } } }
Buildscript
部分和apply plugin
非常標準。 我們還定義了一個buildDocker
任務,它讀取存儲在src/main/docker/Dockerfile
中的 Docker 配置,並將 JAR 文件複製到 Docker 構建中。
Dockerfile 包含一個純 Docker 命令列表,我們將使用這些命令準備我們的圖像:
FROM frolvlad/alpine-oraclejdk8 ADD storageWebService-0.0.1-SNAPSHOT.jar storageService.jar EXPOSE 8080 CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/storageService.jar"]
運行我們的應用程序的先決條件是安裝了 Java 虛擬機 (JVM)。 Docker 提供了一個安裝了 Java 的鏡像列表,我們將選擇最小的一個,基於最小的 5MB Alpine Linux。 frolvlad/alpine-oraclejdk8
映像擁有我們所需的一切,而且非常小(僅 170 MB)。
FROM
命令將提到的鏡像設置為我們自己構建的基礎。 我們將構建的 JAR 文件ADD
到名為storageService.jar
的容器文件系統中。 接下來,我們使用EXPOSE
命令定義 Docker 容器在運行時監聽8080
端口。 但是,這不會啟用從主機到8080
的通信。 鏡像完成後,我們要運行它,我們還需要使用以下命令在容器上發布端口docker run -p 8080:8080 amazonRepository/storageservice
,其中amazonRepository
是我們稍後將配置的存儲庫教程。 使用CMD
,我們定義在運行容器時將執行哪些命令。 CMD
命令括號中的值僅表示當我們運行容器時將執行以下操作:
java -Djava.security.egd=file:/dev/./urandom -jar /storageService.jar
需要選項-Djava.security.egd=file:/dev/./urandom
來幫助緩解啟動期間的 JVM 延遲。 如果省略,由於在啟動過程中需要一個隨機數生成過程,它會使應用程序啟動極其緩慢。
這總結了“應用程序開發”部分。 完成此操作後,我們在此處創建的服務將在稍後運行 Docker 容器時自動啟動。 因此,讓我們開始安裝和配置設置持續集成過程所需的其他工具。
應用程序和系統操作
首先,我們需要一個乾淨的 Linux 服務器來設置 Jenkins CI 工具。 請注意,以下說明專門針對 Ubuntu 14.04。 請記住,其他 Linux 發行版的說明可能略有不同。 使用的 Jenkins 版本是 2.7.1,屏幕和說明可能會根據使用的 Jenkins 版本略有不同。
因此,我們轉到我們的 Linux 服務器控制台並開始安裝先決條件。
JDK先決條件
我們需要安裝 JDK。 以下是安裝 JDK8 的說明。
sudo add-apt-repository ppa:webupd8team/java sudo apt-get install python-software-properties sudo apt-get update sudo apt-get install oracle-java8-installer java -version
安裝 Docker
為了讓 Jenkins 能夠觸發 Docker 構建,我們需要安裝docker-engine
,如下所示:
sudo apt-get install apt-transport-https ca-certificates sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D #create a docker list file sudo vi /etc/apt/sources.list.d/docker.list #add the following entry in the docker.list file (change trusty to #the release you are running on if you are running on different, ie. #xenial, precise...): deb https://apt.dockerproject.org/repo ubuntu-trusty main #save and exit the file sudo apt-get update apt-cache policy docker-engine sudo apt-get install docker-engine
由於我們現在已經安裝了 Docker 引擎,使用以下命令我們將啟動一個hello-world
Docker 映像以確認 Docker 正常工作。
sudo docker run hello-world
Hello-world
圖像輸出如下所示,我們可以確認引擎工作正常。

安裝 AWS 命令行界面 (CLI)
接下來,我們將安裝 AWS CLI。 稍後,在 Jenkins 作業配置中,我們將使用 CLI 執行 AWS 身份驗證和 Docker 映像推送到 Amazon EC2 容器註冊表的命令。
要安裝 AWS CLI,我們遵循 Amazon CLI 文檔中詳細描述的指南。
在這兩個安裝選項中,我們將選擇使用 Pip 進行安裝,這是一個用於安裝和管理 Python 程序的包管理系統。 我們只需運行以下三個命令即可安裝 Pip 和 AWS CLI:
#install Python version 2.7 if it was not already installed during the JDK #prerequisite installation sudo apt-get install python2.7 #install Pip package management for python sudo apt-get install python-pip #install AWS CLI sudo pip install awscli
AWS ECR
作為構建過程的最後一步,我們將把 Docker 鏡像推送到 Amazon 容器註冊表。 在 Amazon Web 服務控制台中,我們找到了 AWS EC2 容器服務。
我們選擇左側的Repositories子菜單,然後單擊Get started 。
然後我們會看到用於配置存儲庫的第一個屏幕,我們在其中輸入存儲庫名稱並單擊下一步按鈕。
單擊下一步,然後向我們顯示一個屏幕,其中包含有關如何將圖像推送到存儲庫的說明。
我們將看到一個如何構建 Docker 鏡像並將其推送到註冊表的示例,但我們現在不需要關心這個。 有了這個,我們創建了一個存儲庫。
安裝和配置 Jenkins
要安裝 Jenkins,我們在 shell 中輸入以下命令:
#Download Jenkins key and pipe it to apt-key tool, apt-key command #add will read from input stream, as defined by „–„. When added #apt will be able to authenticate package to be installed. wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - #create a sources list for jenkins sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' #update your local package list sudo apt-get update #install jenkins sudo apt-get install jenkins
安裝完成後,Jenkins 會自動啟動。 使用以下命令檢查服務狀態:
sudo service jenkins status
Jenkins 將連接到 Bitbucket Git 存儲庫,為此,我們需要安裝 Git。
#install Git sudo apt-get install git
Jenkins 將觸發 Gradle 構建過程,在此過程中將創建 Docker 映像。 為此,需要將 Jenkins 用戶添加到docker
用戶組:
#add Jenkins user to docker user group sudo usermod -aG docker jenkins
在構建過程中,Jenkins 會將 Docker 鏡像推送到 Amazon ECR。 要啟用此功能,我們需要為 Jenkins 用戶配置 AWS。
首先,我們需要切換到jenkins
用戶。 為此,我們需要設置密碼。
#change Jenkins password sudo passwd jenkins #switch to Jenkins user su – jenkins #configure AWS aws configure
輸入aws configure
命令後,我們開始輸入生成的秘密訪問密鑰和密鑰 ID(這些是我們在流程前面生成的憑證)。 就我而言,該帳戶的區域是us-west-2
,因此我輸入了該區域。 我們還將 AWS 命令的默認輸出格式設置為 JSON。
我們現在可以繼續通過可在端口 8080 上訪問的 Web 控制台配置 Jenkins。
當我們訪問 URL 時,我們會看到以下入門屏幕。
如屏幕上所述,我們需要輸入密碼。 完成此操作後,設置嚮導會提示我們執行以下操作:
- 選擇要安裝的插件 - 我們將選擇安裝建議的插件。
- 通過輸入用戶憑據創建第一個管理員用戶
完成後,單擊保存並完成。 至此,我們完成了 Jenkins 設置配置。
在我們開始定義構建作業之前,我們需要添加一些額外的插件。 我們將轉到Manage Jenkins並單擊Manage plugins 。 在Available選項卡中,我們首先找到Bitbucket plugin ,選中該框,然後單擊Download and install after restart 。
然後,您將看到類似於以下屏幕的內容。
插件安裝後,我們對設置作業所需的以下附加插件重複該過程:
- Gradle 插件
- Docker 構建步驟插件
- Cloudbees Docker 自定義構建環境插件
- 亞馬遜 ECR 插件
我們使用的 Docker 構建步驟插件將向 Docker 守護進程發送請求。 為此,我們需要在端口 2375 上啟用 TCP 套接字。為此,我們輸入位於etc/default/docker
docker 的 Docker 配置文件。
sudo vi /etc/default/docker
在這裡,我們在配置中添加以下行:
DOCKER_OPTS='-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock'
我們保存並退出文件並重新啟動 Docker 和 Jenkins 服務。
sudo service docker restart sudo service jenkins restart
Jenkins 重新啟動後,我們轉到 Jenkins 控制台,然後從Manage Jenkins中選擇Configure System 。
我們找到Docker builder部分並輸入http://localhost:2375
作為 REST API URL,單擊Apply確認更改。 然後我們單擊測試連接以希望確認一切正常。
我們保存配置並繼續進行 Jenkins 作業配置。
作業配置
我們進入 Jenkins 主頁並創建一個New Item 。
我們選擇一個Freestyle 項目並輸入項目名稱,如以下屏幕所示:
單擊OK ,我們將看到作業配置頁面。 我們希望在每次推送到我們的 Bitbucket Git 存儲庫時構建項目。 為此,我們首先需要定義我們要連接的存儲庫。
第 1 步:源代碼管理
在源代碼管理下,我們選擇 Git 並輸入我們的 Bitbucket 存儲庫的 URL。 URL 的格式為https://bitbucket.org/bitbucketUsername/repositoryName
。
我們輸入 URL 後,Jenkins 會自動嘗試測試連接。 由於我們還沒有輸入憑據,它會顯示一個錯誤,表明它無法連接。
打開下拉列表Add ,然後單擊Credentials Jenkins provider。
我們將看到以下屏幕,我們在其中輸入 Bitbucket 帳戶的用戶名和密碼。
添加新憑據記錄後,我們確保在憑據下拉列表中選擇它,這樣就完成了源代碼管理設置。
第 2 步:構建觸發器
檢查觸發器遠程構建並定義身份驗證令牌。 確保定義一個隨機且安全的令牌。
第 3 步:Bitbucket Webhook
Jenkins 已經為我們提供了我們將在 Bitbucket 上使用的 URL。 我們轉到我們的 Bitbucket 存儲庫頁面,然後在設置菜單中單擊Web hooks 。 隨後單擊Add webhook會出現以下屏幕,我們將其填寫如下:
URL 具有以下結構: http://JENKINS_URL _HOST:PORT/job/JOB_NAME/build?token=TOKEN
。
分別使用 Jenkins URL、運行它的端口、您創建的作業的名稱以及您之前定義的令牌輸入上面的值。
保存 Webhook 後,您將看到以下屏幕,您可以根據需要對其進行編輯,或者查看我們每次推送新代碼時生成的請求。
使用此配置,無論分支如何,都會在每次存儲庫推送時觸發 webhook。 在 Jenkins 方面,我們可以定義哪個分支推送將觸發構建。
為了讓 Bitbucket 能夠將代碼推送到 Jenkins,我們需要重新配置 Jenkins 全局安全性以允許匿名讀取訪問。 此外,對於我們的設置,我們必須禁用默認的 Jenkins 選項,以防止跨站點請求偽造。 為此,請轉到Manage Jenkins並選擇Configure global security 。 選中允許匿名讀取訪問並選中防止跨站點偽造攻擊。 然後保存配置。
請注意,這只是為了簡單起見。 完整設置超出了本教程的範圍,它將包括進一步保護 Jenkins 在反向代理後面、TLS 連接上以及啟用 CSRF 預防。
第 4 步:Gradle 構建
我們現在可以返回 Jenkins 作業並繼續配置它。 在構建部分,我們添加了一個構建步驟: Invoke gradle script 。
在此表格中,我們輸入以下內容:
如屏幕所示,我們將使用 Gradle 包裝器,這是一個方便的 Gradle 功能,不需要您在主機上安裝 Gradle。 確保選中Make gradlew executable框。
在任務中,我們指定build
和buildDocker
。
第 5 步:Docker 標記圖像
這部分構建標記了之前由 Gradle 的dockerBuild
任務準備的 Docker 映像。 為此,我們向作業添加了一個新的構建步驟:執行 Docker 命令。 我們選擇Tag image命令並設置圖像名稱、我們將在其中推送圖像的目標存儲庫和標記:
第 6 步:Docker 推送到 Amazon ECR
最後,我們需要定義如何將我們的圖像推送到 Amazon ECR。 為此,我們添加了一個新的Execute shell構建步驟並設置命令以向 AWS 進行身份驗證並將映像推送到 Amazon ECR:
#region for our account is us-west-2 aws ecr get-login --region us-west-2 | bash #push the previously tagged image docker push 058432294874.dkr.ecr.us-west-2.amazonaws.com/springbootdocker:${BUILD_NUMBER}
至此,我們完成了構建過程。 將新代碼推送到 repo 後,該作業將激活,我們將“自動”將新的 Docker 映像上傳到 Docker 註冊表。
然後可以將映像拉到我們安裝了docker-engine
的任何位置,並且可以使用以下命令運行:
docker run -p 8080:8080 amazonRepository/springbootdocker
此命令將啟動我們的 Spring Boot 微服務,並使用以下端點將我們的文件上傳和下載到 S3 存儲桶:
-
http://hostnameURL:8080/api/storage/upload
-
http://hostnameURL:8080/api/storage/download?fileName=xyz
Java 和持續集成的進一步步驟
總是有更多的事情要做。 本教程涵蓋了很多基礎知識,但我認為這只是進一步學習的起點。 將 Jenkins 置於 Web 代理服務器(如 Nginx)之後,並建立 TLS 連接,這只是可以而且可以說應該做更多事情的兩個例子。
我們的 Docker 映像在 Amazon ECR 上可用並準備好進行部署。 我們現在可以手動部署它。 但是,更好的解決方案是進一步自動化。 CI只是第一步,下一步就是持續交付。 高可用性怎麼樣? Amazon AWS EC2 提供了在集群環境中在雲中註冊容器的功能,這對於基於生產的服務是必需的。 可以在以下 AWS 博客文章中找到開發持續交付流程的一個很好的工作示例。
結論
總而言之,我們已經建立了一個流暢而乾淨的軟件開發流程。 利用可用的工具,我們創建了一個有助於最大限度提高生產力的基礎設施。 現在,我們不必擔心 Java 服務的配置,這是一個帶有 REST 端點的簡單 Web 服務。 我們讓 Spring Boot 約定處理一切,只關注服務邏輯。 每次我們將代碼推送到我們的 Bitbucket Git 存儲庫時,我們都會利用 Jenkins 構建一個新的 Docker 映像,最後,我們將雲設置為負責存儲我們的 Docker 映像和文件。 當我們部署包含在 Docker 映像中的服務時,我們將不受操作系統的任何限制(只要操作系統安裝了docker-engine
)。