Deploy Rails with Docker Swarm (4) - Gitlab Runner 自動化部署
簡巧恩, Rails 工程師
Sep 6, 2022
自動化部署 with Gitlab Runner
Registration
進入上一篇開好的 Manager EC2,並且此時的 EC2 應該已經安裝好 Gitlab Runner,這時候可以直接註冊我們的 Runner:sudo gitlab-runner register
,下好指令後一共會問七個問題:
- Gitlab instance URL
- Registration Code
- 前兩個問題可以進入到 Gitlab project > Settings > CI/CD > Runner 去查看設定細節,如附圖的左側
- Description for runner: docker
- 附圖右側白底黑字的部分
- Tags for runner(comma seperated): prod
- 附圖藍底部分,且這個 tag 是在後續指定 job 要哪個 runner 執行的依據
- Optional maintenance note for runner: (optional)
- Enter the executor: docker
- Default Docker image:
tiangolo/docker-with-compose
- 後續的 job 需要 compose 幫我們 build image,因此需要指定這個 image
.gitlab-ci.yml
這邊主要也是參考 dockerswarm.rocks 的範例,以下簡單介紹一下他的設定內容:
- Stage: 分為 build 與 deploy
- Build:
docker-compose build --build-arg RAILS_MASTER_KEY=$RAILS_MASTER_KEY
單純只有 build image,但因為我的 Dockerfile 包含了 Asset Precompile,因此需要帶入RAILS_MASTER_KEY
做為參數 - Deploy:
docker stack deploy -c docker-compose.yml [stack name]
- Build:
- Only: 指定發生於 main branch
- Tags: 用於指定執行的 runner
EC2 Prerequisites
因為 Traefik 與 Rails App 為獨立的兩個 Stack,為了簡化開發流程,這邊選擇手動進入 EC2 部署 Traefik
原本是另外開一個 traefik 分支做 Traefik 部署(並且指定 Traefik 部署的 job 只發生在該分支、只會發生一次),但在演講時有人反映不確定 traefik 分支部署後要不要合到 main 分支上、git graph 有點不明確,因此改為以公司實際部署的流程做介紹。
- 開啟一個 swarm:
docker swarm init --default-addr-pool 10.20.0.0/16
- 因為 Docker 預設的 subnet range 與 EC2 相同,都是
10.0.0.1
,因此這邊要特別指定不一樣的範圍, Swarm 才連的到外網
- 因為 Docker 預設的 subnet range 與 EC2 相同,都是
- 開啟 traefik network:
docker network create --driver=overlay traefik-public
- 取得現在的 swarm manager node id:
export NODE_ID=$(docker info -f '{{.Swarm.NodeID}}')
- 指定 traefik 每次都 deploy 在同一個 node & volume 上:
docker node update --label-add traefik-public.traefik-public-certificates=true $NODE_ID
- 部署 traefik:
docker stack deploy -c traefik.yml traefik
最後就是把 App 推上 GitLab 進行部署ㄌ!!!
Worker Node 加入 Docker Swarm
到這邊設定完 Manager 節點後,我們可以回去開 Worker Template,把加入 Swarm 的指令加回去:
- 先在 Manager 找回加入 Swarm 的指令:
docker swarm join-token worker
- 在 Worker Template 的 User Data 中加入剛剛找回的指令,於是最終的 User Data 會長下面這樣:
#!/bin/bash # Start docker daemon sudo service docker start sudo chown ec2-user:docker /var/run/docker.sock # Join swarm docker swarm join --token [JOIN-TOKEN] [IP-ADDRESS]:2377
到這邊主要的技術設定都結束了……真的是超多內容要介紹:) 下一篇會補充一些相關的議題討論,還有這次 COSCUP 演講的心得,希望我不要隔太久才把文章生出來:)
想要閱讀更多來自五倍紅寶石軟體開發的技術分享?歡迎訂閱我們的月報,每月將自動幫你送上最新文章。