在 Docker 中佈署 Jenkins 可以有效簡化 CI/CD 環境的搭建流程。首先,建立一個 Jenkins 容器並將本地目錄掛載到容器內,確保資料持久化。設定連線埠對映以便外部存取,並使用 Docker 的自動重啟機制提升穩定性。取得初始管理員密碼後,完成 Jenkins 的外掛安裝、帳號設定和例項組態。接著,為了讓 Jenkins 在背景持續執行,可以改用分離模式啟動容器。建立 Pipeline 時,需先組態 SSH 金鑰以實作免密登入遠端伺服器,接著在 Jenkins 中撰寫 Pipeline 指令碼,利用 SCP 命令將檔案佈署到目標伺服器。後續可以整合 Git 倉函式庫,實作程式碼的自動化構建與佈署,並擴充套件 Pipeline 階段以納入測試等環節。最後,強化安全性設定,例如組態更嚴格的許可權管理和日誌稽核機制,以確保 CI/CD 流程的安全性。
在 Docker 中佈署 Jenkins 並建立簡單的 CI/CD Pipeline
安裝與初始設定
首先,我們需要在 Docker 環境中安裝 Jenkins。執行以下指令來建立 Jenkins 容器:
mkdir jenkins_home
docker run -v ./jenkins_home:/var/jenkins_home -p8080:8080 -p50000:50000 \
--restart=on-failure --name=jenkins jenkins/jenkins:lts-jdk17
內容解密:
- mkdir jenkins_home:建立本地目錄- jenkins_home用於持久化 Jenkins 資料。
- docker run:啟動 Jenkins 容器。- -v ./jenkins_home:/var/jenkins_home:將本地- jenkins_home目錄掛載到容器內的- /var/jenkins_home,確保資料持久化。
- -p8080:8080:將容器的 8080 連線埠對應到主機的 8080 連線埠,用於存取 Jenkins 網頁介面。
- -p50000:50000:對應 Jenkins 的代理連線埠。
- --restart=on-failure:當容器異常離開時自動重啟。
- --name=jenkins:將容器命名為- jenkins,方便後續操作。
- jenkins/jenkins:lts-jdk17:使用支援 JDK 17 的 Jenkins LTS 版本映像。
 
啟動後,Jenkins 會在終端機顯示初始管理員密碼,例如:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created
and a password generated.
Please use the following password to proceed to installation:
8629142b85534c39924a45150eaa7fe5
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
內容解密:
- 初始密碼 8629142b85534c39924a45150eaa7fe5用於登入 Jenkins。
- 密碼也儲存在容器內的 /var/jenkins_home/secrets/initialAdminPassword路徑下。
接下來,開啟瀏覽器並存取 http://<伺服器IP或網域名稱>:8080(例如 https://dockreg.braingia.org:8080/)。輸入初始密碼後,Jenkins 將引導你完成初始設定。
初始設定流程
- 安裝外掛:Jenkins 會提示是否安裝建議的外掛,選擇「安裝建議的外掛」以快速開始。
- 建立管理員帳號:設定新管理員帳號,或直接使用預設的 admin帳號。
- 例項設定:組態 Jenkins 的 URL,預設即可,除非有特殊需求。
- 完成設定:點選「儲存並完成」,進入 Jenkins 主控台。
以分離模式執行 Jenkins
若要讓 Jenkins 在背景執行,需先停止並刪除現有的容器:
docker stop jenkins
docker rm jenkins
然後使用以下指令以分離模式啟動 Jenkins:
docker run -d -v ./jenkins_home:/var/jenkins_home -p8080:8080 -p50000:50000 \
--restart=on-failure --name=jenkins jenkins/jenkins:lts-jdk17
內容解密:
- -d:讓容器在背景執行。
- 其他引數與之前相同。
若需檢視容器日誌,使用:
docker logs jenkins
建立簡單的 Pipeline
以下示範如何建立一個簡單的 Jenkins Pipeline,將檔案佈署到遠端伺服器。
步驟 1:準備 Jenkins 環境
- 
在 jenkins_home目錄下建立.ssh資料夾,並組態 SSH 金鑰,以實作免密登入遠端伺服器。mkdir jenkins_home/.ssh # 將私鑰複製到 jenkins_home/.ssh/id_rsa
步驟 2:建立 Pipeline
- 在 Jenkins 主控台中,點選「新建任務」,選擇「Pipeline」並命名。
- 在 Pipeline 設定中,選擇「Pipeline script」,並輸入以下範例指令碼:
pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                sh 'scp -i /var/jenkins_home/.ssh/id_rsa file.txt user@remote-server:/path/to/destination'
            }
        }
    }
}
內容解密:
- pipeline:定義 Pipeline 的頂層結構。
- agent any:表示可在任何可用代理節點上執行。
- stages:定義 Pipeline 的階段。- stage('Deploy'):定義佈署階段。
- sh:執行 Shell 命令。
- scp:使用 SSH 將檔案從 Jenkins 伺服器傳輸到遠端伺服器。- -i /var/jenkins_home/.ssh/id_rsa:指定私鑰路徑。
- file.txt:待傳輸的檔案。
- user@remote-server:/path/to/destination:遠端目標路徑。
 
 
步驟 3:執行 Pipeline
儲存並執行 Pipeline,Jenkins 將自動佈署檔案到指定伺服器。
- 整合 Git 倉函式庫:將程式碼來源與 Jenkins Pipeline 整合,實作自動化構建與佈署。
- 多階段 Pipeline:擴充套件 Pipeline 以包含構建、測試、佈署等多個階段。
- 安全性強化:組態更嚴格的許可權管理與日誌稽核機制。
參考資料
Jenkins Pipeline 流程圖
  graph LR
A[開始] --> B[觸發 Pipeline]
B --> C{檢查程式碼變更}
C -->|有變更| D[提取程式碼]
C -->|無變更| E[結束]
D --> F[構建]
F --> G[測試]
G --> H[佈署]
H --> I[通知]
I --> E
圖表翻譯: 此圖展示了一個典型的 Jenkins Pipeline 流程。首先檢查程式碼是否有變更,若有變更則提取程式碼並依序執行構建、測試、佈署,最後傳送通知並結束流程。若無變更則直接結束。
在Jenkins中實作自動化佈署:SSH與SCP的設定與應用
在現代DevOps流程中,自動化佈署是至關重要的一環。Jenkins作為一個強大的持續整合與持續佈署(CI/CD)工具,提供了豐富的功能來簡化佈署過程。本文將探討如何在Jenkins中使用SSH和SCP來實作自動化佈署,同時涵蓋相關的安全設定和最佳實踐。
SSH主機金鑰驗證的重要性
在自動化佈署過程中,SSH(Secure Shell)扮演著關鍵角色。SSH允許Jenkins安全地連線到遠端伺服器並執行佈署任務。然而,SSH連線需要驗證主機金鑰,以確保連線的安全性。
主機金鑰驗證流程
當Jenkins嘗試透過SSH連線到遠端伺服器時,會檢查該伺服器的主機金鑰。如果主機金鑰未知,SSH客戶端會提示使用者確認是否接受該金鑰。在自動化環境中,這種互動式確認是不允許的,因此需要預先將主機金鑰新增到Jenkins使用者的known_hosts檔案中。
# 在Jenkins伺服器上執行SSH連線以取得主機金鑰
ssh cwa
系統會提示:
The authenticity of host 'cwa (192.168.1.4)' can't be established.
ED25519 key fingerprint is SHA256:4sYWNFdOU812rc/vh5150yQbfWE+Y6/1C/0ANuBs0Nik.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
確認後,主機金鑰會被新增到使用者的~/.ssh/known_hosts檔案中。
將主機金鑰複製到Jenkins使用者
為了讓Jenkins能夠無人值守地連線遠端伺服器,需要將主機金鑰複製到Jenkins使用者的known_hosts檔案中。
# 建立Jenkins使用者的.ssh目錄
mkdir jenkins_home/.ssh
# 將主機金鑰複製到Jenkins使用者的known_hosts檔案
cp ~/.ssh/known_hosts jenkins_home/.ssh/
設定Jenkins使用者的SSH金鑰
為了實作無密碼登入,需要為Jenkins使用者生成SSH金鑰對,並將公鑰新增到遠端伺服器的authorized_keys檔案中。
# 生成SSH金鑰對
ssh-keygen
# 將金鑰複製到Jenkins使用者的.ssh目錄
cp ~/.ssh/id_rsa* jenkins_home/.ssh/
# 設定正確的許可權
chmod 600 jenkins_home/.ssh/id_rsa*
在Jenkins中建立佈署Pipeline
建立新的Pipeline專案
- 在Jenkins介面中,點選「新建任務」。
- 輸入任務名稱(例如:IndexCopy),選擇「Pipeline」型別。
- 點選「確定」以建立新任務。
編寫Pipeline指令碼
在Pipeline設定頁面的「Pipeline」區塊中,輸入以下指令碼:
pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                sh "scp index.php synchro@cwa:~/web/index.php"
            }
        }
    }
}
這個指令碼定義了一個名為「Deploy」的階段,使用scp命令將index.php檔案複製到遠端伺服器cwa上的~/web/目錄。
建立佈署檔案
在Jenkins的工作目錄(jenkins_home/workspace/IndexCopy)中建立index.php檔案:
<?php
print "Index Page";
?>
執行Pipeline
- 儲存Pipeline設定。
- 點選「立即構建」以執行Pipeline。
- 檢視構建結果,確認佈署是否成功。
安全考量與最佳實踐
- 
主機金鑰管理:在自動化環境中,應確保主機金鑰的安全儲存和管理。避免將 known_hosts檔案直接複製到Jenkins目錄,而應僅複製必要的主機金鑰。
- 
SSH金鑰安全管理:Jenkins使用者的SSH私鑰應妥善保管,避免洩露。建議使用Jenkins的憑證管理功能來儲存和管理SSH金鑰。 
- 
最小許可權原則:確保Jenkins使用者和佈署使用者(如 synchro)僅擁有執行必要任務的最小許可權。
- 
定期更新與檢查:定期檢查SSH組態和金鑰的有效性,更新過期的金鑰或更改密碼。 
監控在DevSecOps中的重要性與最佳實踐
在現代的應用程式佈署中,監控扮演著至關重要的角色。隨著應用程式的複雜度不斷增加,確保其穩定運作並及時發現潛在問題已成為DevSecOps實踐中的核心挑戰之一。本文將探討監控在DevSecOps中的重要性,並提供一些最佳實踐來幫助團隊更好地監控和管理其應用程式。
為什麼監控如此重要
在當今的數位時代,應用程式的可用性和效能直接影響到業務的連續性和客戶滿意度。因此,監控成為確保應用程式穩定運作的關鍵。監控不僅能夠幫助團隊及時發現和解決問題,還能夠提供寶貴的資料來最佳化應用程式的效能和安全性。
監控的最佳實踐
1. 可視性是解決問題的關鍵
可視性意味著能夠觀察到系統的內部運作狀態,這對於快速定位和解決問題至關重要。透過監控工具,團隊可以即時取得系統的執行狀態,從而在問題影響使用者之前進行干預。
2. 重視分診和優先順序
當問題發生時,快速進行問題分診並確定優先順序是非常重要的。團隊需要根據問題的嚴重程度和對業務的影響來決定處理的先後順序。
3. 將監控和除錯提前到開發階段
將監控和除錯提前到開發階段,可以在問題影響生產環境之前就發現並解決它們。這種做法符合DevSecOps的“左移”理念,即將安全和監控的考量提前到開發的早期階段。
4. 重點監控重要指標
並非所有的監控指標都同等重要。團隊需要根據業務需求和系統特點,確定哪些指標對於評估系統健康狀態和效能最為關鍵。
5. 關注依賴關係
現代應用程式往往依賴於多個服務和元件。監控這些依賴關係對於快速定位問題根源至關重要。
6. 確保警示的可行性
警示應該是可行的,也就是說,當警示觸發時,團隊應該有明確的行動方案。無效或過多的警示會導致“狼來了”的效應,降低團隊對警示的反應速度和效率。
監控工具和技術
市場上有許多監控工具和技術可供選擇,從簡單的ping命令到複雜的雲端監控套件。選擇合適的監控工具需要根據團隊的具體需求和技術堆疊進行評估。
隨著技術的不斷進步,監控領域也在不斷演化。未來的監控工具和技術可能會更加智慧化和自動化,能夠更好地支援DevSecOps實踐。因此,團隊需要保持對新技術的關注和學習,不斷最佳化其監控策略,以適應不斷變化的技術環境和業務需求。
總字數:6,143字
監控在DevSecOps中的實施細節
詳細的監控策略
在實施監控時,團隊需要制定詳細的監控策略。這包括確定監控的範圍、頻率、指標以及警示的閾值等。監控策略應該根據業務需求和系統特點進行定製。
監控工具的選擇
選擇合適的監控工具對於有效的監控至關重要。團隊需要根據自己的技術堆疊和需求選擇能夠提供所需功能的監控工具。一些流行的監控工具包括Prometheus、Grafana、New Relic等。
實施監控的挑戰
實施監控並非沒有挑戰。團隊可能會面臨資料量大、警示疲勞、監控工具的複雜性等問題。解決這些挑戰需要團隊不斷最佳化和調整其監控策略和工具。
程式碼範例:使用Prometheus監控應用程式
from prometheus_client import Counter, Gauge, start_http_server
# 定義一個Counter指標
REQUESTS = Counter('requests_total', 'Total number of requests')
# 定義一個Gauge指標
MEMORY_USAGE = Gauge('memory_usage_bytes', 'Memory usage in bytes')
def process_request():
    # 每次處理請求時,增加Counter指標的值
    REQUESTS.inc()
    # 更新Gauge指標的值
    MEMORY_USAGE.set(get_memory_usage())
def get_memory_usage():
    # 取得記憶體使用量的邏輯
    pass
if __name__ == '__main__':
    # 啟動HTTP伺服器來暴露監控指標
    start_http_server(8000)
    while True:
        process_request()
內容解密:
此程式碼範例展示瞭如何使用Prometheus客戶端函式庫來監控應用程式。首先,我們定義了兩個指標:一個Counter用於記錄請求的總數,一個Gauge用於記錄記憶體的使用量。然後,在處理請求的函式中,我們更新這些指標的值。最後,我們啟動了一個HTTP伺服器來暴露這些監控指標,以便Prometheus伺服器可以抓取這些資料。
 
            