over 3 years ago

首先,要在 Jenkins 上安裝 Warning Plugin

接著,到 Jenkins -> Configuration System 的 Compiler Warnings 區塊 新增一個 Parser,設定如下:

Name (套件的名字)
Flake8
Link name (連結的文字)
Flake8
Trend report name (圖表的標題)
Flake8
Regular Expression
^(.*):([0-9]*):([0-9]*):\ (\w{4})\ (.*)$
Mapping Script
import hudson.plugins.warnings.parser.Warning
import hudson.plugins.analysis.util.model.Priority

String fileName = matcher.group(1)
String type = matcher.group(4)
String lineNumber = matcher.group(2)
String message = matcher.group(5)
String typeCategory = String.valueOf(type.charAt(0));
String category
Priority priority = Priority.NORMAL

switch (typeCategory) {
    case "E":
        category = "PEP8 Errors"
        priority = Priority.HIGH
        break
    case "W":
        category = "PEP8 Warnings"
        break
    case "F":
        category = "PyFlakes Warnings"
        break
    case "C":
        category = "McCabe Warnings"
        break
    case "N":
        category = "Naming Conventions Errors"
        break
    default:
        category = "Unkown Warnings/Errors"
        priority = Priority.LOW
}
return new Warning(fileName, Integer.parseInt(lineNumber), type, category, message, priority)

最後,在你要使用的工作 (Job),新增一個 post-build action: Scan for compiler warnings。在此區塊選擇來源,並將 Parser 設定為剛剛新增的 Flake8 即可。

參考資料

  1. Jenkins Code Analysis
  2. Flake8 Warnings
 
over 3 years ago

前篇:自動化利器 Ansible 簡介,簡單的說明了 Ansible 單一指令的使用方式。但是,單一指令是讓你熟悉、測試功能時使用。想要自動化,我們需要將這些指令寫成一個劇本 (Playbook),讓 ansible 替我們去執行。

特色

  1. 以 YAML 作為語法
  2. 可以使用 jinja2 來使用變數

實際操作

例子

首先,先建立 hosts

hosts
[test]
172.16.11.11

接著,從一個簡單的例子開始:

my_tasks.yml
---

# Goal: Install virtualenv on managed server



- hosts: test

  remote_user: root

  vars:

    - project_name: "TestAnsible"

  tasks:

    - name: Install python virtualenv

      action: apt pkg=python-virtualenv state=present


    - name: Create my project folder

      action: shell mkdir {{project_name}}


說明

其實,光看這個 Playbook 大概就能推敲出一些結論:

  1. 我們要在 test 執行這個劇本。test 或許是一個節點,當然也可能是一群節點。test 的定義來自於 hosts ,也就是前篇提過的 Inventory。
  2. 我們要用 root 來登入,並執行這些工作 (task)
  3. 這個劇本有一個 project_name 的變數
  4. 我們的工作有 2 個,分別是 安裝套件 以及 建立目錄

執行

最後,執行這個劇本:

$ ansible-playbook -i hosts my_tasks.yml

沒錯誤的話,會得到下面結果

PLAY [test] *******************************************************************

GATHERING FACTS ***************************************************************
ok: [172.16.11.11]

TASK: [Install python virtualenv] *********************************************
ok: [172.16.11.11]

TASK: [Create my project folder] **********************************************
changed: [172.16.11.11]

PLAY RECAP ********************************************************************
172.16.11.11               : ok=3    changed=1    unreachable=0    failed=0

工作 (Task)

tasks 區塊的每一個項目,都是一個工作 (廢話)。主要的屬性有:

  1. name - 這只是一個描述,說明了這個工作想要做什麼。
  2. action - task 實際上會去,遠端執行的工作。第一個變數來自於 ansible 的 module ,接著會是 module 的參數。

以第一個工作 apt 為例,想當然爾就是 apt-getpkg 是我想操作的套件,state 是這個套件的狀態,是要存在 (present) 呢?還是不存在 (absent)?可以依照實際需求去設定。

第二個工作,是大家相對比較熟悉的 shell 指令,後面接的就是我們希望在 shell 上執行的工作。大家會發現有 {{project_name}} 這個 template 的語法存在。用過 django 或是 jinja2 的朋友肯定對此相當熟悉。這就是 ansible 的變數代換功能,變數的來源則來自上方的 vars 區塊。

ansible 的 module 太多了,在此無法一一列舉。如果有什麼問題,歡迎與我討論。

 
over 3 years ago

最近在自動化的工作上嘗試使用 Ansible。會選擇它,主要的原因是,它是使用我最熟悉的語言 Python 寫的。

特色

  1. Made in Python。
  2. 被操控的節點 (Managed node) 只需要 Python 跟 SSH,夠單純。
  3. 用 YAML 寫劇本 (Playbook) 簡單易讀好維護。

安裝

Control Machine (操縱端)

$ pip install paramiko PyYAML jinja2 httplib2 ansible

是不是覺得裝太少,怪怪的?

Managed Node (被操縱端)

基本上,Ubuntu 灌好,裝完 openssh-server 就可以了。

初步使用

使用前

為了確保接下來的實驗能順利進行,請先確認 Managed Node 已經植入了適當的 authorized_keys。簡單的說,就是 ssh 該機器完全不需要打密碼。

執行單一指令

首先,隨意建立一個工作目錄。在此目錄下新增一個 hosts 的檔案。這個檔案稱做 Inventory File。主要的功能是定義 節點變數

hosts
[test]
172.16.11.11
用法
ansible -m [module] -i [inventory file] -u [remote user] <target host>
  • -m - 所有能使用的 module,都列在官網上。也有使用的範例。
  • -i - 指定參照的 inventory file,本例是 hosts
  • -u - 指定用來登入該節點的帳號
  • target host - 從 inventory 中,挑選出要本次指令執行的對象

現在就可以試試我們的第一個指令 ping

$ ansible -m ping -i hosts -u root test
172.16.11.11 | success >> {
    "changed": false,
    "ping": "pong"
}

接著,我們來看看 Ansible 劇本

 
over 3 years ago

首先,headless 這個單字我還是第一次聽到。若不是我同事,我可能需要多花一些功夫才能找到這個 Term。

First Google

參考 Selenium Headless Automated Testing in Ubuntu,要設計 headless 自動化測試,只需要安裝 xvfb,利用它開出一個假桌面即可,相當簡單吧?

有興趣可以自己試試看,但我可沒用過!

Second Google

因為我發現 Python 其實已經有套件把這些事情都完成了。那就是 PyVirtualDisplay。它是基於 Xvfb, Xephyr, Xvnc 的 Display 套件。若要開啟隱形的螢幕,請記得要安裝 Xvfb 喔。

程式範例如下:

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(1024, 786)) # visible = 0 代表使用 xvfb 建立 Display 物件

display.start() # 開始!

browser = webdriver.Firefox()
browser.get('http://www.google.com')
browser.quit()
display.stop()

參考資料

  1. Python - Headless Selenium WebDriver Tests using PyVirtualDisplay
 
over 3 years ago

故事的開始,是在 2/25 參加了 Docker Taipei #1 Meetup後,對 Docker 有了一些基本的認識。在使用過後,就愛不釋手。

特色

  1. 佈署快 - 少了建立 Guest OS。
  2. 版本控制 - 利用 Btrfs 做出檔案系統的差異,可以隨時回溯至特定版本。
  3. Isolation - 每個 container 都是獨立、乾淨的檔案系統。

指令

一般來說,開始使用的第一件事是下載 base image.

$ docker pull ubuntu

Usage: docker pull [image_name]

Python 有個 PyPi Server,Docker 也有一個 Docker Indexdocker pull 預設的下載來源就是 Docker Index。

執行剛剛下載的 ubuntu base image

$ docker run -i -t ubuntu bash 

Usage: docker run -i -t [image_name] [command]
-i: interactive mode
-t: pseudo tty

Shortcuts

  • 清除所有未執行的 container

    docker rm `docker ps -a -q`
    
  • 清除所有未被標記的 image

    docker rmi `docker images | grep "^<none>" | awk '{print $3}'`
    

Gotcha

  1. 僅能運行於 Linux Kernel 的作業系統。因為它使用 Linux Kernel 的 cgroups 來實作 container 的隔離環境。
  2. 不能使用 upstart
  3. 無法在 container 中,修改 kernel module,因為 kernel 是共用的。

參考資料

  1. Docker Reference: Run
  2. Automated deployment with Docker – lessons learnt
  3. How to auto restart a docker container after a reboot
  4. How to remove old docker.io containers
  5. Remove all untagged images
  6. Dockerが利用しているAUFSとLXC