1. 程式人生 > 程式設計 >基於Github Travis-ci Docker自動化部署

基於Github Travis-ci Docker自動化部署

實現思路

  1. Dockerfile + docker-compose來構建docker容器
  2. travis-ci + github 來hook repo的變動
  3. travis-ci 呼叫 Dockerfile打包 docker image並push到dockerhub
  4. travis-ci ssh 登入到目標機器,copy docker-compose並執行來完成部署

docker容器構建

由於專案是基於java+gradle來構建的,所以dockerfile需要進行多階段構建

先build出fat-jar來:

#以gradle 為基礎構建build環境
FROM gradle:5.2.1-jdk8-alpine
AS build-env #copy原始碼 ADD --chown=gradle . /app WORKDIR /app #執行gradle task進行build RUN gradle assemble --info 複製程式碼

將jar包copy到jre環境:

FROM openjdk:8-jre
# 時區
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  && echo Asia/Shanghai > /etc/timezone \
  && dpkg-reconfigure -f noninteractive tzdata
# port
EXPOSE 9000
#copy
COPY --from=build-env /app/build/libs/xxx.jar /app/bin/xxx.jar
#執行
CMD ["java","-jar","/app/bin/xxx.jar"]

複製程式碼

這裡需要注意的是ADD的時候要授予許可權,否則gradle命令執行不了,多階段構建需要宣告--from的上一個階段,否則copy不到jar包。

docker-compose.yaml

version: '2'
services:
  xxx-service:
    image: xxx:latest
    container_name: xxx
    environment:
      - JAVA_TOOL_OPTIONS=-Xms128m -Xmx256m
    ports:
      - "9000:8080"

複製程式碼

.travis.yaml

language: bash
services: - docker sudo: required branches: only: - master script: - docker build . -t "xxx:latest" - docker-compose -f docker-compose.yaml down - docker-compose -f docker-compose.yaml up -d --force-recreate - docker-compose -f docker-compose.yaml down after_success: - docker login --username=username -p="password" dockerhub - docker push dockerhub:latest - chmod 600 id_rsa - scp -o "StrictHostKeyChecking no" -i id_rsa docker-compose.yml ubuntu@ip:/home/ubuntu/docker/ - ssh -o "StrictHostKeyChecking no" -i id_rsa ubuntu@ip "cd /home/ubuntu/docker/;sudo docker-compose -f docker-compose.yml pull;sudo docker-compose -f docker-compose.yml up -d;exit" 複製程式碼

分解一下:

  • 宣告language:bash
  • services選擇docker環境
  • script 啟動docker image build
  • after_success構建完成之後,登入dockerhub,push image,登入伺服器並cp執行docker-compose.
  • ssh 後跟的"命令"會在登入成功後執行

敏感資訊這裡可以通過Travis CI的環境變數來設定,可以避免是公開倉庫而洩露 ssh_key可以使用Travis CI的加密key來避免洩露