ใช้ ssh ไปยัง linux server ที่ต้องการใน Gitlab-ci
สำหรับใครที่ต้องการ ssh ไปยัง linux server ที่ต้องการเพื่อ deploy ระบบ โดยให้มันทำ automation ทั้งหมดผ่าน Gitlab-ci มาดูกันว่ายังไง
สร้าง Private key ที่เครื่อง server
ไปยัง server ที่ต้องการ deploy ระบบ แล้วทำการสร้าง private key ขึ้นมา 1 ชุด
$ ssh-keygen -t ed25519
$ cd .ssh/
$ cat id_ed25519.pub >> authorized_keys
$ ls .ssh/
จากนั้นเราจะได้ไฟล์ id_ed25519
และ id_ed25519.pub
Encode ให้เป็น base64
ให้ทำการ copy id_ed25519
ออกมาเป็นไฟล์ใหม่ก่อน
$ cp id_ed25519 id_ed25519_base64
ทำการแก้ไขไฟล์ id_ed25519_base64
โดยเราจะทำการเพิ่ม 1 บรรทัดว่าง ๆ ต่อจาก private key ในบรรทัดท้ายสุด เช่น
-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----
อ้างอิง: https://github.com/openssl/openssl/discussions/21481#discussioncomment-8343177
จากให้เรา encode id_ed25519_base64
ให้เป็น base64
$ cat id_ed25519_base64 | base64 -w 0
มันได้จะ string ยาว ๆ มา 1 ชุด เช่น LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQz
ทำการเก็บไว้ก่อน
ลบ id_ed25519_base64
ได้เลย ไม่ได้ใช้แล้ว
$ rm id_ed25519_base64
เพิ่ม variable ใน gitlab
ไปที่ project ของเราใน gitlab จากนั้นไปเมนู Settings > CICD ด้านขวาเลือก Variables แล้วกดปุ่ม Add variable แล้วกำหนดค่าดังนี้
- Visibility เป็น Masked
- Protect variable ติ้กถูก
- Key ใส่ชื่อลงไปเช่น
DEPLOY_SSH_KEY
- Value ใส่ key base64 ที่ทำมา
LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQz
ทำการ Protected branches
ไปเมนู Settings > Repositories ด้านขวามือเลือก Protected branches แล้วกด Add protected branch
แล้วทำการเลือก branch ที่ต้องการสั่งให้ pipeline ทำงาน เช่น dev
และในส่วนของ Allowed to merge และ Allowed to push and merge เป็นการกำหนดให้ Role ไหนทำอะไรได้ ก็เลือกตามสะดวก
กำหนด ssh_deploy job ใน gitlab-ci.yaml
ไปยัง gitlab-ci.yaml
ของ project แล้วสร้าง job ตามนี้
variables:
SSH_URL: "user@xxx.xxx.xxx.xx"
ssh_deploy:
stage: deploy
image: alpine
dependencies: []
before_script:
- "command -v ssh-agent >/dev/null || ( apk add --update openssh )"
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- echo "$DEPLOY_SSH_KEY" | base64 -d > ./key.file
- chmod 400 ./key.file
- ssh-add ./key.file
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- $SSH_URL "ls"
- $SSH_URL "deploy command"
only:
- dev
ในส่วนของ SSH_URL
ก็ไปแก้ไขเอาตาม server นั้น ๆ และส่วนของ deploy command
ก็ใส่ command อะไรก็ได้ที่เราจะสั่งให้มัน deploy
แค่นี้ละครับ ลองเอาไปปรับแต่งกันต่อเอง...