0%

搞定測試管理!用 Docker Compose 輕鬆部署 TestLink

搞定測試管理!用 Docker Compose 輕鬆部署 TestLink (優缺點全解析)

在軟體開發流程中,測試管理是確保產品品質不可或缺的一環。一套好的測試管理工具能幫助團隊追蹤測試案例、執行進度、缺陷管理,並清晰地呈現測試報告。而 TestLink 作為一款開源的 Web-based 測試管理系統,因其免費和功能齊全的特性,受到許多團隊的青睞。

今天,我們就來聊聊如何透過 Docker Compose,快速、彈性地在您的環境中架設 TestLink,並深入探討 TestLink 的優點與潛在的挑戰。


為什麼選擇 Docker Compose 部署 TestLink?

傳統上部署像 TestLink 這樣的 LAMP (Linux, Apache, MySQL, PHP) 應用,需要手動安裝和配置多個組件,過程繁瑣且容易出錯。Docker Compose 完美解決了這個問題:

  • 環境隔離:每個服務(如資料庫、Web 伺服器)都在獨立的容器中運行,彼此不干擾。
  • 部署一致性:無論在哪台機器上,只要有 Docker 環境,就能透過相同的 docker-compose.yml 文件快速複製部署。
  • 版本控制:將部署配置寫入文件,便於版本管理和團隊協作。
  • 簡化管理:透過一個命令就能啟動、停止、重建所有服務。

作為一款老牌的開源測試管理工具,TestLink 有其獨到的優勢:

  1. 開源免費:這是最大的吸引力!對於預算有限的團隊或個人專案,TestLink 提供了企業級的測試管理功能,無需任何授權費用。
  2. 功能全面
    • 測試專案管理:可以建立和管理多個測試專案。
    • **需求追溯 (Requirements Traceability)**:將測試案例與需求關聯,確保所有需求都被充分測試。
    • 測試案例管理:支援詳細的測試案例撰寫,包括預置條件、步驟、預期結果等。
    • 測試計畫與執行:建立測試計畫,分配測試任務給團隊成員,並記錄測試執行結果。
    • 缺陷管理集成:能與 Jira, Bugzilla 等主流缺陷管理工具集成,形成測試-缺陷閉環。
    • 測試報告生成:提供多種圖表和報告,清晰展示測試進度與品質狀況。
  3. 成熟穩定:經過多年的發展和社區支持,TestLink 的核心功能相對穩定可靠。
  4. 社區支援:雖然近年來新的雲端工具層出不窮,TestLink 依然有其活躍的用戶社區,遇到問題時可以尋求幫助。

當然,沒有一個工具是完美的,TestLink 也有其不足之處:

  1. 使用者介面老舊:相較於現代化的 SaaS 測試管理工具,TestLink 的介面顯得有些過時,不夠直觀和美觀,學習曲線可能較陡峭。
  2. 操作體驗不夠流暢:某些操作可能需要較多的點擊,批量操作能力有時也顯得不足,在處理大量測試案例時效率可能較低。
  3. 集成能力有限:雖然能與一些缺陷管理工具集成,但與 CI/CD 工具鏈、自動化測試框架等其他 DevTestOps 工具的深度集成能力,可能不如某些商業工具靈活和豐富。
  4. 功能更新迭代較慢:作為開源專案,其功能更新和問題修復的速度可能不如商業產品那麼快。
  5. 自行維護成本:儘管工具本身免費,但部署、配置、升級、備份和故障排除等都需要團隊投入時間和人力進行維護。
  6. 擴展性與負載能力:在超大規模測試專案或高併發場景下,其性能和擴展性可能需要額外的優化和調整。

使用 Docker Compose 部署 TestLink:優化與配置

根據您提供的 docker run 指令,我為您改寫並優化了一個 docker-compose.yml 文件。這個文件將包含兩個核心服務:資料庫 (MySQL/MariaDB)TestLink 應用本身

為了提供更穩定和官方支援的環境,我會做以下優化:

  • 資料庫映像檔:使用官方的 mariadb 映像檔,它通常更受推薦,並且有詳細的文檔支援。
  • TestLink 映像檔:使用 bitnami/testlinktestlink/testlink 這類維護較好的第三方或半官方映像檔,它們通常已經包含了 Apache/Nginx 和 PHP 環境,並針對 TestLink 做了預配置,大大簡化部署。
  • 環境變數:統一在 docker-compose.yml 中管理。
  • 時區設置:資料庫和應用服務都統一設置,避免時間戳問題。
  • 網路設定:利用 Docker Compose 的預設網路讓服務間互相通訊。
  • Jenkins 移除:原始要求是部署 TestLink,您的 docker run 包含了 Jenkins。這裡我會專注於 TestLink 相關服務。若需 Jenkins,可另外建立服務。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
version: '3.8' # 推薦使用較新的版本,提供更多功能和穩定性

services:
# --- 資料庫服務 ---
db:
image: mariadb:10.6 # 使用官方維護的 MariaDB 映像檔,10.6 版本相對穩定
container_name: testlink_db # 指定容器名稱,方便識別
restart: always # 容器退出後自動重啟
ports:
- "3306:3306" # 將容器內3306端口映射到主機3306端口
environment:
MYSQL_ROOT_PASSWORD: your_root_password # 設置資料庫 root 使用者密碼,請務必修改!
MYSQL_DATABASE: testlink_db # TestLink 將使用的資料庫名稱
MYSQL_USER: testlink_user # TestLink 將使用的資料庫使用者名稱
MYSQL_PASSWORD: your_testlink_password # TestLink 資料庫使用者的密碼,請務必修改!
TZ: Asia/Taipei # 設置容器時區為台北
volumes:
# 持久化資料庫數據,防止容器移除後數據丟失
- ./data/mysql:/var/lib/mysql
# 可選:掛載自定義的 MySQL 配置檔案 (如果需要進階配置)
# - ./config/mysql:/etc/mysql/conf.d
healthcheck: # 健康檢查,確保資料庫服務啟動並可連接
test: ["CMD", "mariadb", "-u", "testlink_user", "-p${MYSQL_PASSWORD}", "-e", "SELECT 1;"]
interval: 10s
timeout: 5s
retries: 5

# --- TestLink 應用服務 ---
testlink:
image: bitnami/testlink:latest # 推薦使用 Bitnami 的 TestLink 映像檔,包含完整的 LAMP 環境且配置較好
# 或者考慮 testlink/testlink:latest 如果您更喜歡社區維護的版本
container_name: testlink_app
restart: always
ports:
- "80:80" # 將容器內80端口映射到主機80端口,用於Web訪問
# - "443:443" # 如果需要HTTPS,可以開啟這個端口映射,並在Nginx/Apache配置中設定SSL
environment:
# 將應用程式連接到我們上面定義的資料庫
MARIADB_HOST: db # 資料庫服務的名稱,在 Docker Compose 網路中可直接解析
MARIADB_PORT: 3306
TESTLINK_DATABASE_NAME: testlink_db
TESTLINK_DATABASE_USER: testlink_user
TESTLINK_DATABASE_PASSWORD: your_testlink_password
# TestLink 管理員帳號和密碼 (首次啟動會自動建立)
TESTLINK_USERNAME: admin
TESTLINK_PASSWORD: your_admin_password # 請務必修改!
TESTLINK_SMTP_HOST: smtp.your_mail_server.com # 如果需要郵件通知,請填寫SMTP服務器
TESTLINK_SMTP_PORT: 587
TESTLINK_SMTP_USER: your_email@example.com
TESTLINK_SMTP_PASSWORD: your_email_password
TESTLINK_SMTP_PROTOCOL: tls # 或 ssl
TZ: Asia/Taipei # 設置容器時區為台北,確保日誌和時間戳正確
volumes:
# 持久化 TestLink 的上傳文件、插件等數據
- ./data/testlink_data:/bitnami/testlink
# 如果你希望自定義 Apache 或 PHP 配置,可以掛載相應的目錄
# - ./config/testlink:/opt/bitnami/testlink/conf/
depends_on:
db:
condition: service_healthy # 確保 db 服務完全健康後才啟動 testlink
healthcheck: # 應用層健康檢查,確認TestLink網站可訪問
test: ["CMD", "curl", "-f", "http://localhost/login.php"]
interval: 30s
timeout: 10s
retries: 5

# --- 網路配置 (可選,預設已自動創建) ---
# networks:
# default:
# driver: bridge

使用說明:

  1. 儲存文件:將上述內容儲存為 docker-compose.yml 在您伺服器的一個目錄中,例如 /opt/testlink_deployment/
  2. 創建數據目錄:在 docker-compose.yml 所在的目錄下創建 data 子目錄:
    1
    mkdir -p data/mysql data/testlink_data
  3. 修改密碼和郵件配置:非常重要! 請將 your_root_passwordyour_testlink_passwordyour_admin_password 和郵件相關的配置修改為您自己的安全密碼和實際郵件服務器資訊。
  4. 啟動服務:在 docker-compose.yml 所在的目錄下運行:
    1
    docker compose up -d
    (docker-compose 舊版命令可能為 docker-compose up -d)
  5. 訪問 TestLink:服務啟動後,您就可以在瀏覽器中訪問 http://您的伺服器IP 來使用 TestLink 了!首次訪問可能需要幾分鐘初始化。
  6. 停止服務:
    1
    docker compose down
  7. 查看日誌:
    1
    docker compose logs -f

    優化解釋:

  8. version: '3.8‘: 使用較新的 Docker Compose 文件格式版本,支援更多功能。
  9. db: image: mariadb:10.6:
  • 選擇 MariaDB 作為 MySQL 的開源替代品,它與 MySQL 高度兼容,且通常被認為更活躍和穩定。
  • 指定版本 10.6 而非 latest,避免未來版本更新可能帶來的不兼容問題。
  1. MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD: 這些環境變數是 MariaDB 官方映像檔標準的設定方式,方便初始化資料庫和用戶。
  2. TZ: Asia/Taipei: 在所有服務中明確設置時區為「亞洲/台北」,這能確保資料庫和應用程式的時間戳一致,避免因時區差異導致的數據混亂。
  3. volumes: ./data/mysql:/var/lib/mysql: 將資料庫數據持久化到主機的相對路徑 data/mysql 中,這樣即使容器被刪除,數據也不會丟失。
  4. db.healthcheck: 為資料庫服務添加健康檢查。TestLink 會依賴資料庫,確保資料庫真正準備好接收連接,而不是僅僅啟動。
  5. testlink: image: bitnami/testlink:latest:
  • 推薦使用 Bitnami 提供的 TestLink 映像檔。Bitnami 專門為開源應用程式打包 Docker 映像檔,它們通常包含預配置的 Web 伺服器 (Apache/Nginx)、PHP 環境,並處理了應用程式與資料庫的連接,極大地簡化了部署和維護。
  • latest 可以使用最新版本,但生產環境中建議指定具體版本以保持穩定性。
  1. MARIADB_HOST: db: 在 Docker Compose 的預設網路中,您可以直接使用服務名稱 (db) 作為資料庫主機名,而不需要 IP 位址。這是 Docker Compose 內建的 DNS 解析功能。
  2. depends_on: db: condition: service_healthy: 這是一個非常重要的優化。它告訴 Docker Compose,只有當 db 服務的健康檢查通過並處於 healthy 狀態時,testlink 服務才會開始啟動。這避免了 testlink 嘗試連接一個尚未完全準備好的資料庫而導致啟動失敗。
  3. testlink.healthcheck: 為 TestLink 應用添加健康檢查,確認網站首頁可以正常訪問,確保應用服務正常運行。

這個 docker-compose.yml 檔案將提供一個更穩定、更易於管理且具有更好可維護性的 TestLink 部署方案。您可以根據團隊的具體需求進一步調整其中的配置。

using .env file

將 Docker Compose 的環境變數從 docker-compose.yml 檔案中獨立出來,放到 .env 文件裡是一個極佳的最佳實踐!這能大幅提高安全性和靈活性,避免將敏感資訊(如密碼)直接寫死在版本控制的檔案中。

為什麼要使用 .env 檔案?

  1. 安全性:將密碼等敏感資訊從 docker-compose.yml 中分離,可以避免將其提交到版本控制系統(如 Git),降低資訊洩露的風險。
  2. 靈活性:您可以針對不同的環境(開發、測試、生產)輕鬆修改 .env 檔案中的變數,而無需改動核心的 docker-compose.yml 文件。
  3. 清晰度:讓 docker-compose.yml 專注於服務的結構和配置,而 .env 專注於環境特定的值。

如何使用 .env 檔案改寫 Docker Compose 配置

首先,我們要創建兩個文件:

  1. .env 檔案:存放所有環境變數。
  2. docker-compose.yml 檔案:引用 .env 檔案中的變數。

步驟 1:創建 .env 檔案

在您 docker-compose.yml 檔案所在的目錄下,創建一個名為 .env 的新文件(注意開頭的點號)。

.env 檔案內容範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# --- 資料庫配置 ---
MYSQL_ROOT_PASSWORD=your_root_password_securely_set # 資料庫 root 密碼
MYSQL_DATABASE=testlink_db
MYSQL_USER=testlink_user
MYSQL_PASSWORD=your_testlink_password_securely_set # TestLink 連接資料庫的密碼

# --- TestLink 應用配置 ---
TESTLINK_ADMIN_USERNAME=admin
TESTLINK_ADMIN_PASSWORD=your_admin_password_securely_set # TestLink 管理員密碼

# --- 時區配置 ---
TZ=Asia/Taipei

# --- SMTP 郵件配置 (可選) ---
TESTLINK_SMTP_HOST=smtp.your_mail_server.com
TESTLINK_SMTP_PORT=587
TESTLINK_SMTP_USER=your_email@example.com
TESTLINK_SMTP_PASSWORD=your_email_password_securely_set
TESTLINK_SMTP_PROTOCOL=tls

重要提示:

  • 請務必將所有 your_..._securely_set 的值替換為您自己的強密碼和實際資訊!
  • .env 檔案中的變數命名通常使用大寫字母,並且沒有引號,除非值中包含空格或其他特殊字符。

步驟 2:修改 docker-compose.yml 檔案

現在,我們需要修改 docker-compose.yml 文件,讓它引用 .env 檔案中的變數。在 Docker Compose 中,你可以使用 ${VAR_NAME} 的語法來引用環境變數。

docker-compose.yml 檔案內容範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
version: '3.8'

services:
# --- 資料庫服務 ---
db:
image: mariadb:10.6
container_name: testlink_db
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 從 .env 讀取
MYSQL_DATABASE: ${MYSQL_DATABASE} # 從 .env 讀取
MYSQL_USER: ${MYSQL_USER} # 從 .env 讀取
MYSQL_PASSWORD: ${MYSQL_PASSWORD} # 從 .env 讀取
TZ: ${TZ} # 從 .env 讀取
volumes:
- ./data/mysql:/var/lib/mysql
healthcheck:
test: ["CMD", "mariadb", "-u", "${MYSQL_USER}", "-p${MYSQL_PASSWORD}", "-e", "SELECT 1;"]
interval: 10s
timeout: 5s
retries: 5

# --- TestLink 應用服務 ---
testlink:
image: bitnami/testlink:latest
container_name: testlink_app
restart: always
ports:
- "80:80"
# - "443:443"
environment:
MARIADB_HOST: db
MARIADB_PORT: 3306
TESTLINK_DATABASE_NAME: ${MYSQL_DATABASE} # 從 .env 讀取
TESTLINK_DATABASE_USER: ${MYSQL_USER} # 從 .env 讀取
TESTLINK_DATABASE_PASSWORD: ${MYSQL_PASSWORD} # 從 .env 讀取
TESTLINK_USERNAME: ${TESTLINK_ADMIN_USERNAME} # 從 .env 讀取
TESTLINK_PASSWORD: ${TESTLINK_ADMIN_PASSWORD} # 從 .env 讀取
TESTLINK_SMTP_HOST: ${TESTLINK_SMTP_HOST}
TESTLINK_SMTP_PORT: ${TESTLINK_SMTP_PORT}
TESTLINK_SMTP_USER: ${TESTLINK_SMTP_USER}
TESTLINK_SMTP_PASSWORD: ${TESTLINK_SMTP_PASSWORD}
TESTLINK_SMTP_PROTOCOL: ${TESTLINK_SMTP_PROTOCOL}
TZ: ${TZ} # 從 .env 讀取
volumes:
- ./data/testlink_data:/bitnami/testlink
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/login.php"]
interval: 30s
timeout: 10s
retries: 5

步驟 3:啟動服務

當您在 docker-compose.yml 所在的目錄下運行 docker compose up -d 時,Docker Compose 會自動尋找並載入該目錄下的 .env 檔案,並將其中的變數應用到您的配置中。

1
2
cd /path/to/your/testlink_deployment/ # 進入包含 docker-compose.yml 和 .env 的目錄
docker compose up -d

.env 檔案的最佳實踐與注意事項

  • 添加到 .gitignore:如果您使用 Git 進行版本控制,務必將 .env 檔案添加到 .gitignore 中,防止敏感資訊被推送到遠端倉庫:
1
2
# .gitignore
.env
  • 安全儲存:即使不提交到 Git,也要確保 .env 檔案本身存儲在安全的位置,並且只有授權用戶才能訪問。
  • 命名慣例:.env 檔案中的變數通常以大寫字母命名,並使用下劃線分隔單詞。
  • 環境變數優先級:
  1. Shell 環境變數(如果您在命令行中設置了與 .env 中相同的變數,Shell 的會優先)。
  2. .env 檔案中的變數。
  3. docker-compose.yml 檔案中直接 environment 下定義的變數。 因此,如果你在系統環境變數中定義了 MYSQL_ROOT_PASSWORD ,它會覆蓋 .envdocker-compose.yml 中的定義。
  • 替代的敏感資料管理:對於生產環境,更高級的敏感資料管理方法包括:
    • Docker Secrets:適用於 Docker Swarm 模式。
    • Kubernetes Secrets:適用於 Kubernetes 集群。
    • 環境變數注入工具:如 HashiCorp Vault、AWS Secrets Manager 等。 .env 檔案雖然方便,但其安全級別不如上述專用 Secrets 管理工具高,通常更適合開發、測試或個人小型部署。

透過將環境變數外部化到 .env 檔案中,您的 Docker Compose 部署將變得更加安全、靈活和易於管理!