在現在的互聯網時代,隨着軟件開發複雜度的不斷提升,軟件開發和發佈管理也愈來愈重要。目前已經造成一套標準的流程,最重要的組成部分就是持續集成(Continuous Integration,CI)及持續部署、交付(CD)。在此,咱們來以一個案例初步瞭解 CI 流程。那麼什麼是 CI 呢?簡單來說,CI 就是將傳統的代碼合併、構建、部署、測試都集成在一塊兒,不斷地執行這個過程,並對結果進行反饋。
CI 流程設計圖:
工做流程:html
服務器規劃:
IP地址 角色
192.168.30.21 Jenkins,Docker,JDK,Maven
192.168.30.22 Harbor(Docker,docker-compose),Gitjava
1. 部署Git代碼版本倉庫
git是一個系統,可是沒有守護進程,可讓ssh做爲通訊node
[root@harbor-git ~]# yum install git -y [root@harbor-git ~]# useradd git [root@harbor-git ~]# passwd git
更改用戶 git 的密碼 。
新的 密碼:
無效的密碼: 密碼是一個迴文
從新輸入新的 密碼:
passwd:全部的身份驗證令牌已經成功更新。mysql
而後經過這個Git遠程操做這個倉庫,通常git裏面都加個.gitlinux
[root@harbor-git ~]# su - git [git@harbor-git ~]$ mkdir demo.git
初始化這個git倉庫,搭建完成git
[git@harbor-git ~]$ cd demo.git/ [git@harbor-git demo.git]$ git --bare init
初始化空的 Git 版本庫於 /home/git/demo.git/github
如今開始使用,git能夠當成客戶端,也能夠當成服務端來用[root@jenkins ~]# yum install git -y
web
Jenkins主機測試訪問該倉庫:sql
[root@jenkins ~]# git clone git@192.168.30.22:/home/git/demo.git 正克隆到 'demo'... git@192.168.30.22's password:
warning: 您彷佛克隆了一個空版本庫。docker
模擬生產項目,拉取github上的一個demo,並上傳至本地git庫
這裏我是一個java的測試項目,而後演示一下
進入咱們拉代碼空倉庫裏,把咱們的項目拷貝進去
[root@jenkins ~]# git clone https://github.com/xxx/tomcat-java-demo.git [root@jenkins ~]# cd demo/ [root@jenkins demo]# cp ../tomcat-java-demo/* ./ -rf [root@jenkins demo]# ls db Dockerfile LICENSE pom.xml README.md src
提交分爲三步
提交到咱們的暫存區[root@jenkins demo]# git add .
從暫存區提交到咱們的本地倉庫,本地也是一個倉庫[root@jenkins demo]# git commit -m 'all'
這裏可能會報錯
[root@jenkins tomcat-java-demo]# git commit -m "all" *** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: unable to auto-detect email address (got 'root@jenkins.(none)')
解決方案:須要添加郵件和name,在.git的隱藏文件下的config文件內,添加如下配置
[root@jenkins demo]# cd .git/ [root@jenkins .git]# ls branches config description HEAD hooks index info objects refs [root@jenkins .git]# vim config [user] name = zhaocheng email = 1741845455@qq.com [root@jenkins .git]# git config user.name "zhaocheng" 這裏在demo下執行,否則找不到相應指令 [root@jenkins demo]# git commit -m "all"
執行成功
推送到遠程master分支裏面
[root@jenkins demo]# git push origin master git@192.168.30.22's password: Counting objects: 179, done. Delta compression using up to 2 threads. Compressing objects: 100% (166/166), done. Writing objects: 100% (179/179), 1.12 MiB | 0 bytes/s, done. Total 179 (delta 4), reused 0 (delta 0) To git@192.168.30.22:/home/git/demo.git * [new branch] master -> master
2.在全部主機安裝docker
Docker版本
社區版:CE 企業通常用
企業版:EE 通常研究docker的公司用
官方網址:https://docs.docker.com
yum安裝
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
添加Docker軟件包源
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
安裝Docker-ce
$ sudo yum install docker-ce 啓動Docker $ sudo systemctl start docker
二進制安裝docker,離線https://download.docker.com/linux/static/stable/x86_64/
這裏也能夠不用官方的docker-ce源,用阿里雲的也能夠,阿里的速度快一些
阿里雲源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
建議使用daocloud的加速器
該腳本能夠將 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 配置完重啓docker $ sudo systemctl restart docker
3.部署Harbor私有倉庫
下載好harbor上傳咱們的根目錄,下載地址Harbor官方下載
https://github.com/goharbor/harbor
[root@harbor-mysql ~]# ls harbor-offline-installer-v1.8.1.tgz
部署下載安裝docker-compose
Docker-compose文檔地址https://docs.docker.com/compose/install/
[root@harbor-mysql ~]# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose [root@harbor-mysql ~]# chmod +x /usr/local/bin/docker-compose [root@harbor-mysql ~]# docker-compose --version docker-compose version 1.24.1, build 4667896b
部署Harbor服務
[root@harbor-mysql ~]# tar xf harbor-offline-installer-v1.8.1.tgz -C /usr/local [root@harbor-mysql ~]# cd /usr/local/harbor/ [root@harbor-mysql harbor]# ls harbor.v1.8.1.tar.gz harbor.yml install.sh LICENSE prepare [root@harbor-mysql harbor]# vim harbor.cfg 修改配置文件yml,修改安裝的ip地址 Hostname : 192.168.30.24:80
啓動並安裝Harbor
配置完成後就能夠啓動Harbor了[root@harbor-git harbor]# ./install.sh
訪問本機
經過Dockerfile部署java鏡像並推送鏡像倉庫
這裏構建的時候須要注意版本問題,每次官方更新就會更改tomcat的版本,構建鏡像的時候寫dockerfile須要注意
[root@localhost Dockerfile]# vim Dockerfile-tomcat FROM centos:7 MAINTAINER www.xxx.com ENV VERSION=8.5.43 RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \ yum clean all && \ rm -rf /var/cache/yum/* RUN wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \ tar zxf apache-tomcat-${VERSION}.tar.gz && \ mv apache-tomcat-${VERSION} /usr/local/tomcat && \ rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \ mkdir /usr/local/tomcat/webapps/test && \ echo "ok" > /usr/local/tomcat/webapps/test/status.html && \ sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/tomcat/bin WORKDIR /usr/local/tomcat EXPOSE 8080 CMD ["catalina.sh", "run"] [root@localhost Dockerfile]# docker build -t tomcat:v1 -f Dockerfile-tomcat . [root@jenkins Dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat v1 727bd5f299ba 4 seconds ago 427MB centos 7 67fa590cfc1c 30 hours ago 202MB
jenkins主機配置對harbor倉庫的信任,由於是http配置
[root@jenkins ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["http://f1361db2.m.daocloud.io"], "insecure-registries": ["192.168.30.22"] } [root@jenkins ~]# systemctl restart docker [root@jenkins ~]# docker login 192.168.30.22 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
推送tomcat鏡像到咱們的harbor倉庫上
[root@jenkins ~]# docker tag tomcat:v1 192.168.30.22/library/tomcat:v1 [root@jenkins ~]# docker push 192.168.30.22/library/tomcat:v1
4.jenkins環境部署
去官方網站下載war包,下載tomcat和maven包和jdk
https://jenkins.io/zh/
[root@jenkins ~]# ls demo jenkins.war apache-maven-3.6.1-bin.tar.gz Dockerfile tomcat-java-demo apache-tomcat-9.0.22.tar.gz [root@jenkins ~]# tar xf apache-tomcat-9.0.22.tar.gz [root@jenkins ~]# mv apache-tomcat-9.0.22 /usr/local/tomcat_jenkins [root@jenkins ~]# cd /usr/local/tomcat_jenkins/
刪除不用的配置
[root@jenkins tomcat_jenkins]# cd webapps/ [root@jenkins webapps]# rm -rf * [root@jenkins webapps]# unzip /root/jenkins.war -d ROOT
解壓並啓動jenkins
[root@jenkins ~]# tar xf apache-maven-3.6.1-bin.tar.gz [root@jenkins ~]# tar xf jdk-8u191-linux-x64.tar.gz [root@jenkins ~]# mv jdk1.8.0_191/ /usr/local/jdk [root@jenkins ~]# mv apache-maven-3.6.1 /usr/local/maven [root@jenkins ~]# vim /etc/profile JAVA_HOME=/usr/local/jdk PATH=$PATH:$JAVA_HOME/bin:/usr/local/maven/bin export JAVA_HOME PATH [root@jenkins ~]# source /etc/profile [root@jenkins ~]# java -version openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode) [root@jenkins ~]# mvn mvn mvnDebug mvnyjp [root@jenkins ~]# cd /usr/local/tomcat_jenkins/bin/ [root@jenkins bin]# ./startup.sh Using CATALINA_BASE: /usr/local/tomcat_jenkins Using CATALINA_HOME: /usr/local/tomcat_jenkins Using CATALINA_TMPDIR: /usr/local/tomcat_jenkins/temp Using JRE_HOME: /usr/local/jdk/bin Using CLASSPATH: /usr/local/tomcat_jenkins/bin/bootstrap.jar:/usr/local/tomcat_jenkins/bin/tomcat-juli.jar Tomcat started.
訪問jenkins,默認本機8080端口,登陸查看咱們的密碼進行登陸
[root@jenkins ~]# cat .jenkins/secrets/initialAdminPassword 2691cf7fb7824a2e8015b2b546319b03
5. Jenkins流水線部署
pipeline 是一套運行於jenkins上的工做流框架,將本來獨立運行於單個或者多個節點的任務鏈接起來,實現單個任務難以完成的複雜流程編排與可視化。
建立一個pipeline類型的Job:
安裝所需插件git,pipeline
6.經過流水線發佈java項目
經過pipeline/jeninsfile流水線腳本,經過文本文件來描述生命週期
整個pipeline裏面通過各個階段,以最清晰的描述來造成咱們最終達成的效果
安裝jenkins pipeline插件
Pipeline先最簡單的語法進行演示流水線的發佈
構建以後查看控制檯
這個腳本也能夠本身生成,須要加上認證寫個地址認證信息就能夠了,這裏的pileline是模版,咱們能夠拿這個模版再去修改咱們的pipeline
地址就是咱們這個分支,添加進去
[root@jenkins demo]# cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [user] name = zhaocheng email = 1741845455@qq.com [remote "origin"] url = git@192.168.30.22:/home/git/demo.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master
由於咱們這裏是須要認證的用戶名Git和密碼去認證的,拉代碼和推代碼都是須要寫代碼的
咱們這裏還須要添加個憑據,通常都是基於祕鑰對對作認證的,也就是咱們經過ssh生成
一個公鑰和私鑰,將公鑰放到git服務器上,私鑰本身拿着,用私鑰去認證,這樣就不用密碼了,由於jenkins是自動化,不可能人工去輸入密碼
[root@jenkins ~]# ssh-keygen Id_rsa是私鑰,id_rsa.pub是公鑰 [root@jenkins ~]# ls .ssh/ id_rsa id_rsa.pub known_hosts 如今咱們將公鑰推送到Git服務器上,拿這個祕鑰來作免祕鑰登陸 [root@jenkins ~]# ssh-copy-id git@192.168.30.22
這樣就能夠免交互登陸git這臺服務器上了,由於咱們拉代碼就是使用的這個帳戶,只要有這個私鑰就不須要輸密碼了
[root@jenkins ~]# cat .ssh/id_rsa -----BEGIN RSA PRIVATE KEY----- .......
將私鑰密碼保存到git上,放到下面這個位置
把咱們的pipeline生成的拉取代碼的信息替換成咱們剛纔生成的
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '1d00c1d2-6b5a-4e53-8925-144aacdc289d', url: 'git@192.168.30.22:/home/git/demo.git']]])
參數化構建branch是一個變量名,而後傳入到pipeline腳本里,pilnline調用這個變量名
交互的傳入的值,默認是master分支
寫一個pipeline腳本,把這個腳本傳入到咱們的pipeline中
[root@localhost ~]# ll pipeline.sh -rw-r--r--. 1 root root 1311 8月 16 14:11 pipeline.sh [root@localhost ~]# cat pipeline.sh node { // 拉取代碼 stage('Git Checkout') { checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '1d00c1d2-6b5a-4e53-8925-144aacdc289d', url: 'git@192.168.30.22:/home/git/demo.git']]]) } // 代碼編譯 stage('Maven Build') { sh ''' export JAVA_HOME=/usr/local/jdk /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true ''' } // 項目打包到鏡像並推送到鏡像倉庫 stage('Build and Push Image') { sh ''' REPOSITORY=192.168.30.22/library/tomcat-java-demo:${branch} cat > Dockerfile << EOF FROM 192.168.30.22/library/tomcat:v1 LABEL maintainer zhaocheng RUN rm -rf /usr/local/tomcat/webapps/* ADD target/*.war /usr/local/tomcat/webapps/ROOT.war EOF docker build -t $REPOSITORY . docker login 192.168.30.22 -u admin -p Harbor12345 docker push $REPOSITORY ''' } // 部署到Docker主機 stage('Deploy to Docker') { sh ''' REPOSITORY=192.168.30.22/library/tomcat-java-demo:${branch} docker rm -f tomcat-java-demo |true docker pull $REPOSITORY docker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY ''' }
而後點build with parameters
能夠看到多出來一個,這裏就是一我的工交互的打哪一個分支,爲哪一個分支打個鏡像,而後在部署測試,通常master分支就是主分支,通常用於生產環境的,固然也有些開發分支,還有其餘一些子分支,根據你的分支來選擇,能夠動態的能夠幫你打這個
查看項目鏡像已經上傳到咱們的harbor上
查看容器項目已經運行
[root@jenkins ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4de68438b80 192.168.30.22/library/tomcat-java-demo:master "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:88->8080/tcp tomcat-java-demo
訪問容器暴露的端口,本機的88端口
項目完成,趕快挑一個美女回家吧!!!
優秀博主阿良博客:https://blog.51cto.com/lizhenliang