Natcha Luang - Aroonchai

Trust me I'm Petdo

Bangkok, Thailand

[Wercker] วิธีสร้าง Wercker Steps ใช้งาน

ในตอนที่แล้วเราเรียนรู้ที่จะใช้งานเครื่องมือ automate task อย่าง Wercker กันไปแล้ว ซึ่งผมก็ทิ้งท้ายไว้ว่าจะมาเขียนถึงวิธีการสร้าง steps สำหรับใช้งานเองด้วย เพราะว่าในบางครั้ง steps ที่มีอยู่แล้วอาจจะไม่ได้อัพเดทเลยหรือไม่ก็ใช้งานไม่ได้จริง ๆ ถ้าจะให้ดีก็เรียนรู้วิธีสร้างใช้งานเองย่อมดีกว่าครับ

การสร้าง Wercker Steps ใช้งานเองนั่นจำเป็นต้องมีความรู้เรื่อง shell script อยู่ด้วยเพราะเจ้า automate task ส่วนใหญ่จะทำงานอยู่บน Linux Container แทบทั้งหมด ดังนั้นคำสั่งที่ใช้สำหรับทำงานต่าง ๆ จึงเป็น shell script นั่นเอง

สารบัญ

สร้างแอพพลิเคชัน

ตัวอย่างของบทความนี้จะเป็น steps สำหรับ deploy แอพพลิเคชันขึ้น Google AppEngine ที่ผมสร้างขึ้นมาใช้งานเองใน บทความที่แล้ว สาเหตุที่ผมสร้าง steps ใช้งานเองเพราะอันที่มีอยู่ใน registry ถ้าไม่ใช่แบบใช้ email, password ก็ใช้งานไม่ได้เพราะว่าไม่ได้อัพเดทเลย (อัพเดทล่าสุดหลักปีขึ้นทั้งนั้น)

ก่อนอื่นเราต้องสร้าง project ขึ้นมาเหมือนกันและข้างในจะมีไฟล์ run.sh สำหรับ run task ที่เราต้องการ กับไฟล์ wercker-step.yml สำหรับใช้ลงทะเบียนกับ Wercker Registry

wercker-appengine-deploy
  LICENSE
  README.md
  run.sh
  wercker-step.yml

ส่วนไฟล์ LICENSE กับ README.md อันนี้ GitHub ใส่มาให้ตอนสร้าง repository ครับไม่ได้จำเป็นสำหรับ Wercker

ตัวอย่างไฟล์ run.sh

ในตัวอย่างไฟล์ run.sh ของผมจะมีขั้นตอนการติดตั้ง unzip สำหรับใช้ extract ไฟล์ AppEngine SDK ที่ดาวน์โหลดด้วย cURL

cd $WERCKER_CACHE_DIR

command_exists()
{
  hash "$1" 2>/dev/null
}

if ! command_exists unzip; then
  sudo apt-get update
  sudo apt-get install -y unzip
fi

if [ -f "$WERCKER_CACHE_DIR/go_appengine/appcfg.py" ]; then
  debug "appcfg.py found in cache"
else
  debug "Downloading AppEngine SDK..."
  export FILE=$(curl https://storage.googleapis.com/appengine-sdks/ | grep -o 'featured/go_appengine_sdk_linux_amd64-[^\<]*' | tail -3 | head -1)
  curl -O https://storage.googleapis.com/appengine-sdks/$FILE

  debug "Extracting..."
  unzip -q `echo $FILE | awk -F / '{print $2}'`
fi

cd $WERCKER_SOURCE_DIR

debug "Starting deployment"
$WERCKER_CACHE_DIR/go_appengine/appcfg.py update "$WERCKER_SOURCE_DIR" --oauth2_refresh_token="$WERCKER_APPENGINE_DEPLOY_TOKEN"

success "Finished"

cd $WERCKER_CACHE_DIR จากคำสั่ง cd คือให้ change directory ไปที่ cache dir ของ Wercker ไฟล์ที่ถูกโหลดไว้ใน cache dir จะไม่โดนลบจนกว่าเราจะสั่งลบจากหน้า settings

Clear cache

บรรทัดต่อมาจะเป็นการตรวจสอบคำสั่ง unzip และติดตั้งด้วย apit-get ถ้าไม่มี unzip ติดตั้งอยู่ และบรรทัดต่อมาเช่นกันเป็นการตรวจสอบ appcfg.py แต่อันนี้ผมจะใช้ cURL ดาวน์โหลดจาก Google แล้วใช้ unzip ช่วยในการ extract ไฟล์

และคำสั่ง debug จะเป็นการ log ข้อความออกทาง console ของ Wercker ส่วนสำคัญคือคำสั่ง success ถ้า Wercker ไม่สามารถทำงานจนถึงบรรทัดนี้ได้จะเกิด failed state แทนที่จะเป็น success state และถ้าเราตั้ง auto trigger deploy ก็จะไม่ทำงานด้วยเช่นกัน

ตัวอย่างไฟล์ wercker-step.yml

ในส่วนของไฟล์ wercker-step.yml จะเป็นข้อมูลสำหรับลงทะเบียนกับ Wercker Registry ส่วนที่สำคัญคือ properties ตรงนี้จะเป็นฟิลด์สำหรับบอกให้ Wercker รู้ว่าเรา steps ที่เราสร้างนี้ต้องการตัวแปรอะไร ซึ่งในที่นี้ผมต้องการ refresh token ซึ่งตั้งชื่อตัวแปรว่า token เป็นประเภท string และจำเป็นต้องใส่ required: true

name: appengine-deploy
version: 1.0.1
description: Deploy your application to Google AppEngine using refresh token
properties:
  token:
    type: string
    required: true

ตรงชื่อตัวแปร (token) ตรงนี้จะส่งผลกับชื่อตัวแปร environment ของ Wercker ในไฟล์ run.sh $WERCKER_APPENGINE_DEPLOY_TOKEN อันนี้ด้วยเช่นกัน

$WERCKER อันนี้เป็น prefix ต้องมีอยู่แล้ว APPENGINE_DEPLOY อันนี้จะเป็นชื่อที่เรากำหนดใน wercker-step.yml ส่วนของ name: appengine-deploy โดยเปลี่ยน - เป็น _ TOKEN สุดท้ายอันนี้จะเป็นชื่อตัวแปรที่เรากำหนดใน wercker-step.yml ส่วนของ properties

แต่ละส่วนจะคั่นกันด้วยเครื่องหมาย _

Publish ขึ้น registry

หลังจากสร้างไฟล์ run.sh และ wercker-step.yml เสร็จเรียบร้อยแล้วขั้นตอนการ publish จะคล้ายกับตอนที่เราสร้างแอพพลิเคชันแต่จะแตกต่างกันตรงที่เราไม่ต้องสร้าง wercker.yml เพราะ Wercker จะใส่ default wercker.yml มาให้เองตอน build

วิธีสร้างแอพพลิเคชัน

หลังจากสร้างแล้วเมื่อเรา commit & push code Wercker ก็จะทำหน้าที่ build ให้เราโดยอัตโนมัติ ให้รอจนขั้นตอนการ build เสร็จจากนั้นเราจะต้องสั่ง publish โดยไปที่ Settings > Targets > Add deploy target > Wercker directory ให้เราตั้งชื่ออะไรก็ได้ (ชื่อนี้จะไม่เกี่ยวกับที่แสดงใน registry) และ ไม่ต้อง checked Auto deploy

Deploy target

จากนั้นให้กลับไปที่หน้า Builds ของแอพพลิเคชันและเลือก build ล่าสุดที่เราต้องการจะ deploy ขึ้นเป็น registry (ต้องเป็น build ที่ success เท่านั้น) คลิกเลือกเข้าไปจะเจอกับปุ่มสีฟ้า Deploy to คลิกเลือก deploy target อันที่เราเพิ่งสร้างไป รอจนกว่าจะเสร็จเรียบร้อย เท่านี้เราก็สามารถใช้งาน custom steps ของเราเองได้แล้วครับ

Deploy to

แอพพลิเคชันที่เรา deploy เป็น custom steps สามารถค้นหาได้ในหน้า Wercker Registry

Explore

Setup steps กับแอพพลิเคชันที่ต้องการ

ขั้นตอนการใช้งาน custom steps ก็ไม่ยากแค่เราใส่ชื่อ steps ที่ต้องการและถ้ามีการใช้งานตัวแปรก็แค่ tab เข้าไปตาม syntax ของ yaml แบบนี้

build:
  steps:
    ...
deploy:
  steps:
    - author/steps-name:
        varname: $ENVIRONMENT_VARIABLE
    - author/steps-name2:
...

ดูตัวอย่างการ setup steps ของผมได้ ที่นี่

Comments