วิธีโหลดไฟล์จาก Private snippet บน Gitlab CI27 April 2019DevOps

วิธีโหลดไฟล์จาก Private snippet บน Gitlab CI

บน Gitlab นั้นแต่ละ Project จะมี Snippet มาให้ใช้งานเลย ซึ่งเราสามารถเก็บ code หรือ secret key บ้างอย่างที่มันสำคัญไว้ในนี้ได้

เก็บ .env ไว้ใน snippet
เก็บ .env ไว้ใน snippet

ในการสร้าง snippet นั้นเราสามารถกำหนดได้ว่าให้เป็นแบบ Private, Internal หรือ Public  โดยที่ผมใช้ประจำก็คือเอาไว้เก็บพวกไฟล์ .env หรือ json token ต่างๆ ที่เราจะเอามาใช้ก็ต่อเมื่อจะ build app ขึ้นมา ซึ่งพวกนี้ผมจะสร้างเป็น private snippet ไว้ใช้กับเฉพาะโปรเจ็คนั้นๆ

ซึ่งในการเขียน .gitlab-ci.yml นั้นบ้าง state ผมต้องการให้มันโหลดไฟล์ snippet มาด้วยถ้าเราใช้คำสั่ง curl โหลดมาตรงๆ ก็จะไม่สามารถทำได้ ให้เราทำดังนี้

สร้าง Access Tokens

เราต้องสร้าง access tokens ใน account เรามาก่อนโดยไปที่ โปรไฟล์มุมขวาบนแล้วเลือก Setting

Setting
Setting 

มาเมนูซ้ายมือเลือก Access tokens

Access Tokens
Access Tokens

ด้านขวามือให้เรากำหนดชื่อ แล้วกำหนดสิทธิ์การเข้าถึงในที่นี้ผมจะให้มันอ่านได้แค่ api ของ gitlab ก็ติ้กเฉพาะ api โดยเราสามารถกำหนดวันหมดอายุได้ หากไม่กำหนดก็แสดงว่าต้องการให้ไม่มีวันหมดอายุ

กำหนด Token ที่จะสร้าง
กำหนด Token ที่จะสร้าง

เมื่อเรากดปุ่ม Create personal access token แล้วด้านบนจะมี Access token แสดงมาให้เราทำการก็อปปี้ไว้ สำคัญมากเพราะมันจะแสดงออกมาครั้งเดียวเท่านั้น

access token จะแสดงออกมาครั้งเดียว
access token จะแสดงออกมาครั้งเดียว

จากนั้นให้เรากลับไปที่ Project ของเรา แล้วไปที่เมนู Settings > CI / CD แล้วไปกำหนด Variables ไว้

นำ access token มาสร้างเป็น variable
นำ access token มาสร้างเป็น variable

โหลด private snippet ใน .gitlab-ci.yml

เมื่อเราได้ access token มาแล้วคราวนี้เราก็สามารถที่จะใช้คำสั่ง curl โหลดไฟล์ที่เป็น private snippet ได้แล้ว ซึ่งเขียนใน .gitlab-ci.yml ดังนี้

variables:
  PROJECT_ID: "9630807"
  ENV_URL: "https://gitlab.com/api/v4/projects/$PROJECT_ID/snippets/4611776/raw"

job-name:
  stage: release
  image: docker:latest
  services:
    - docker:dind
  script:
    - '[ -f .env ] && rm .env'
    - 'curl --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$ENV_URL" >> .env'

มาดูค่าแรกก่อน $PROJECT_ID เราสามารถดูได้จากหน้าแรกของ Project เรา

$ENV_URL ค่านี้ผมไว้เก็บ url ของไฟล์ snippet ที่เราจะโหลดมา โดย url ดังกล่าวเราต้องอ้างอิงตาม Gitlab api ในส่วนของ Snippets API โดย url จะเป็นแบบนี้

https://gitlab.com/api/v4/projects/<PROJECT_ID>/snippets/<SNIPPET_ID>/raw

PROJECT_ID ผมได้บอกไปแล้ว ในส่วนของ SNIPPET_ID ดูได้จาก

id ของ snippet
id ของ snippet

ต่อมาดูในส่วนของ script: ซึ่งเป็นส่วนที่เราจะบอกว่าใน state นี้ให้ใช้คำสั่งอะไร เราก็จะใช้ curl ในการโหลดไฟล์ snippet ของเรา

curl --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$ENV" >> src/.env

เพียงเท่านี้เราก็สามารถโหลด Private snippet มาใช้ใน .gitlab-ci.yml ได้แล้ว

ขอให้สนุกกับการเขียน gitlab-ci นะครับ

ก่อนหน้า
ถัดไป