centos7+docker+Jenkins+svn搭建自動化部署平臺
1. centos7
-
tips
公司服務器配置(1T機械+256固態+i7的u) 需要我們把系統,環境(java,mysql,redis,docker等)裝到固態上(速度快),我們的代碼放到機械上。分區情況如下圖
2. centos7中安裝docker1.31.1
自行百度,此處無坑
3. centos7安裝配置java8,maven,redis,mysql
-
安裝jdk1.8 和 maven 時儘量採用壓縮包解壓的方式,採用
yum
有坑。我的安裝路徑 -
配置環境
vim /etc/profile
,配置結果如圖#java,maven環境配置 #用':'分割不同的配置 export JAVA_HOME=/mydata/java/jdk MAVEN_HOME=/mydata/java/maven export PATH=$JAVA_HOME/bin:$PATH:${MAVEN_HOME}/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
centos7安裝mysql5.7,參考鏈接:
https://www.cnblogs.com/helf/p/11244711.html - centos7安裝redis,參考鏈接:
https://www.cnblogs.com/zuidongfeng/p/8032505.html
4. docker中安裝 Jenkins
-
下載
Jenkins
的docker
鏡像:docker pull jenkins/jenkins:lts
-
在
Docker
容器中運行Jenkins
://此處因爲java和maven是在linux上直接裝的而Jenkins在docker上裝的所以必須掛載jdk和maven(坑) //-v命令進行掛載,其中冒號前面的是本機的目錄; //必須將本機的javahome和mavenhome的路徑,掛載到Jenkins容器上 //冒號後面是容器上的目錄,可以寫跟本機目錄相同。 docker run -p 8080:8080 -p 50000:5000 --name jenkins \ -u root \ -v /mydata/java/jdk/bin/java:/mydata/java/jdk/bin/java \ -v /mydata/java/jdk:/mydata/java/jdk \ -v /mydata/java/maven:/mydata/java/maven \ -v /mydata/jenkins_home:/var/jenkins_home \ -d jenkins/jenkins:lts
-
忘記
Jenkins
初始化密碼,使用docker logs jenkins
查看日誌 -
配置如圖
5. centos7 安裝 svn
參考鏈接:https://www.cnblogs.com/zhangheliang/p/8724605.html
6. Jenkins 和 svn整合
-
Jenkins
的配置
還有一種沒有去掉勾的方式,我獲取 crumb 值的時候報404,爲解決,有需要自行百度
-
svn
的配置 -
在生成的
post-commit
中加入下面的代碼curl -X post -v -u admin:117f598cc5f81226faaac0ceff40b367da http://ip:8080/jenkins/job/jenkinsdemo/build?token=APPLE_TOKEN
7. shell腳本和DockerFile文件
#!/bin/bash
#操作/項目路徑(Dockerfile存放的路徑),每個項目都有對應的dockerfile
DOCKERFILE_PATH=/mydata/jenkins_home/workspace/jenkinsdemo/src/main/docker
#jenkins工作空間
SOURCE_PATH=/mydata/jenkins_home/workspace
#docker 鏡像/容器名字或者jar名字 這裏都命名爲這個
SERVER_NAME=jenkinsdemo
JAR_NAME=demo-0.0.1-SNAPSHOT
#獲取容器id
CID=$(docker ps | grep "${SERVER_NAME}" | awk '{print $1}')
#獲取鏡像id
IID=$(docker images | grep "${SERVER_NAME}" | awk '{print $3}')
DATE=`date +%Y%m%d%H%M`
# 備份
function backup(){
if [ -f "${DOCKERFILE_PATH}/${SERVER_NAME}.jar" ]; then
echo "${SERVER_NAME}.jar 備份..."
cp ${DOCKERFILE_PATH}/${JAR_NAME}.jar ${DOCKERFILE_PATH}/backup/${SERVER_NAME}-$DATE.jar
echo "備份 ${JAR_NAME}.jar 完成"
else
echo "${DOCKERFILE_PATH}/${JAR_NAME}.jar不存在,跳過備份"
fi
}
# 最新構建代碼 移動到項目環境
# 把最新構建的jar包放到和dockerfile同級的目錄
function transfer(){
echo "啦啦啦 ${DOCKERFILE_PATH}"
echo "最新構建代碼 ${SOURCE_PATH}/${SERVER_NAME}/target/${JAR_NAME}.jar 遷移至 ${DOCKERFILE_PATH}"
cp ${SOURCE_PATH}/${SERVER_NAME}/target/${JAR_NAME}.jar ${DOCKERFILE_PATH}/
echo "遷移完成"
}
# 修改訪問權限
function changemod(){
echo "修改 ${DOCKERFILE_PATH}/${JAR_NAME}.jar 的訪問權限"
cd ${DOCKERFILE_PATH}
chmod 777 ${JAR_NAME}.jar
echo "修改訪問權限完成"
}
# 構建docker鏡像
function build(){
if [ -n "$IID" ]; then
echo "存在${SERVER_NAME}鏡像,IID=$IID"
echo "停止容器docker stop $CID"
docker stop $CID
echo "刪除容器 docker rm $CID"
docker rm $CID
echo "刪除鏡像 docker rmi ${SERVER_NAME}"
docker rmi ${SERVER_NAME}
echo "構建鏡像 docker build -t "${SERVER_NAME}" ."
cd ${DOCKERFILE_PATH}
docker build -t="${SERVER_NAME}" .
else
echo "不存在${SERVER_NAME}鏡像,開始構建鏡像 docker build -t ${SERVER_NAME} . "
cd ${DOCKERFILE_PATH}
docker build -t="${SERVER_NAME}" .
fi
}
# 運行docker容器
function run(){
backup
transfer
changemod
build
echo "docker run創建容器... docker run -d --name=${SERVER_NAME} -p 8002:8082 -v ${DOCKERFILE_PATH}:${DOCKERFILE_PATH} jenkinsdemo:latest"
docker run -d --name=${SERVER_NAME} -p 8002:8002 -v ${DOCKERFILE_PATH}:${DOCKERFILE_PATH} jenkinsdemo:latest
echo "${SERVER_NAME}容器創建完成"
}
#入口
run
# 該鏡像需要依賴的基礎鏡像
FROM java:8
# 將當前目錄下的jar包複製到docker容器的/目錄下
ADD demo-0.0.1-SNAPSHOT.jar /jenkinsdemo.jar
# 運行過程中創建一個mall-tiny-docker-file.jar文件
RUN bash -c 'touch /jenkinsdemo.jar'
# 聲明服務運行在8083端口
EXPOSE 8083
# 指定docker容器啓動時運行jar包
ENTRYPOINT ["java", "-jar","/jenkinsdemo.jar"]
# 指定維護者的名字
MAINTAINER zhaoguozhen
8. Docker安裝可視化工具Portainer
參考鏈接:https://my.oschina.net/zhengqingya/blog/3066410
9.結果
10. TIPS
-
docker
是通過dockerfile
來講代碼打包成docker
鏡像並運行的,多個子工程(微服務)也可以使用Docker Compose
來部署(這個東西類似於批處理,使用一個命令部署配置的所有服務) -
shell
腳本中的變量打印不出來考慮換個名稱比如:
BASE_PATH
換成DOCKERFILE_PATH
,shell 腳本就可以執行成功 -
訪問鏈接打不開,考慮是否打開防火牆和權限
#打開防火牆 firewall-cmd --zone=public --add-port=9000/tcp --permanent #重新加載 firewall-cmd --reload #查看開放的端口 firewall-cmd --list-ports
-
大白話理解 CI CD
把代碼打包成容器叫CI,把容器部署到服務器是CD
11. 後記
- 通過下面這張圖,GitHub webhook 要求必須是公網 IP
-
自動化部署平臺理解
-
上面只是橫向弄好了,豎向還沒弄好。下面需要弄個docker管理器,將打包好的代碼鏡像人工選擇放到docker集羣中的某個docker上