SlideShare a Scribd company logo
1 of 134
Download to read offline
1
______________________________
/ DevOps ⼈人⼀一定要知道的持續交付技巧 
 - Ansible & GitLab CI 實戰演練 (2nd)/
------------------------------

 ^__^
 (oo)_______
(__) )/
||----w |
|| ||
[ chusiang@study-area-tainan ~ ] $ cat .profile
# Author: 凍仁翔 / chusiang@drx.tw
# Blog: http://note.drx.tw
# Modified: 2017-11-11 11:11
2https://studyarea.kktix.cc/events/54eabc9a
# 建立 Control Machine。
$ docker run -p 8888:8888 -d 
chusiang/ansible-jupyter:ubuntu-16.04
# 建立 Managed node 1。
$ docker run -p 10022:22 -d 
chusiang/ansible-managed-node:ubuntu-16.04
# 建立 Managed node 2。
$ docker run -p 20022:22 -d 
chusiang/ansible-managed-node:ubuntu-16.04
# 查看 Managed node 的 ssh port。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
......
3
Ready?
要開始了了!
4
Today we use 95
Docker containers
in DigitalOcean.
5
關於我
• 凍仁翔 (@chusiang_lai)。
• 《凍仁的筆記》站長。
• DevOps Taiwan 志⼯工。
• 5 年年 IT 營運經驗。
6
Outline
• DevOps ⼈人是什什麼?
• 持續交付是什什麼?
7
Outline
• DevOps ⼈人是什什麼?
• 持續交付是什什麼?
• Ansible 是什什麼?
• 怎麼部署 Ansible 環境?
• 怎麼操作 Ansible?
8
Outline
• GitLab 是什什麼?
• Pipeline 是什什麼?
• 怎麼操作 GitLab CI?
9
Outline
• GitLab 是什什麼?
• Pipeline 是什什麼?
• 怎麼操作 GitLab CI?
• 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付?
• Q&A
10
Ⅰ. DevOps ⼈人是什什麼?
11
廣義的 DevOps 是什什麼?
12
狹義的 DevOps 是什什麼?
Infra
13
Dev Ops
ITSM※ 此圖出⾃自 Mark Smalley x 許峰於 DevOpsDays Taipei 2017 的分享 - https://youtu.be/qWbcujKw57c?t=9m39s
DevOps
我⼼心中的 Dev ⼈人是什什麼?
等 Ops?
有事 On-call 沒事下班
Coding
14
我⼼心中的 Ops ⼈人是什什麼?
耗時
有事救火 沒事 On-call
敲指令 裝機器
改什什麼 常忘記
15
我⼼心中的 DevOps ⼈人是什什麼?
不⽤用 20 分
有事 On-call
Coding
管機器
沒事讓 code
"⾃自⼰己" 管機器
16
今天會⽤用到哪些 Tools?
Git, GitLab
GitLab CI
Ansible
Docker
17
今天會⽤用到哪些 License?
LGPL
MIT
GPL
Apache
18
可以⽤用到哪些 Tools 替代?
Ansible
Chef, Puppet, Slat
Docker
AWS, Vagrant
GitLab CI,
Jenkins CI,
Drone CI
Git, GitLab
GitHub
19
Ⅱ. 持續交付是什什麼?
《Continuous Delivery》- https://goo.gl/r9vXFg
持續的、不間斷的、不鬆懈的。
投遞、傳送、交付、交貨。
20
利利⽤用⾃自動化的
建置、測試與部署
,完美創造出可信賴
的軟體發佈
- Jez Humble & David Farley
《Continuous Delivery 中⽂文版》- https://goo.gl/SK745B
21
建置
測試
發佈
部署
⾃自動化
22
建置
測試
發佈
部署
⾃自動化
23
建置
測試
發佈
部署
⾃自動化
24
建置
測試
發佈
部署
⾃自動化
25
建置
測試
發佈
部署
⾃自動化
26
建置
測試
發佈
部署
⾃自動化
27
持續交付和持續部署有什什麼不同?
Continuous Delivery
Continuous Deployment
auto auto manual
Build Deploy Test Release
auto auto auto
Build Deploy Test Release
28
持續交付和持續部署有什什麼不同?
前者需⼿手動 Release ⾄至 Production,⽽而後者則⾃自動化之。
Continuous Delivery
Continuous Deployment
auto auto manual
Build Deploy Test Release
auto auto auto
Build Deploy Test Release
29
導入持續交付的好處是什什麼?
30
Before
需耗數 hr 交付
1 週以上
交付 1 次
⼈人為失誤 ↑
發佈 ≒ 救火
31
R&D:我程式寫完了了! 我:等 CD 過了了再說。
Code 還在本機?
推上 Git server?
組態設定對了了?
單元測試過了了?
持續交付過了了?
真 實 案 例例
R&D:我程式寫完了了!
我:(哪裡寫完了了?!)
32
After
交付 < 5 min
commit
即交付
⼈人為失誤 ↓
即早發現
即早治療
33
R&D:我程式寫完了了! 我:等 CD 過了了再說。
Code 還在本機?
推上 Git server?
組態設定對了了?
單元測試過了了?
持續交付過了了?
真 實 案 例例
34
案例例分析
提前預演變更更⼯工作,避免
每次變更更都成為例例外⼯工作!
《The Phoenix Project》
Amazon - https://goo.gl/visckK
35
Ⅲ. Ansible 是什什麼?
36
Ansible 取名⾃自知名⼩小說

《安德的遊戲》,是
虛構的超光速通訊技術。
有了了它我們就可以像 Ender
指揮戰艦般的操控伺服器。
電影海海報 - https://goo.gl/4xftZT
37
Ansible ⾃自 2013 年年創立,
於 2015 年年被 Red Hat 併購。
iThome - http://goo.gl/yJbWtz
38
在 GitHub 上擁有 26,606 顆星星、3,090 位協作者。
39
Ansible Tower
更更獲選 Linuxpilot 2017
Linux & OSS 最佳解決⽅方案

,擁有最佳系統⾃自動化管理理
⽅方案之名。
Linuxpilot - https://goo.gl/mSxR4E
40
Ansible 和 Tower 有什什麼不同?
https://www.ansible.com/blog/red-hat-ansible-automation-engine-vs-tower
41
我⼼心中的 Ansible 是什什麼?
1. 與 Puppet、SaltStack、Chef 並列列其四。
2. Python like 的組態設定⼯工具

(Infrastructure as Code)。
42
Python
Ansible
SaltStack
Ruby
Chef
Puppet
vs
43
我⼼心中的 Ansible 是什什麼?
3. 不需 Agent,有 Python 和 SSH 就可以闖天下!
4. 容易易上⼿手。
5. 社群強⼤大,有商業公司⽀支援。
44
真實案例例
每週節省 26 hr 的⼯工時。
(6 x 3) x 2 - (5 x 1) x 2 = 26 hr
45
減少例例⾏行行性⼯工作⼈人⼒力力成本
0
350
700
1,050
1,400
Week Month Year
104 hr
26 hr
1,352 hr
46
節省企業開⽀支
0
125,000
250,000
375,000
500,000
Week Month Year
$35,360
$8,840
$459,680
47
有這類困擾?
歡迎上 DevOps Taiwan

找新⼯工作。(誤)
https://github.com/DevOpsTW/jobs/
48
Ⅳ. 怎麼部署 Ansible 環境?
觀念念、安裝、設定
49
練習環境為 Control Machine (Ubuntu 16.04) + Managed node*2 (Ubuntu 16.04)。
透過 Ansible 和 Jupyter 操控 Managed node
50
# 建立 Control Machine。
$ docker run -p 8888:8888 -d 
chusiang/ansible-jupyter:ubuntu-16.04
# 建立 Managed node 1。
$ docker run -p 10022:22 -d 
chusiang/ansible-managed-node:ubuntu-16.04
# 建立 Managed node 2。
$ docker run -p 20022:22 -d 
chusiang/ansible-managed-node:ubuntu-16.04
# 查看 Managed node 的 ssh port。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
......
51
$ docker run -P -d 
chusiang/ansible-jupyter:ubuntu-16.04
52
Ansible 是怎麼運作的?
透過 inventory 定義 Managed node,並藉由 SSH 與 Python 進⾏行行溝通。
53
怎麼安裝 Ansible?
• 只需在 Control Machine (主控端) 安裝 Ansible;
Managed node 則需 Python 2.5+ 和 SSH。
$ sudo apt-get install ansible # Debian, Ubuntu.
$ sudo yum install ansible # RHEL, CentOS.
$ brew install ansible # Mac OS X (homebrew).
$ sudo pip install ansible # Python (pip).
54
請於 Jupyter 設置 Ansible 操作環境
請修改 ansible.cfg 和 inventory 檔案。
55
怎麼設定 Ansible?
• 藉由 ansible.cfg 來來設定 inventory (host file) 檔案路路徑、
Managed node (被控端) 使⽤用者名稱、SSH ⾦金金鑰 … 等。
$ vim ansible.cfg
1 [defaults]
2 inventory = inventory # 指定 inventory 路路徑。
3
4 remote_user = docker # 遠端登入的使⽤用者名稱。
5
6 #private_key_file = ~/.ssh/id_rsa
7
8 host_key_checking = False # 不檢查 ssh ⾦金金鑰。
56
inventory 是什什麼?
• 定義 Managed node (被控端) 位址與群組的主機清冊,

通常會⽤用來來設定 ssh 或 winrm 的連線資訊。
$ vim hosts
1 # 在同⼀一主機的不同 Port 跑 ssh server。
2
3 [staging]
4 stg.demo.drx.tw ansible_ssh_host=demo.drx.tw
ansible_ssh_port=10022
5
6 [production]
7 prd.demo.drx.tw ansible_ssh_host=demo.drx.tw
ansible_ssh_port=20022
57
Ⅴ. 怎麼操作 Ansible?
Ad-Hoc command, Playbook* (Module)
58
and Playbooks
Ad-Hoc
commands
59
Ad-Hoc
commands
簡短指令
60
⼀一般的 command line 是什什麼?
• 這裡的 command line 為 Linux Shell 底下的指令操作,
以下為 ping 和 echo 的操作的結果。
$ ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.037 ms
--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet
loss
round-trip min/avg/max/stddev = 0.037/0.037/0.037/0.000 ms
$ echo Hello World
Hello World
61
怎麼⽤用 Ad-Hoc commands?
ansible <host-pattern> [-m module_name] [-a args] [options]
• host-pattern: all, server1, server1:server2, server_group.
$ ansible all -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
$ ansible all -m command -a "echo Hello World"
localhost | SUCCESS | rc=0 >>
Hello World
# 各個 Module 的詳細說明請參參考官⽅方 All Modules ⽂文件。
62
63
Back to Jupyter
劇本
Playbooks
64
65
Playbooks 是什什麼?
• 比 Shell Script 更更結構
化的腳本語⾔言,是⼀一鍵
部署的好物。
• 使⽤用 YAML 格式,簡單
易易讀。
Baby Playbook Onesie - http://goo.gl/GKJvXn
66
Playbooks 是什什麼?
• 通常會有 Play, Task,
Module 和 handler 等。
• 整合 Jinja2 的 template
系統,可使⽤用變數、判
斷式、迴圈等表達式。
Baby Playbook Onesie - http://goo.gl/GKJvXn
67
Playbooks 是什什麼?
• ⼀一份 Playbook 可以有多個 Play、多個 Task 和多個 Module。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。

























$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
68
Playbooks 是什什麼?
• 執⾏行行 playbook。
$ ansible-playbook example2.yml
PLAY [a sample playbook.] *******************************************
TASK [setup]*********************************************************
ok: [stg.demo.drx.tw]
TASK [Hello World] **************************************************
changed: [stg.demo.drx.tw]
TASK [Install Vim] **************************************************
changed: [stg.demo.drx.tw] => (item=[u'vim'])
PLAY RECAP **********************************************************
stg.demo.drx.tw : ok=1 changed=2 unreachable=0 failed=0
69
• 執⾏行行 playbook。
Playbooks 是什什麼?
$ ansible-playbook example2.yml
PLAY [a sample playbook.] *******************************************
TASK [setup]*********************************************************
ok: [stg.demo.drx.tw]
TASK [Hello World] **************************************************
changed: [stg.demo.drx.tw]
TASK [Install Vim] **************************************************
changed: [stg.demo.drx.tw] => (item=[u'vim'])
PLAY RECAP **********************************************************
stg.demo.drx.tw : ok=1 changed=2 unreachable=0 failed=0
TASK [setup]:被執⾏行行的 managed node 有哪些
PLAY RECAP:總結 (ok / changed / failed )
70
• 透過動作 (Play) 對特定 Managed node 進⾏行行操控,通常包含 Task 和 Module。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。

























Plays 是什什麼?
$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
Play
71
• 藉由各種不同的模組 (Module)、迴圈和判斷式等組合來來完成各種任務 (Task)。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。

























Tasks 是什什麼?
$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
Task 1
Task 2
72
• 最⼩小的操作⽅方法 (Method),好比 Python 的內建函式。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。

























Modules 是什什麼?
$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
Module
http://s.drx.tw/auto-with-ansible-12
74
apt
• 適⽤用於 Debian、Ubuntu 的 apt 套件模組 (Packaging Modules)。
• 類似的 Linux 指令有 apt, apt-get, aptitude 和 dpkg。























# 更更新套件索引 (快取),等同於 apt-get update 指令。
- name: Update repositories cache
become: true
apt:
update_cache: yes
# 安裝 vim 套件。
- name: Install the package "vim"
become: true
apt:
name: vim
state: present
75
lineinfile
• ⽤用正規表⽰示式對檔案進⾏行行插入或取代⽂文字的檔案模組 (Files Modules)。
• 其類似的 Linux 指令為 sed。























# Before 2.3, option 'dest', 'destfile' or 'name' was used instead of ‘path'.
# 關閉 SELinux。
- name: disable selinux
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=enforcing'
# 移除 docker 使⽤用者的 sudo 權限。
- name: remove sudo permission of docker
lineinfile:
path: /etc/sudoers
state: absent
regexp: '^docker'
76
shell
• 在遠端⽤用 /bin/sh 執⾏行行 shell 指令的指令模組 (Commands Modules),
⽀支援變數 (variables)、< , > , | , ; 和 & 等運算。























# 藉由 ls 和 wc 檢查檔案數量量。
- name: check files number
shell: ls /home/docker/ | wc -l
# 列列出所有的 Python ⾏行行程。
- name: show all python process
shell: ps aux | grep python
# 執⾏行行 shell script,並把結果導向 /tmp/result.log。
- name: execute run.sh
shell: ./run.sh > /tmp/result.log
Playbooks Samples
• Ansible Role: Install Vim and use vi-mode in everyway 

- https://github.com/chusiang/vim-and-vi-mode.ansible.role
• Ansible Role: PHP 7 (php-fpm) for Nginx on Ubuntu and CentOS

- https://github.com/chusiang/php7.ansible.role
• Ansible Galaxy

- https://galaxy.ansible.com/
• Code samples from 《Ansible: Up and Running》

- https://github.com/ansiblebook/ansiblebook
77
Ⅵ. GitLab 是什什麼?
78
GitLab 是什什麼?
集 Git Repository、Docker Registry、Issue tracking、Code Review、
CI 和 CD 於⼀一⾝身的現代平台。
79
回顧⼀一下 Ansible Inc. Ecosystems
https://www.ansible.com/blog/red-hat-ansible-automation-engine-vs-tower
80
今天我們⽤用 GitLab 進⾏行行協作
https://www.ansible.com/blog/red-hat-ansible-automation-engine-vs-tower
GITLAB
81
CONTROL KNOWLEDGE
今天我們⽤用 GitLab 進⾏行行協作
https://www.ansible.com/blog/red-hat-ansible-automation-engine-vs-tower
GITLAB
82
CONTROL KNOWLEDGE
GitLab CI, Pipeline
今天我們⽤用 GitLab 進⾏行行協作
https://www.ansible.com/blog/red-hat-ansible-automation-engine-vs-tower
GITLAB
83
CONTROL KNOWLEDGE
GitLab
Web, Issue, Wiki
Ⅶ. Pipeline 是什什麼?
管道 (線)?⽣生產線?傻傻分不清楚?!
84
Ch 5. 部署流⽔水線解析
Ch 6. 建置與部署的腳本化
Ch 7. 提交階段
Ch 8. ⾃自動化驗測試
Ch 9. 非功能性需求測試
Ch 10. 應⽤用程式的部署與發佈
書中的 Pipeline 是什什麼?
《Continuous Delivery》- https://goo.gl/r9vXFg
85
原始
程式碼
應⽤用程式
設置
提交階段
編譯
單元測試
程式碼分析
組裝 binaries
驗收階段
設置環境
部署 binaries
冒煙測試
驗收測試
UAT 階段
設置環境
部署 binaries
冒煙測試
探索性測試
⽣生產⼒力力測試階段
設置環境
部署 binaries
冒煙測試
執⾏行行⽣生產⼒力力測試
⽣生產環境
設置環境
部署 binaries
冒煙測試
版本控制
⾃自動發佈⾃自動發佈
⼀一鍵發佈
⼀一鍵發佈
Binary 儲存庫
binaries
metadata
程式碼 應⽤用程式設置
binaries metadata binaries
binaries
metadata metadata
Adapted from “Continuous Delivery” © Dave Farley and Jez Humble 2010
Translated by Chu-Siang Lai 2017 86
原始
程式碼
應⽤用程式
設置
提交階段
編譯
單元測試
程式碼分析
組裝 binaries
驗收階段
設置環境
部署 binaries
冒煙測試
驗收測試
UAT 階段
設置環境
部署 binaries
冒煙測試
探索性測試
⽣生產⼒力力測試階段
設置環境
部署 binaries
冒煙測試
執⾏行行⽣生產⼒力力測試
⽣生產環境
設置環境
部署 binaries
冒煙測試
版本控制
⾃自動發佈⾃自動發佈
⼀一鍵發佈
⼀一鍵發佈
Binary 儲存庫
binaries
metadata
程式碼 應⽤用程式設置
binaries metadata binaries
binaries
metadata metadata
Adapted from “Continuous Delivery” © Dave Farley and Jez Humble 2010
Translated by Chu-Siang Lai 2017 87
– Chu-Siang Lai
「Pipeline 好比⽣生產線,導入⾃自動化後
,⾃自然顯現的軟體發佈流程。」
88
GitLab Pipelines ⼜又是什什麼?
圖像化的軟體發佈⽣生產線。
89
Ⅷ. 怎麼操作 GitLab CI?
在專案底下建立 .gitlab-ci.yml,當程式碼上傳⾄至 GitLab 即會觸發 GitLab CI。
90
• YAML 語法。
• 此例例⼤大致可分為 stage × 1 和 job × 1。





















怎麼寫 .gitlab-ci.yml?
$ vim .gitlab-ci.yml
1 stages:
2 - build
3
4 build_binary:
5 image: ubuntu:16.04
6 stage: build
7 script:
8 - chmod 755 penguin-htdocs/DEBIAN
9 - dpkg -b penguin-htdocs
10 tags:
11 - docker
91
怎麼觸發 GitLab CI?
$ git push --> GitLab
92
從 Pipelines 看觸發狀狀態
93
94
詳細資訊
Ⅸ. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付?
在 GitLab CI,⽤用 Ansible (Docker Containers) 跑 Playbooks 即可。
95
AnsibleGitLab CIDocker
96
使⽤用者故事
⾝身為開發團隊的⼀一員,我想要每次提交
時,都會依照不同的分⽀支,⾃自動部署到
不同的環境,並進⾏行行些簡易易的測試,

因為我們不想程式寫到⼀一半,還要

下⼀一堆指令,操作⼀一堆機器。
97
Git server GitLab
CI server Build Deploy Test
Engineer
98
Develop
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
99
Master
https://hub.docker.com/r/chusiang/ansible/
0
100
http://s.drx.tw/cd.lab
1
101
Build stage
2
TestDeploy ReleaseBuild
102
Deploy, Test,
Release stages
3
DeployBuild Test Release
103
Pipelines
4
104
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
Coding & Git Commit
105
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
Git Push
Coding & Git Commit
106
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
.gitlab-ci.yml
107
$ vim .gitlab-ci.yml
1 stages:
2 - build
3 - deploy
4 - test
5 - release
6
7 build_binary:
8 image: ubuntu:16.04
9 stage: build
10 script:
11 # For fix bad permissions of control directory on GitLab CI.
12 - chmod 755 penguin-htdocs/DEBIAN
13
14 # build deb.
15 - dpkg -b penguin-htdocs
16 artifacts:
17 expire_in: 1 week
18 paths:
19 - penguin-htdocs.deb
20 tags:
21 - docker
22
5
TestDeploy ReleaseBuild
108
22
23 deploy_to_dev:
24 image: chusiang/ansible:alpine-3.6
25 stage: deploy
26 script:
27 - ls
28 - cd ansible-playbooks/
29 - echo "${VAULT_KEY}" > secret.txt
30 - ansible-playbook deploy.yml
31 - rm -f secret.txt
32 only:
33 - master@chusiang/continuous-delivery-workshop
34 - develop@chusiang/continuous-delivery-workshop
35 - tags@chusiang/continuous-delivery-workshop
36 tags:
37 - docker
38
6
TestDeploy ReleaseBuild
109
38
39 test_dev:
40 image: chusiang/ansible:alpine-3.6
41 stage: test
42 script:
43 - cd ansible-playbooks/
44 - echo "${VAULT_KEY}" > secret.txt
45 - ansible-playbook test.yml
46 - rm -f secret.txt
47 only:
48 - master@chusiang/continuous-delivery-workshop
49 - develop@chusiang/continuous-delivery-workshop
50 - tags@chusiang/continuous-delivery-workshop
51 tags:
52 - docker
53
7
TestDeploy ReleaseBuild
110
53
54 release_to_prd:
55 image: chusiang/ansible:alpine-3.6
56 stage: release
57 script:
58 - cd ansible-playbooks/
59 - echo "${VAULT_KEY}" > secret.txt
60 - ansible-playbook -i production deploy.yml
61 - rm -f secret.txt
62 only:
63 - master@chusiang/continuous-delivery-workshop
64 - tags@chusiang/continuous-delivery-workshop
65 tags:
66 - docker
67 8
TestDeploy ReleaseBuild
111
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
.gitlab-ci.yml
112
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
Package deb file
113
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
Play deploy.yml
114
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
Play test.yml
115
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
Play deploy.yml
116
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
Feedback
117
Customer
Git server GitLab
CI server Build Deploy Test Release
Engineer
118
⼯工作事項
① 登入 https://gitlab.com 並 Fork http://s.drx.tw/cd.lab。

② 取得專案。

$ git clone git@gitlab.com:<USERNAME>/continuous-
delivery-workshop.git

③ 修改 `penguin-htdocs/var/www/html/index.html`,並提
交到⾃自⼰己的 repo。

④ 發送 MR ⾄至 `chusiang/continuous-delivery-workshop`。

⑤ 觀察 GitLab Pipeline、http://stg.demo.drx.tw:10080 和

http://prd.demo.drx.tw:20080 的變化。
119
練習環境為 Control Machine (Ubuntu 16.04) + Managed node*2 (Ubuntu 16.04)。
透過 Ansible 和 Jupyter 操控 Managed node
120
Ⅰ
Demo 環境為 Control Machine (Alpine 3.6) + Managed node*2 (Ubuntu 16.04)。
透過 GitLab CI 和 Ansible 操控 Managed node
121
Ⅱ
火⼒力力展⽰示
Live Demo
122
https://youtu.be/QHim_JxB4ZY
123
– Chu-Siang Lai
「持續交付是⼀一段⼈人類與企業的進化史。」
124
我的 Pipeline 進化史
Unit Test Integration Test Delivery DeploymentBuildSyntax Check
Unit Test Delivery DeploymentBuildSyntax Check
Unit TestDelivery DeploymentBuildSyntax Check
Delivery DeploymentBuildSyntax Check
BuildSyntax Check
Build
125
今天提到的 DevOps 是什什麼?
126
※ 此圖出⾃自 Chen Cheng-Wei 的 Effective DevOps 簡報 (https://www.slideshare.net/warfan/effective-devops-78979993)。
• 提到 DevOps 到底在談些什什麼玩意兒? by Chen Cheng-Wei - https://goo.gl/7YTeKD
• Continuous Delivery - 敏捷開發的最後⼀一哩路路 by Miles - https://goo.gl/UhpAfG
• Ansible Documentation - http://docs.ansible.com/ansible/intro_installation.html
• 《Ansible: Up and Running》- https://www.ansible.com/ansible-book
• 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧 / 3e - https://goo.gl/vHyVDt
• 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧系列列⽂文章 - https://goo.gl/EOjs4I
• Getting started with GitLab CI | GitLab Documentation - https://goo.gl/NctsCk
• Demo project of COSCUP 2017 - https://gitlab.com/chusiang/coscup2017-cd-demo
參參考⽂文獻
128
圖片來來源
• 《Continuous Delivery》 | Amazon.com - https://www.amazon.com/dp/0321601912
• 《Continuous Delivery 中⽂文版》 | 天瓏網路路書店 - https://goo.gl/SK745B
• DevOps Services & Continuous Delivery - https://goo.gl/jswxch
• 《The Phoenix Project》 | Amazon.com - https://goo.gl/visckK
• Resenha: Harry Potter e a Pedra Filosofal, de J.K. Rowling | Acrobata das Letras

- https://goo.gl/R34tSA
• Brown Book Icon | SoftIcons.com - https://goo.gl/U9U2am
• Always Agile Consulting · Introducing Continuous Delivery - https://goo.gl/2Nhtcr
• 5 CI/CD Strategies for Faster Software Deployments and Better Automation | snap

- https://goo.gl/UZPf5e
129
https://www.facebook.com/groups/DevOpsTaiwan/
https://devopstw.club/
DevOps Taiwan
https://gitter.im/DevOpsTW/
130
Ansible Taiwan
https://telegram.me/ansible_tw
https://github.com/ansible-tw
http://ansible.tw
131
http://萍⽔水相逢.tw
132
Q & A
嚴禁拍打餵食
133
END
134

More Related Content

What's hot

20150604 docker 新手入門
20150604 docker 新手入門20150604 docker 新手入門
20150604 docker 新手入門azole Lai
 
用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式Bo-Yi Wu
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 
認識那條鯨魚 Docker 初探
認識那條鯨魚   Docker 初探認識那條鯨魚   Docker 初探
認識那條鯨魚 Docker 初探仲昀 王
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)Chu-Siang Lai
 
Introduction to Golang final
Introduction to Golang final Introduction to Golang final
Introduction to Golang final Paul Chao
 
AWS EC2 for beginner
AWS EC2 for beginnerAWS EC2 for beginner
AWS EC2 for beginnerazole Lai
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践Na Lee
 
Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer TalkLarry Cai
 
Docker 淺入淺出
Docker 淺入淺出Docker 淺入淺出
Docker 淺入淺出Miles Chou
 
docker intro
docker introdocker intro
docker introkoji lin
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xBo-Yi Wu
 
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018Will Huang
 
Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南Shengyou Fan
 
容器式基礎架構介紹
容器式基礎架構介紹容器式基礎架構介紹
容器式基礎架構介紹Philip Zheng
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorialazole Lai
 
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來Shengyou Fan
 

What's hot (20)

20150604 docker 新手入門
20150604 docker 新手入門20150604 docker 新手入門
20150604 docker 新手入門
 
用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
認識那條鯨魚 Docker 初探
認識那條鯨魚   Docker 初探認識那條鯨魚   Docker 初探
認識那條鯨魚 Docker 初探
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 
Introduction to Golang final
Introduction to Golang final Introduction to Golang final
Introduction to Golang final
 
AWS EC2 for beginner
AWS EC2 for beginnerAWS EC2 for beginner
AWS EC2 for beginner
 
Docker應用
Docker應用Docker應用
Docker應用
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践
 
Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer Talk
 
Vagrant教學
Vagrant教學Vagrant教學
Vagrant教學
 
Docker 淺入淺出
Docker 淺入淺出Docker 淺入淺出
Docker 淺入淺出
 
docker intro
docker introdocker intro
docker intro
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
 
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
 
Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南
 
容器式基礎架構介紹
容器式基礎架構介紹容器式基礎架構介紹
容器式基礎架構介紹
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorial
 
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
 

Similar to Continuous Delivery Workshop with Ansible x GitLab CI (2nd)

Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Chu-Siang Lai
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧Chu-Siang Lai
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86dbabc
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
基于Innodb开发的最佳实践
基于Innodb开发的最佳实践基于Innodb开发的最佳实践
基于Innodb开发的最佳实践wubx
 
0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)Timothy Chen
 
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境均民 戴
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结Yiwei Ma
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Harvey Zhang
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用Philip Zheng
 
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境dbabc
 
Linux network monitoring hands-on pratice
Linux network monitoring hands-on praticeLinux network monitoring hands-on pratice
Linux network monitoring hands-on praticeKenny (netman)
 
Ops as Code using Serverless
Ops as Code using Serverless Ops as Code using Serverless
Ops as Code using Serverless Rick Hwang
 
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)acqua young
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & WindowsChu-Siang Lai
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討國昭 張
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发litaocheng
 
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽Kito Cheng
 

Similar to Continuous Delivery Workshop with Ansible x GitLab CI (2nd) (20)

Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
基于Innodb开发的最佳实践
基于Innodb开发的最佳实践基于Innodb开发的最佳实践
基于Innodb开发的最佳实践
 
Asm+aix
Asm+aixAsm+aix
Asm+aix
 
0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)
 
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用
 
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
 
Linux network monitoring hands-on pratice
Linux network monitoring hands-on praticeLinux network monitoring hands-on pratice
Linux network monitoring hands-on pratice
 
Ops as Code using Serverless
Ops as Code using Serverless Ops as Code using Serverless
Ops as Code using Serverless
 
Rootkit 101
Rootkit 101Rootkit 101
Rootkit 101
 
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
 
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
 

More from Chu-Siang Lai

The System Engineer in Agile Team
The System Engineer in Agile TeamThe System Engineer in Agile Team
The System Engineer in Agile TeamChu-Siang Lai
 
Is it really easy for companies to import Ansible automation
Is it really easy for companies to import Ansible automationIs it really easy for companies to import Ansible automation
Is it really easy for companies to import Ansible automationChu-Siang Lai
 
See the Agile from Mindset
See the Agile from MindsetSee the Agile from Mindset
See the Agile from MindsetChu-Siang Lai
 
Writing skills for Information Technology
Writing skills for Information TechnologyWriting skills for Information Technology
Writing skills for Information TechnologyChu-Siang Lai
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)Chu-Siang Lai
 
Automate with Ansible basic (2/e, English)
Automate with Ansible basic (2/e, English)Automate with Ansible basic (2/e, English)
Automate with Ansible basic (2/e, English)Chu-Siang Lai
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTreeChu-Siang Lai
 
使用 Multi-sites 技術快速建置多 Drupal 網站
使用 Multi-sites 技術快速建置多 Drupal 網站使用 Multi-sites 技術快速建置多 Drupal 網站
使用 Multi-sites 技術快速建置多 Drupal 網站Chu-Siang Lai
 
歡迎來到 Ubuntu 9.10 Release Party (台中)
歡迎來到 Ubuntu 9.10 Release Party (台中)歡迎來到 Ubuntu 9.10 Release Party (台中)
歡迎來到 Ubuntu 9.10 Release Party (台中)Chu-Siang Lai
 
無痛入門 Chromecast
無痛入門 Chromecast無痛入門 Chromecast
無痛入門 ChromecastChu-Siang Lai
 
Ubuntu 藍星侵略計劃
Ubuntu 藍星侵略計劃Ubuntu 藍星侵略計劃
Ubuntu 藍星侵略計劃Chu-Siang Lai
 
Intro of Network, WiFi on Ubuntu
Intro of Network, WiFi on UbuntuIntro of Network, WiFi on Ubuntu
Intro of Network, WiFi on UbuntuChu-Siang Lai
 

More from Chu-Siang Lai (17)

My DevOps Tour 2.3
My DevOps Tour 2.3My DevOps Tour 2.3
My DevOps Tour 2.3
 
The System Engineer in Agile Team
The System Engineer in Agile TeamThe System Engineer in Agile Team
The System Engineer in Agile Team
 
Is it really easy for companies to import Ansible automation
Is it really easy for companies to import Ansible automationIs it really easy for companies to import Ansible automation
Is it really easy for companies to import Ansible automation
 
My DevOps Tour 0.1
My DevOps Tour 0.1My DevOps Tour 0.1
My DevOps Tour 0.1
 
See the Agile from Mindset
See the Agile from MindsetSee the Agile from Mindset
See the Agile from Mindset
 
Writing skills for Information Technology
Writing skills for Information TechnologyWriting skills for Information Technology
Writing skills for Information Technology
 
My DevOps Tour 1.0
My DevOps Tour 1.0My DevOps Tour 1.0
My DevOps Tour 1.0
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
 
Automate with Ansible basic (2/e, English)
Automate with Ansible basic (2/e, English)Automate with Ansible basic (2/e, English)
Automate with Ansible basic (2/e, English)
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTree
 
helloTux 2012
helloTux 2012helloTux 2012
helloTux 2012
 
Unity & Googlizer
Unity & GooglizerUnity & Googlizer
Unity & Googlizer
 
使用 Multi-sites 技術快速建置多 Drupal 網站
使用 Multi-sites 技術快速建置多 Drupal 網站使用 Multi-sites 技術快速建置多 Drupal 網站
使用 Multi-sites 技術快速建置多 Drupal 網站
 
歡迎來到 Ubuntu 9.10 Release Party (台中)
歡迎來到 Ubuntu 9.10 Release Party (台中)歡迎來到 Ubuntu 9.10 Release Party (台中)
歡迎來到 Ubuntu 9.10 Release Party (台中)
 
無痛入門 Chromecast
無痛入門 Chromecast無痛入門 Chromecast
無痛入門 Chromecast
 
Ubuntu 藍星侵略計劃
Ubuntu 藍星侵略計劃Ubuntu 藍星侵略計劃
Ubuntu 藍星侵略計劃
 
Intro of Network, WiFi on Ubuntu
Intro of Network, WiFi on UbuntuIntro of Network, WiFi on Ubuntu
Intro of Network, WiFi on Ubuntu
 

Continuous Delivery Workshop with Ansible x GitLab CI (2nd)