Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Continuous Delivery with Ansible x GitLab CI

Continuous Delivery with Ansible x GitLab CI

# DevOps 人一定要知道的 Ansible & GitLab CI 持續交付技巧
 
Ansible 是個與 Puppet, Salt, Chef 並列的 Infrastructure as Code 組態設定工具,其簡單易用的特性更讓人愛不釋手;GitLab 是業界很常見的 Git 私有版本控制服務,搭配其 GitLab CI 將能快速建立屬於自己的 CI/CD Pipeline 與自動化部署。
 
本次凍仁將會藉由 Ansible 和 GitLab 帶領大家一探持續部署的世界和 DevOps 的威力!
 
#DevOpsTaiwan #DevOpsTW #COSCUP #COSCUP2017
 
> http://coscup.org/2017/#/schedule/day1/3071450

Chu-Siang Lai

August 05, 2017
Tweet

More Decks by Chu-Siang Lai

Other Decks in Technology

Transcript

  1. [ [email protected] ~ ] $ cat .profile
    # Author: 凍仁翔 / [email protected]
    # Blog: http://note.drx.tw
    # Modified: 2017-08-05 13:14

    View Slide

  2. 2
    #DevOpsTW #COSCUP2017

    View Slide

  3. 3
    CTS
    ശൖ

    View Slide

  4. 坐穩囉
    要開始了了!
    4

    View Slide

  5. 關於我
    • 凍仁翔 (@chusiang_lai)。
    • 《凍仁的筆記》站長。
    • DevOps Taiwan 志⼯工。
    • 1 年年以上的 Ansible 使⽤用經驗。
    • 5 年年以上的 IT 維運經驗。
    • 第 8 屆 IT 邦幫忙鐵⼈人賽
    DevOps 組冠軍。
    5

    View Slide

  6. Outline
    I. DevOps ⼈人是什什麼?
    II. 持續交付是什什麼?

    View Slide

  7. Outline
    I. DevOps ⼈人是什什麼?
    II. 持續交付是什什麼?
    III. Ansible 是什什麼?
    IV. 怎麼部署 Ansible 環境?
    V. 怎麼操作 Ansible?

    View Slide

  8. Outline
    VI. GitLab CI 是什什麼?
    VII. Pipeline 是什什麼?
    VIII.怎麼操作 GitLab CI?

    View Slide

  9. Outline
    VI. GitLab CI 是什什麼?
    VII. Pipeline 是什什麼?
    VIII.怎麼操作 GitLab CI?
    IX. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付?

    View Slide

  10. Outline
    VI. GitLab CI 是什什麼?
    VII. Pipeline 是什什麼?
    VIII.怎麼操作 GitLab CI?
    IX. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付?
    X. Q&A

    View Slide

  11. Ⅰ. DevOps ⼈人是什什麼?
    11

    View Slide

  12. 前⼈人眼中的 DevOps 是什什麼?

    View Slide

  13. https://www.slideshare.net/warfan/devops-agile-tour-taichung-2017

    View Slide

  14. View Slide

  15. Agile Tour 台中 by 正瑋 x Mina @ 2017.01.14
    15

    View Slide

  16. Agile Tour 台中 by 正瑋 x Mina @ 2017.01.14
    16

    View Slide

  17. 我⼼心中的 DevOps ⼈人是什什麼?
    17
    開發⼈人 (Dev) 維運⼈人 (Ops) DevOps ⼈人
    從裝機到架站 等 Ops 架好? 耗費數⼩小時 (hr) 不⽤用 20 分 (min)
    上班 寫 code
    敲敲指令裝裝機器

    改了了什什麼常常忘記
    寫 code 管機器
    下班
    有事就 On Call

    沒事就下班
    有事就救火

    沒事就 On Call
    有事就 On Call

    沒事就讓 code

    “⾃自⼰己" 管機器

    View Slide

  18. 讓我們向被公司 On-call,回不來來的 Sammy Lin

    默哀 30 秒。

    View Slide

  19. 今天會⽤用到哪些 Tools?
    19
    Version
    Control

    (版本控制)
    Configuration

    Management

    (組態設定)
    Continuous
    Integration

    (持續整合)
    Measurement

    (測量量)
    Log
    Git

    GitLab

    GitHub
    Ansible

    Chef
    GitLab CI

    Jenkins CI

    Travis CI
    Zabbix ELK
    Provisioning (服務開通)
    Vagrant, Docker

    View Slide

  20. 今⽇日⽤用到哪些 License?
    Apache、LGPL、GPL、MIT。

    View Slide

  21. Ⅱ. 持續交付是什什麼?
    21
    可以讓我們提早下班的玩意兒!

    View Slide

  22. 持續交付是什什麼?
    《Continuous Delivery》- https://goo.gl/r9vXFg
    持續的、不間斷的、不鬆懈的。
    投遞、傳送、交付、交貨。
    22

    View Slide

  23. https://www.slideshare.net/MilesChou/continuous-delivery-78368683

    View Slide

  24. 《Continuous Delivery 中⽂文版》- https://goo.gl/SK745B
    利利⽤用⾃自動化的
    建置、測試與部署
    ,完美創造出可信賴
    的軟體發佈
    - Jez Humble & David Farley
    24

    View Slide

  25. 建置
    測試
    發佈
    部署
    ⾃自動化

    View Slide

  26. 建置
    測試
    發佈
    部署
    ⾃自動化

    View Slide

  27. 建置
    測試
    發佈
    部署
    ⾃自動化

    View Slide

  28. 建置
    測試
    發佈
    部署
    ⾃自動化

    View Slide

  29. 建置
    測試
    發佈
    部署
    ⾃自動化

    View Slide

  30. 建置
    測試
    發佈
    部署
    ⾃自動化

    View Slide

  31. 持續交付和持續部署有什什麼不同?
    前者需⼿手動發佈 (Release) ⾄至⽣生產環境 (Production),⽽而後者則⾃自動化之。
    31
    Continuous Delivery
    Continuous Deployment
    auto auto manual
    Build Deploy Test Release
    auto auto auto
    Build Deploy Test Release

    View Slide

  32. "⼯工⼈人" 交付 持續交付
    ⼈人為失誤風險 ⾼高 低
    交付週期 1 週以上 1 次 提交程式碼即交付
    交付時間 > 數⼩小時 < 5 分鐘
    可維護性
    常常於發佈時救火

    (變更更⼯工作 → 例例外⼯工作)
    即早發現,即早治療
    提早下班 難 易易
    導入持續交付的好處是什什麼?
    32

    View Slide

  33. Code 還在本機?
    推上 Git server?
    組態設定對了了?
    單元測試過了了?
    持續交付過了了?
    真 實 案 例例
    R&D:我程式寫完了了!
    我:(哪裡寫完了了?!)

    View Slide

  34. R&D:我程式寫完了了! 我:等 CD 過了了再說。
    Code 還在本機?
    推上 Git server?
    組態設定對了了?
    單元測試過了了?
    持續交付過了了?
    真 實 案 例例

    View Slide

  35. 案例例分析
    提前預演變更更⼯工作,以避免
    每次變更更都造成例例外⼯工作!
    《The Phoenix Project》
    Amazon - https://goo.gl/visckK

    View Slide

  36. Ⅲ. Ansible 是什什麼?
    36

    View Slide

  37. Ansible 取名⾃自知名⼩小說

    《安德的遊戲》,是
    虛構的超光速通訊裝置。
    有了了它我們就可以像 Ender

    指揮戰艦般的操控伺服器。
    電影海海報 - https://goo.gl/4xftZT
    37

    View Slide

  38. Ansible ⾃自 2013 年年創立,

    於 2015 年年被 Red Hat 併購。
    iThome - http://goo.gl/yJbWtz
    38

    View Slide

  39. Ansible Tower

    更更獲選 Linuxpilot 2017

    Linux & OSS 最佳解決⽅方案,
    擁有最佳系統⾃自動化管理理⽅方案

    之名。
    Linuxpilot - https://goo.gl/mSxR4E
    39

    View Slide

  40. 我⼼心中的 Ansible 是什什麼?
    1. 與 Puppet, SaltStack, Chef 並列列其四的⾃自動化組態設定
    ⼯工具 (Infrastructure as Code)。
    2. Python 陣營的組態設定⼯工具。
    3. 不需幫每台機器 (instance) 安裝 Agent,只要有 Python
    和 SSH 就可以闖天下!
    4. 容易易上⼿手,是⾺馬上可以⽤用的好物!
    5. 社群強⼤大,有商業公司⽀支持的⾃自由軟體。
    40

    View Slide

  41. View Slide

  42. Ruby
    Python
    Ansible
    SaltStack
    Chef
    Puppet

    View Slide

  43. 我⼼心中的 Ansible 是什什麼?
    1. 與 Puppet, SaltStack, Chef 並列列其四的⾃自動化組態設定
    ⼯工具 (Infrastructure as Code)。
    2. Python 陣營的組態設定⼯工具。
    3. 不需幫每台機器 (instance) 安裝 Agent,只要有 Python
    和 SSH 就可以闖天下!
    4. 容易易上⼿手,是⾺馬上可以⽤用的好物!
    5. 社群強⼤大,有商業公司⽀支持的⾃自由軟體。
    43

    View Slide

  44. 導入 Ansible ⾃自動化組態,
    我們可以減少服務中斷時間
    、測試基礎建設、降低意外
    風險,更更可以讓開發、測試
    和⽣生產環境無縫接軌。
    圖片來來源 - Ansible as Automation Glue
    44

    View Slide

  45. 真實案例例
    每週節省 26 hr 的⼯工時。
    (6 x 3) x 2 - (5 x 1) x 2 = 26 hr

    View Slide

  46. 1. 減少 (重複) 例例⾏行行性作業的⼈人⼒力力成本,提升團隊⽣生產⼒力力。
    2. 節省企業開⽀支。
    A. 以年年薪百萬計算,時薪約 $340。(1,000,000 / 365 / 8 = 342)
    B. 若若以⼀一個⽉月 4 週,⼀一年年 52 週計算 …
    案例例分析
    ↓ 26 hr / 週 = ↓ $35,360 / ⽉月 = ↓ $459,680 / 年年

    View Slide

  47. 有這類困擾?
    歡迎上 DevOps Taiwan 找⼯工作。
    https://github.com/DevOpsTW/jobs/issues
    47

    View Slide

  48. Ⅳ. 怎麼部署 Ansible 環境?
    48
    觀念念、安裝、設定

    View Slide

  49. Ansible 是怎麼運作的?
    透過 inventory 定義 Managed node,並藉由 SSH 與 Python 進⾏行行溝通。
    49

    View Slide

  50. 怎麼安裝 Ansible?
    • 只需在 Control Machine (主控端) 安裝 Ansible;
    Managed node 則需 Python 2.5+ 和 SSH。
    50
    # Debian & Ubuntu (apt).
    $ sudo apt-get install ansible
    # RHEL & CentOS (yum).
    $ sudo yum install ansible
    # Mac OS X (homebrew).
    $ brew install ansible
    # Python (pip).
    $ sudo pip install ansible

    View Slide

  51. 怎麼設定 Ansible?
    • 藉由 ansible.cfg 來來設定 inventory (host file) 檔案路路徑、
    Managed node (被控端) 使⽤用者名稱、SSH ⾦金金鑰 … 等。
    51
    $ vim ansible.cfg
    [defaults]
    # 指定 inventory 檔案路路徑。
    hostfile = hosts
    # 遠端使⽤用者名稱
    remote_user = docker
    #private_key_file = ~/.ssh/id_rsa
    # host_key_checking: 不詢問加入 ssh ⾦金金鑰
    host_key_checking = False

    View Slide

  52. inventory 是什什麼?
    • 定義 Managed node (被控端) 位址與群組的主機清冊,

    通常會⽤用來來設定 ssh 或 winrm 的連線資訊。
    52
    $ vim hosts
    # ansible_ssh_host: 遠端 SSH 主機位址。
    # ansible_ssh_port: 遠端 SSH 埠⼝口 (Port)。
    # ansible_ssh_user: 遠端 SSH 使⽤用者名稱。
    # ansible_ssh_private_key_file: 本機 SSH 私鑰檔路路徑。
    # ansible_ssh_pass: 遠端 SSH 密碼 (建議改⽤用私鑰)。
    [dev]
    ansible-demo ansible_ssh_host=127.0.0.1 ansible_ssh_pass=pwd
    [test]
    ansible-test ansible_ssh_host=172.10.10.1 ansible_ssh_port=2222
    [prod]
    ansible-prod ansible_ssh_host=10.10.10.1 ansible_ssh_user=deploy

    View Slide

  53. Ⅴ. 怎麼操作 Ansible?
    53
    Ad-Hoc command, Playbook* (Module)

    View Slide

  54. and
    54
    Playbooks
    Ad-Hoc
    commands

    View Slide

  55. 簡短的 (臨臨時性) 指令
    與⼀一般的 command line 模式雷同,
    ⼀一次透過⼀一⾏行行指令進⾏行行操作。
    Ad-Hoc
    commands

    View Slide

  56. ⼀一般的 command line 是什什麼?
    • 這裡的 command line 為 Linux Shell 底下的指令操作,
    以下為 ping 和 echo 的操作的結果。
    56
    $ 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

    View Slide

  57. 怎麼⽤用 Ad-Hoc commands?
    ansible [-m module_name] [-a args] [options]
    • host-pattern: all, server1, server1:server2, server_group.
    57
    $ 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 ⽂文件。

    View Slide

  58. 劇本
    透過事先定義好的動作 (Plays) 與
    任務 (Tasks) 來來操控伺服器。
    Playbooks

    View Slide

  59. Playbooks 是什什麼?
    • 比 Shell Script 更更結構化的腳本
    語⾔言,是⼀一鍵部署的好物。
    • 使⽤用 YAML 格式,簡單易易讀。
    (寫 code 就如同寫⽂文件)
    • 通常會有 Play, Task, Module
    和 handler 等。
    • 藉由 Jinja2 (template 系統)

    表達式,使⽤用變數、判斷式

    、迴圈等語法。
    Baby Playbook Onesie - http://goo.gl/GKJvXn
    59

    View Slide

  60. Playbooks 是什什麼?
    • ⼀一份 Playbook 可以有多個 Play、多個 Task 和多個 Module。
    • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。













    60
    $ vim example.yml
    ---
    - name: This is a Super-basic playbook.
    hosts: all
    tasks:
    - name: Hello World
    command: echo "Hello World"
    - name: Install Vim & Emacs
    become: yes
    apt: name={{ item }} state=present
    with_items:
    - vim
    - emacs
    # 去去,emacs 走。
    - name: use vi-mode in readline
    become: yes
    lineinfile: path=/etc/inputrc line="set editing-mode vi"

    View Slide

  61. Playbooks 是什什麼?
    • 執⾏行行 playbook。
    61
    $ ansible-playbook example.yml
    PLAY [This is a Super-basic playbook.] *****************************************
    TASK [setup] *******************************************************************
    ok: [ansible-demo.local]
    TASK [Hello World] *************************************************************
    changed: [ansible-demo.local]
    TASK [Install Vim & Emacs] *****************************************************
    changed: [ansible-demo.local] => (item=[u'vim', u'emacs'])
    TASK [use vi-mode in readline] *************************************************
    changed: [ansible-demo.local]
    PLAY RECAP *********************************************************************
    ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0

    View Slide

  62. Playbooks 是什什麼?
    • 執⾏行行 playbook。
    62
    $ ansible-playbook example.yml
    PLAY [This is a Super-basic playbook.] *****************************************
    TASK [setup] *******************************************************************
    ok: [ansible-demo.local]
    TASK [Hello World] *************************************************************
    changed: [ansible-demo.local]
    TASK [Install Vim & Emacs] *****************************************************
    changed: [ansible-demo.local] => (item=[u'vim', u'emacs'])
    TASK [use vi-mode in readline] *************************************************
    changed: [ansible-demo.local]
    PLAY RECAP *********************************************************************
    ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0
    TASK [setup]:被執⾏行行的 managed node 有哪些
    PLAY RECAP:總結 (ok / changed / failed )

    View Slide

  63. Plays 是什什麼?
    • 透過動作 (Play) 對特定 Managed node 進⾏行行操控,通常包含 Task 和 Module。
    • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。













    63
    $ vim example.yml
    ---
    - name: This is a Super-basic playbook.
    hosts: all
    tasks:
    - name: Hello World
    command: echo "Hello World"
    - name: Install Vim & Emacs
    become: yes
    apt: name={{ item }} state=present
    with_items:
    - vim
    - emacs
    # 去去,emacs 走。
    - name: use vi-mode in readline
    become: yes
    lineinfile: path=/etc/inputrc line="set editing-mode vi"
    Play

    View Slide

  64. Tasks 是什什麼?
    • 藉由各種不同的模組 (Module)、迴圈和判斷式等組合來來完成各種任務 (Task)。
    • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。













    64
    $ vim example.yml
    ---
    - name: This is a Super-basic playbook.
    hosts: all
    tasks:
    - name: Hello World
    command: echo "Hello World"
    - name: Install Vim & Emacs
    become: yes
    apt: name={{ item }} state=present
    with_items:
    - vim
    - emacs
    # 去去,emacs 走。
    - name: use vi-mode in readline
    become: yes
    lineinfile: path=/etc/inputrc line="set editing-mode vi"
    Task 1
    Task 2
    Task 3

    View Slide

  65. Modules 是什什麼?
    • Ansible 的內建操作⽅方法 (Method),好比 Python 的內建函式。
    • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。













    65
    $ vim example.yml
    ---
    - name: This is a Super-basic playbook.
    hosts: all
    tasks:
    - name: Hello World
    command: echo "Hello World"
    - name: Install Vim & Emacs
    become: yes
    apt: name={{ item }} state=present
    with_items:
    - vim
    - emacs
    # 去去,emacs 走。
    - name: use vi-mode in readline
    become: yes
    lineinfile: path=/etc/inputrc line="set editing-mode vi"
    Module

    View Slide

  66. 常⽤用的 Ansible Module 有哪些?

    View Slide

  67. apt
    • 適⽤用於 Debian、Ubuntu 的 apt 套件模組 (Packaging Modules)。
    • 類似的 Linux 指令有 apt, apt-get, aptitude 和 dpkg。












    67
    # 更更新套件索引 (快取),等同於 apt-get update 指令。
    - name: Update repositories cache
    become: yes
    apt:
    update_cache: yes
    # 安裝 vim 套件。
    - name: Install the package "vim"
    become: yes
    apt:
    name: vim
    state: present

    View Slide

  68. lineinfile
    • ⽤用正規表⽰示式對檔案進⾏行行插入或取代⽂文字的檔案模組 (Files Modules)。
    • 其類似的 Linux 指令為 sed。












    68
    # 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'

    View Slide

  69. shell
    • 在遠端⽤用 /bin/sh 執⾏行行 shell 指令的指令模組 (Commands Modules),
    ⽀支援變數 (variables)、< , > , | , ; 和 & 等運算。












    69
    # 藉由 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

    View Slide

  70. http://s.drx.tw/auto-with-ansible-12

    View Slide

  71. 怎麼看 Ansible Modules ⽂文件?
    ⽬目前⾼高達 1,039 個 Modules,比上次分享時多了了 203 個。

    View Slide

  72. http://docs.ansible.com/ansible/list_of_commands_modules.html

    View Slide

  73. View Slide

  74. Docs » commands Modules
    2
    有 yes 就⼀一定要⽤用
    1

    View Slide

  75. 實 戰 演 練
    Practice
    75

    View Slide

  76. 怎麼⽤用 Jupyter 操控 Ansible?
    當 inventory 為 localhost 時,是對 Control Machine 本機進⾏行行操作。

    View Slide

  77. Chu-Siang Lai / [email protected]
    Play the Ansible on Jupyter notebook !

    View Slide

  78. $ docker run -P -d chusiang/ansible-jupyter:ubuntu-16.04

    View Slide

  79. Ⅵ. GitLab CI 是什什麼?
    79

    View Slide

  80. GitLab 是什什麼?
    集 Git Repository、Docker Registry、Issue tracking、Code Review、
    CI 和 CD 於⼀一⾝身的現代平台。

    View Slide

  81. GitLab CI 可以做什什麼?
    Unit Test Integration Test Delivery Deployme
    Build
    Syntax Check

    View Slide

  82. Ⅶ. Pipeline 是什什麼?
    82
    管道 (線)?⽣生產線?傻傻分不清楚?!

    View Slide

  83. Ch 5. 部署流⽔水線解析
    Ch 6. 建置與部署的腳本化
    Ch 7. 提交階段
    Ch 8. ⾃自動化驗測試
    Ch 9. 非功能性需求測試
    Ch 10. 應⽤用程式的部署與發佈
    書上寫的 Pipeline 是什什麼?
    《Continuous Delivery》- https://goo.gl/r9vXFg
    83

    View Slide

  84. 84

    View Slide

  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

    View Slide

  86. 我⼼心中的 Pipeline 是什什麼?
    導入⾃自動化後,⾃自然顯現出來來的軟體發佈⽣生產線。

    View Slide

  87. GitLab Pipelines ⼜又是什什麼?
    圖像化的軟體發佈⽣生產線服務。

    View Slide

  88. View Slide

  89. View Slide

  90. View Slide

  91. Ⅷ. 怎麼操作 GitLab CI?
    91
    在專案底下建立 .gitlab-ci.yml,當程式碼上傳⾄至 GitLab 即會觸發 GitLab CI。

    View Slide

  92. • 使⽤用 YAML 語法進⾏行行撰寫。此範例例⼤大致可分為 1 個 stage (階段) 和

    1 個 job (⼯工作)。












    怎麼寫 .gitlab-ci.yml?
    $ vim .gitlab-ci.yml
    stages:
    - build
    build_binary:
    image: ubuntu:16.04
    stage: build
    script:
    - chmod 755 penguin-htdocs/DEBIAN
    - dpkg -b penguin-htdocs
    tags:
    - docker

    View Slide

  93. 怎麼觸發 GitLab CI?
    93
    Trigger build with git push.

    View Slide

  94. 從 Pipelines 看觸發狀狀態。

    View Slide

  95. 詳細觸發資訊。

    View Slide

  96. Ⅸ. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付?
    96
    在 GitLab CI 裡,⽤用 Ansible Docker Containers 跑 Playbooks 即可。

    View Slide

  97. Docker
    97
    Ansible
    GitLab CI

    View Slide

  98. https://hub.docker.com/r/chusiang/ansible/
    0

    View Slide

  99. $ vim .gitlab-ci.yml
    stages:
    - build
    - deploy
    - test
    - release
    build_binary:
    image: ubuntu:16.04
    stage: build
    script:
    # For fix bad permissions of control directory on GitLab CI.
    - chmod 755 penguin-htdocs/DEBIAN
    # build deb.
    - dpkg -b penguin-htdocs
    artifacts:
    expire_in: 1 week
    paths:
    - penguin-htdocs.deb
    tags:
    - docker
    ...
    99
    1

    View Slide

  100. ...
    deploy_to_dev:
    image: chusiang/ansible:alpine-3.6
    stage: deploy
    script:
    - ls
    - cd ansible-playbooks/
    - echo "${VAULT_KEY}" > secret.txt
    - ansible-playbook deploy.yml
    - rm -f secret.txt
    only:
    - [email protected]/coscup2017-cd-demo
    - [email protected]/coscup2017-cd-demo
    - [email protected]/coscup2017-cd-demo
    tags:
    - docker
    ...
    100
    2
    2

    View Slide

  101. ...
    test_dev:
    image: chusiang/ansible:alpine-3.6
    stage: test
    script:
    - cd ansible-playbooks/
    - echo "${VAULT_KEY}" > secret.txt
    - ansible-playbook test.yml
    - rm -f secret.txt
    only:
    - [email protected]/coscup2017-cd-demo
    - [email protected]/coscup2017-cd-demo
    - [email protected]/coscup2017-cd-demo
    tags:
    - docker
    ...
    101
    3

    View Slide

  102. ...
    release_to_prd:
    image: chusiang/ansible:alpine-3.6
    stage: release
    script:
    - cd ansible-playbooks/
    - echo "${VAULT_KEY}" > secret.txt
    - ansible-playbook -i production deploy.yml
    - rm -f secret.txt
    only:
    - [email protected]/coscup2017-cd-demo
    - [email protected]/coscup2017-cd-demo
    tags:
    - docker
    102
    4

    View Slide

  103. https://gitlab.com/chusiang/coscup2017-cd-demo
    5

    View Slide

  104. README.md (1/2)
    Build stage
    6

    View Slide

  105. README.md (2/2)
    Deploy, Test and
    Release stages
    7

    View Slide

  106. Pipelines
    8

    View Slide

  107. 實 戰 演 練 Ⅱ
    Practice Ⅱ
    107

    View Slide

  108. 練習環境為 Control Machine (Alpine 3.6) + Managed node*2 (Ubuntu 16.04)。
    透過 GitLab CI 和 Ansible 操控 Managed node
    108

    View Slide

  109. Fork me, and send Merge Requests !
    請於 fork 後隨意修改,並發送 MR (Pull Requests),因完整的 Pipelines 只會於
    chusiang/coscup2017-cd-demo 的特定 Branchs 和打 Tags 才會被觸發。

    View Slide

  110. CD 挑戰賽
    A. 開賽後,發送 Merge Requests

    ⾄至 http://s.drx.tw/cUET 的
    develop 和 master branch。
    B. 依提交順序收 M.R.。
    C. 兩兩條 Pipelines 共 7 個 stages
    皆需通過 (success)。
    • develop: stage × 3
    • master: stage × 4
    D. 前 3 名挑戰成功者,將獲得

    Ansible 貼紙 1 張!

    View Slide

  111. Code 還在本機?
    推上 Git server?
    組態設定對了了?
    單元測試過了了?
    持續交付過了了?
    真 實 案 例例
    R&D:我程式寫完了了,但還要

    等 CD 過了了才⾏行行。
    我:讓 Pipelines ⾶飛⼀一下吧!
    (好像可以⾶飛的再快⼀一點?!)。

    View Slide

  112. 我的 Pipeline 進化史
    Unit Test Integration Test Delivery Deployme
    Build
    Syntax Check
    Unit Test Delivery Deployme
    Build
    Syntax Check
    Unit Test
    Delivery Deployme
    Build
    Syntax Check
    Delivery Deployme
    Build
    Syntax Check
    Build
    Syntax Check
    Build

    View Slide

  113. – Chu-Siang Lai
    「持續交付是⼀一段⼈人類與企業的進化史。
    利利⽤用⼯工具進⾏行行各種加速成長的同時,
    也並藉由不斷地練習來來持續進化。」

    View Slide

  114. 參參考⽂文獻
    1. 提到 DevOps 到底在談些什什麼玩意兒? by Chen Cheng-Wei - https://goo.gl/7YTeKD
    2. Continuous Delivery - 敏捷開發的最後⼀一哩路路 by Miles - https://goo.gl/UhpAfG
    3. Ansible Documentation - http://docs.ansible.com/ansible/intro_installation.html
    4. 《Ansible: Up and Running》- https://www.ansible.com/ansible-book
    5. 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧 / 3e - https://goo.gl/vHyVDt
    6. 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧系列列⽂文章 - https://goo.gl/EOjs4I
    7. Getting started with GitLab CI | GitLab Documentation - https://goo.gl/NctsCk
    8. Demo project of COSCUP 2017 - https://gitlab.com/chusiang/coscup2017-cd-demo
    114

    View Slide

  115. 圖片來來源
    • 《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
    115

    View Slide

  116. http://s.drx.tw/cd

    View Slide

  117. DevOps Taiwan
    https://www.facebook.com/groups/DevOpsTaiwan/
    https://devopstaiwan.slack.com/
    https://gitter.im/DevOpsTW/

    View Slide

  118. Ansible Taiwan
    https://telegram.me/ansible_tw
    https://github.com/ansible-tw
    http://ansible.tw

    View Slide

  119. http://萍⽔水相逢.tw
    119

    View Slide

  120. Q & A
    嚴禁拍打餵食
    120

    View Slide

  121. END

    View Slide