在這篇文章中,我們將向您展示如何建立交付流水線並實現以下目標:
- 使用Web應用程式構建Docker映象
- 在Docker容器中執行該應用程式
- 從不同的容器中使用Maven執行Selenium測試
出於本文演示目的,我們將使用託管在GitHub上的Java示例專案: github.com/buddy-red/node-maven-selenium-tests進行演示。
流水線流程
每次更改儲存倉時,流水線將執行以下任務:
- 構建Web應用程式的Docker映象
- 執行3個Docker容器:
- 上一個操作中生成映象的容器
- Selenium伺服器容器
- 帶有將執行測試的Maven容器
- 根據測試,流水線將給出以下兩個結果:
- [測試透過] 推送映象至Docker註冊中心 & 執行映象於伺服器
- [測試失敗] 透過Slack給團隊傳送通知
流水線配置
首先,我們需要在GitHub原始碼儲存倉庫中對Buddy系統進行帳戶身份驗證:
接下來,我們新添一條流水線,並將其配置為在每次推送到主分支時自動執行:
操作
我們指定了流水線的目標分支和觸發條件,是時候新增將執行任務的操作了。
構建Docker映象
在操作列表中Docker部分找到如下圖的構建映象
定義Dockerfile和相關聯環境(如果它與包含Dockerfile的目錄不同)。在本例中是front
:
使用Maven配置Selenium測試
隨著Docker映象的構建和等待,我們需要一個操作來執行測試。在構建工具 & 任務執行部分找到Maven操作或者在搜尋框中直接搜尋Maven:
輸入將執行測試的命令,例如:mvn clean install
:
現在,我們需要在服務標籤頁中新增兩個微服務,這些本質上是附加並連結到主構建容器的Docker容器。
- 第一個應該是適用於您的瀏覽器型別的Selenium服務。在這個例子中,我們將使用Selenium Chrome:
- 現在,單擊+加號按鈕附加另一個,然後選擇Custom自定義服務。將其配置為使用我們在上一步中構建的Docker容器:
確保設定應用程式將在其上執行的埠(本例為
80
)。這樣在應用程式成功啟動之前,Maven不會啟動測試。
配置Selenium
配置後,該操作將執行3個相互連結的容器:Maven、Selenium和一個自定義容器。為使其工作,我們需要配置測試將連線到的Selenium伺服器以及將要執行的應用程式的地址。
在我們的應用程式中,分別在第23、30和第38行進行定義。主機名應映現在Maven操作服務中輸入的主機名:
package works.buddy.test;
import org.junit.Before;
import org.junit.After;
import org.junit.Test;
import org.junit.Ignore;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import static org.junit.Assert.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.concurrent.TimeUnit;
public class SeleniumTest {
private WebDriver driver;
@Before
public void setUp() throws MalformedURLException {
DesiredCapabilities capability = DesiredCapabilities.chrome();
driver = new RemoteWebDriver(new URL("http://selenium-ch:4444/wd/hub"), capability);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
}
@Test
public void test1() throws Exception {
driver.get("http://myapp.com");
assertEquals("大家好!", driver.getTitle());
}
//Error
@Ignore
@Test
public void test2() throws Exception {
driver.get("http://myapp.com");
assertEquals("Hello 木日夏復!", driver.getTitle());
}
@After
public void tearDown() {
driver.quit();
}
}
主機名
hostname
主機名等變數可以在流水線中定義為環境變數。如果變數在執行時未解析,則可以使用查詢 & 替換操作來交換其值。
推送Docker映象至註冊中心
如果所有測試都已成功透過,則可以將映象推送到Docker註冊中心:
Buddy與Docker Hub、Amazon ECR和Google GCR進行了原生整合。您還可以將映象推送到您自己的私有註冊中心:
您可以在我們的文件中找到有關構建和推送Docker映象的更多資訊!
釋出應用
映象儲存在登錄檔中並準備在伺服器上釋出。使用Buddy,您可以將其部署到Kubernetes、Amazon EKS 或Azure AKS叢集,或者您可以在自己的伺服器上執行docker-compose。
相關K8s的更多資訊,請檢視關於Kubernetes叢集上的容器編排指南。
傳送通知
讓您的團隊知道測試失敗,或者您的客戶知道新版本正在等待審批,這些是任何軟體開發業務的關鍵,基礎上是一個持續構建 - 測試-釋出運維。Buddy原生地與最流行的通知服務整合,包括Slack,Discord和Telegram:
可以新增兩個包含不同訊息的通知:一個在主要部分中表示已成功完成的操作,另一個在測試或部署失敗時傳送於失敗部分。這樣,您就可以隨時通知QA團隊,保持資訊與狀態暢通。