最近在寫一些小玩具的時候,一次次的測試,打包,部署流程太麻煩了,正好代碼都放在github上,因而就是打算用travis-ci來進行持續集成 解放雙手.java
dockerfile
+ docker-compose
來構建docker容器travis-ci
+ github
來hook repo
的變更travis-ci
調用 dockerfile
打包 docker image
並push到dockerhub
travis-ci
ssh 登陸到目標機器,copy docker-compose
並執行來完成部署太簡單了 從略git
因爲項目是基於java
+gradle
來構建的,因此dockerfile
須要進行多階段構建github
先build出fat-jar來:docker
#以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環境ubuntu
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命令執行不了bash
多階段構建須要聲明--from的上一個階段,不然copy不到jar包服務器
version: '2'
services:
xxx-service:
image: xxx:latest
container_name: xxx
environment:
- JAVA_TOOL_OPTIONS=-Xms128m -Xmx256m
ports:
- "9000:8080"
複製代碼
language: bash
services:
- docker
sudo: required
branches:
only:
- master
script:
- docker build . -t "xxx:latest"
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"
複製代碼
分解一下:app
敏感信息這裏能夠經過Travis CI
的環境變量來設置,能夠避免是公開倉庫而泄露 ssh_key能夠使用Travis CI
的加密key來避免泄露ssh
完成這些以後,每次在push代碼到deploy分支上的時候,就能夠愉快的去玩耍了,Travis會自動的進行編譯並部署,若是想要查看部署進度,咱們能夠打開commit點擊後面的編譯狀態圖標去查看具體的Travis進度。測試