[ 實戰 CI / CD Pipeline ] Jenkins + Ansible + Windows Host

閱讀時間約 11 分鐘

前言

隨著越來越多公司導入 DevOps 、Agile、Scrum 開發模式,作為基礎設施的 CI / CD Pipeline 也越來越被需要。但是導入的過程中,
總會遇到一些問題:
CI / CD Pipeline 該怎麼建 !?
Pipeline 工具該怎麼選擇 !?
該找誰負責 Devs、QAs、Ops !?
總之,不知道該怎麼辦的時候只好問天 XD
老天 : 去看書 !
要讀那些呢 ? 不外乎就是這幾本 ----- DevOps 聖經
掌握 DevOps 以下三個要點:
自動化、可視化、快速回饋

CI / CD 常見的工具有:

  • Jenkins
  • GitLab CI
  • AWS CodePipeline
  • Azure DevOps
  • Travis CI
  • Circle CI
  • Drone CI
該選誰呢...?
不管了 !!
先從最老工具的開始練習~~
持續整合一哥 --------- Jenkins
來建一條 Pipeline 吧 !

Environment Requirements :

  • Jenkins + Ansible (Ubuntu 16.04)
  • Remote Host ( Windows 10 )
由於測試環境需求,需要遠端控制一台或多台 Windows VM,如果透過 Jenkins Slave 來控制遠端電腦,在以往的經驗中,若是網路斷線或是 VM Snapshot Revert 的環境中常常造成 Jenkins 主控端與遠端不同步的狀況,必須靠著各種 Workaround 來排除困難。
這次的實驗,我想用 Jenkins + Ansible 來搭建測試環境的 Pipeline,因 Ansible 僅支援 Linux 作業系統,所以我選擇將 Jenkins 安裝在 Ubuntu 上。
======== 實驗開始 ========

Jenkins Installation

可以將以下 commands 存成 jenkins_install.sh,將 shell script 版控處理。
執行完成後,會印出一組初始的 Admin Password,打開瀏覽器連結至Jenkins Console ( https://localhost:8080 ),將初始密碼貼上後安裝官方建議 Plugins。
P.S. 若環境有任何防火牆,請記得把來源加入白名單
jenkins-ci.org
jenkins.io
pkg.jenkins.io
等待一切都安裝完成後,進到 Jenkins > Manage Jenkins > Manage Plugin 選 Available 安裝以下 Plugins:
Blue Ocean --- Pipeline可視化
AnsiColor --- Logging colors display
Ansible-plugin
接著,點選 Blue Ocean 進入設定 --- [More]

讓 Jenkins account 擁有 sudo 權限 ( 不須可跳過 )

開啟 Linux Terminal 完成下列步驟後儲存離開。
1. sudo vim /etc/sudoers
2. add "Jenkins ALL=(ALL) NOPASSWPRD: ALL"
Jenkins 安裝的部分,暫時告一個段落,接著安裝 Ansible。
Ansible 是一個 Base on Python 的自動化組態管理工具,經由執行 YAML 管裡設定,格式編寫容易,容易上手與維護簡單,不需要透過代理或安裝 Client 來控制遠端機器,僅透過 SSH ( Linux ) 與 Winrm ( Windows )來執行遠端程序,2015 年由 Red Hat 收購

Ansible 2.9.0 Installation

安裝 Windows Remote Control Packages

pip install pywinrm
開始建立 Ansible 專案
# create ansible folder
mkdir ansible
cd ansible
編輯 Ansible 設定檔 ansible.cfg,指定 inventory 與 ansible.log
vim ansible.cfg
[defaults]
inventory = inventory
log_path = ansible.log
這次的實驗我們需要一台 Windows 遠端主機,
Windows 遠端主機需要有 PowserShell 3.0 以上的版本。
PowserShell 權限必須設置為 RemoteSigned 或 Unrestricted 並開啟 WinRm 相關設定。以系統管理員身分執行 PowerShell,確認 PowserShell 權限,若權限不為上述兩項,可以更改權限 Set-ExecutionPolicy RemoteSigned
PS C:\Users\Wis> Get-ExecutionPolicy
RemoteSigned
開啟 WinRm Service 進行基礎配置
winrm quickconfig
# Enable WinRm Auth
winrm set winrm/config/service/auth '@{Basic="true"}'
# Enable Allow Un-encrypt
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
# Verify WinRm Listener
winrm enumerate winrm/config/listener
接著,編輯 inventory 檔,將遠端 Windows Host 資訊填入
vim inventory
[windows]  # group name
win10 ansible_host=10.1.2.1
[windows:vars]  # define variable for windows group
ansible_user=win_user
ansible_password=win_password
ansible_port=5985
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

測試一下 Ansible 連線

$> ansible windows -m win_ping
win10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
連線成功囉!!

Ansible - 資料夾結構

- Jenkinsfile
- ansible
- ansible.cfg
- inventory
- playbook.yml
- remote_run.py
接下來,把想做的程序寫進 playbook.yml 裡,預期在遠端 Windows Host 執行 Python 程式 remote_run.py
vim playbook.yml
- hosts: windows
gather_facts: no
vars:
py_src_name: remote_run.py
py_dst_dir: C:\temp\ansible
tasks:
- name: Create folder on remote host
win_file:
path: '{{ py_dst_dir }}'
state: directory
- name: Copy python file to remote host
win_copy:
src: '{{ py_src_name }}'
dest: '{{ py_dst_dir }}\{{ py_src_name }}'
- name: Execute python program
win_shell: python '{{ py_dst_dir }}\{{ py_src_name }}'
簡單的寫一個執行5秒的 Python 程式,給遠端 Windows Host 執行 ---remote_run.py
vim remote_run.py
import time
for i in range(5):
print("this is loop [{}]".format(i))
time.sleep(1)

測試一下 Ansible Playbook

# 最後補上 -vvv 可顯示 debug info
ansible-playbook playbook.yml
Blue Ocean 會在 Jenkins console 上建立一個可視的 Pipeline,而設定完與 GitHub 連線, Jenkinsfile 會放在 Git repository 最上層 ( 可任意改變位置,Jenkins 也須跟著調整 Jenkinsfile Path )。
Jenkinsfile 內容如下:
pipeline {
agent any
stages {
stage('Windows Host Step') {
steps{
dir(path: 'ansible') {
ansiColor(colorMapName: 'xterm') {
ansiblePlaybook(
playbook: 'playbook.yml',
inventory: 'inventory',
colorized: true)
}
}
}
}
}
}
最後,將修改的檔案推上 GitHub, 就完成囉~!
  • 自動化 - 未來加入更多自動化測試與工作流程。
  • 工作流程可視化 - 藉由 Blue Ocean 的介面,可以得知 Pipeline 的狀態。
  • 快速回饋 - 藉由每次的 Code Commit 觸發一個 Jenkins CI Run 達成快速回饋的機制。

Reference:

為什麼會看到廣告
avatar-img
3會員
9內容數
Drunk Wis
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Wis Vocus 的其他內容
某天收到一封來自 Google TW - Test Engineer, Android 的面試邀請,於是開始請HR幫忙安排後續一切事情,首先要先感謝 HR Jenny 很用心、很細心的跟我說明接下來面試的流程,也提供我許多面試相關的參考文件,真的是萬般感謝,讓我感到備受尊重。當然! 面試不外乎還是要
什麼是Pytest? Pytest是一款強大的Python測試工具,支援平行化測試,使用上簡單方便,適合用在各種不同類型的軟體架構,也適用於RD、QA或獨立測試小組,也適合正要導入TDD的公司。 來寫測試吧! 先用pip安裝pytest: libs\module.py 參考資料:
Software QA Engineer 成長紀錄與面試經驗分享 個人背景 面試經驗 1. 一動數據 Quadas - Sr. Software Engineer (Automation Test) 結果: 感謝函 結果: 婉拒 3. 紅點子科技 Voice Tube - 自動化軟體測試工程師
某天收到一封來自 Google TW - Test Engineer, Android 的面試邀請,於是開始請HR幫忙安排後續一切事情,首先要先感謝 HR Jenny 很用心、很細心的跟我說明接下來面試的流程,也提供我許多面試相關的參考文件,真的是萬般感謝,讓我感到備受尊重。當然! 面試不外乎還是要
什麼是Pytest? Pytest是一款強大的Python測試工具,支援平行化測試,使用上簡單方便,適合用在各種不同類型的軟體架構,也適用於RD、QA或獨立測試小組,也適合正要導入TDD的公司。 來寫測試吧! 先用pip安裝pytest: libs\module.py 參考資料:
Software QA Engineer 成長紀錄與面試經驗分享 個人背景 面試經驗 1. 一動數據 Quadas - Sr. Software Engineer (Automation Test) 結果: 感謝函 結果: 婉拒 3. 紅點子科技 Voice Tube - 自動化軟體測試工程師
你可能也想看
Google News 追蹤
安裝官方 nginx 先在/etc/yum.repos.d新增一個nginx.repo的檔案 並加入以下內容 [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgc
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
在這篇文章中,我們將介紹工作與以前念書時期在開發流程上的差異,並深入瞭解CI/CD、Travis CI以及加解密的應用。 CI/CD是自動化的軟體開發實踐,而加解密則是保護機密資料安全的重要技術。
Thumbnail
在IT世界中,持續整合(CI)和持續部署(CD)已成為提高開發效率和確保高質量軟件交付的重要實踐。本文將探討CI/CD的基本概念,介紹市場上的主流工具,並提供實施這一流程的指南和最佳實踐。
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
CI 持續整合 CI目的是建立自動化專案打包。 CD 持續發表 將打包完成的專案,自動發布。
Thumbnail
本文將介紹如何在Gitlab上部署和註冊runner,以進行CI/CD測試。透過Docker-compose方式進行部署,同時注意安裝時的一些注意事項。建議學習者至少掌握一種以上的Pipeline工具,以滿足實務上的需求。
Thumbnail
前年第一次藉公司機會,參加了DevOpsDay的活動。雖然devOps一詞各自表述,大多狀況還是偏向維運會遇到的技術為主,做為平時開發、跟使用者訪談需求的工作內容來說,參加聚會如果沒有一定的知識,對講者所提到的狀況比較難有共鳴...
Thumbnail
本文將介紹Gitlab與GitHub的差異,以及在本地環境部署Gitlab的流程與實作。文章內容包括版本管理系統的選擇,Gitlab的基本功能,以及使用Docker進行部署的詳細步驟。
Thumbnail
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。
安裝官方 nginx 先在/etc/yum.repos.d新增一個nginx.repo的檔案 並加入以下內容 [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgc
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
在這篇文章中,我們將介紹工作與以前念書時期在開發流程上的差異,並深入瞭解CI/CD、Travis CI以及加解密的應用。 CI/CD是自動化的軟體開發實踐,而加解密則是保護機密資料安全的重要技術。
Thumbnail
在IT世界中,持續整合(CI)和持續部署(CD)已成為提高開發效率和確保高質量軟件交付的重要實踐。本文將探討CI/CD的基本概念,介紹市場上的主流工具,並提供實施這一流程的指南和最佳實踐。
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
CI 持續整合 CI目的是建立自動化專案打包。 CD 持續發表 將打包完成的專案,自動發布。
Thumbnail
本文將介紹如何在Gitlab上部署和註冊runner,以進行CI/CD測試。透過Docker-compose方式進行部署,同時注意安裝時的一些注意事項。建議學習者至少掌握一種以上的Pipeline工具,以滿足實務上的需求。
Thumbnail
前年第一次藉公司機會,參加了DevOpsDay的活動。雖然devOps一詞各自表述,大多狀況還是偏向維運會遇到的技術為主,做為平時開發、跟使用者訪談需求的工作內容來說,參加聚會如果沒有一定的知識,對講者所提到的狀況比較難有共鳴...
Thumbnail
本文將介紹Gitlab與GitHub的差異,以及在本地環境部署Gitlab的流程與實作。文章內容包括版本管理系統的選擇,Gitlab的基本功能,以及使用Docker進行部署的詳細步驟。
Thumbnail
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。