持續集成(Continuous integration)

docker +jenkins + gitosc

到gitosc上,複製地址: https://git.oschina.net/99fu/CI.git

進入到 /home/fu  
   
   
   
   
git clone https://git.oschina.net/99fu/CI.git

分別進入相應的目錄build鏡像

README.md中有相應的指令:

 
 
注:maven 的dockerfile能夠看一下:
將本身下載好的 3.3.9的maven解壓到maven目錄與當前dockerfill同級,也能夠打開ADD註釋,經過ADD自動下載,會很慢
若是有公司內部settings.xml ,能夠覆蓋當前settings.xml
 運行build後,會自動構建maven中的hello項目:
 
啓動jenkins容器,並配製jenkins:
=====================================================================================

下載jenkins鏡像:

在https://hub.docker.com官網pull最新版jenkins,這裏是 2.19.1
 



啓動jenkins:

sudo docker run -d -p 8080:8080 --name jenkins -v /usr/lib/docker:/usr/ lib /docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root jenkins

說明:
-d 後臺啓動
-p 端口
--name 容器名稱
-v /usr/lib/docker:/usr/bin/docker   -v /var/run/docker.sock:/var/run/docker.sock  把docker二進制命令給jenkins,讓jenkins能夠調用docker命令
-v /home/fu/maven-tar:/root    把maven掛載,jenkins可用

掛載的結果,宿主機上的maven在容器中也能查看到:
 
官方的jenkins容器說明:

 基於官方jenkins,配製一個能夠執行docker的jenkins:

新建一個Dockerfile:
   
   
   
   
FROM jenkins:latestENV JENKINS_HOME /var/jenkins_homeENV JENKINS_SLAVE_AGENT_PORT 50000# Jenkins is ran with user `root`, so can operate dockerUSER rootRUN apt-get update \&& apt-get install -y sudo \&& rm -rf /var/lib/apt/lists/*RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoersUSER jenkinsCOPY plugins.txt /usr/share/jenkins/plugins.txtRUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

咱們須要賦予jenkins用戶sudo權限以便能在容器內運行Docker命令。固然,也能夠將jenkins用戶加入到Docker組中來避免在全部Docker命令前使用‘sudo’,不過因爲這個組gid的不一樣會形成不可移植(如Pini文中所述)。html

最後兩行用於處理 plugins.txt 文件中定義的插件。若是你不須要任何插件能夠忽略這兩行,不過1.6前推薦至少包括以下內容:java

$ cat plugins.txt
scm-api:latest
git-client:latest
git:latest
greenballs:latest
plugins.txt 爲空,由於新版的能夠UI選擇安裝:
      
      
      
      

進入到Dockerfile當前目錄
 
 運行命令製做基於jenkins的鏡像:
   
   
   
   
sudo docker build -t 99fu.cn:5000/fu/jenkins:latest .

 
 
 

 啓動容器:

    
    
    
    
sudo docker run -d -p 8080:8080 --name jenkins -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root 99fu.cn:5000/fu/jenkins:latest
或者用變量代替:
     
     
     
     
sudo docker run -d -p 8080:8080 --name jenkins -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root 99fu.cn:5000/fu/jenkins:latest
咱們把jenkins加入掛載目錄吧,這樣不當心誤刪,少去插件配製:
     
     
     
     
sudo docker run -d -p 8080:8080 --name jenkins -v /home/fu/jenkins_home:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/fu/maven-tar:/root 99fu.cn:5000/fu/jenkins:latest
當你看日誌,發現報錯,這裏有解答: https://github.com/jenkinsci/docker/issues/177
報錯提示:
     
     
     
     
ouch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission deniedCan not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?


解決方法:
     
     
     
     
If the directory is empty:sudo chown 1000 volume_dirIf the directory already contains files:sudo chown -R 1000 volume_dir



查看啓動的容器:
 
進入容器,查看是否能看到宿主機的鏡像:

    
    
    
    
sudo docker exec -it jenkins /bin/bash
  exit 能夠退出容器
 
  查看jenkins運行日誌:
   
   
   
   
sudo docker logs jenkins
 從上面只能夠看到,初始化管理密碼;

配製jenkins:
在瀏覽器打開:http://192.168.80.147:8080
 

能夠經過日誌查看,也可在指定的文件中,把密碼複製出來:
交互模式進入容器:
   
   
   
   
sudo docker exec -it jenkins /bin/bash

查看初始密碼:
    
    
    
    
cat /var/jenkins_home/secrets/initialAdminPassword

 複製密碼,輸入,進入
插件安裝,第一種是建議安裝社區使用最多的插件
                  第二種是本身選擇安裝所需的插件
 
咱們所須的插件有:
scm-api
plain-credentials
git-client
git
github-api
github

這裏我選的建議安裝:
 
安裝完成後,配製用戶:
(fu  zhangxiaofu)
 
 
好啦,初始jenkins環境完成,開始配製jenkins:
進入系統配製:

 
 
咱們先測試一下,在jenkins中是否能夠運行docker命令:
新建-->

選擇構建一個自由風格的軟件項目:
 
 


增長構建步驟-->Excute shell:
在命令框裏輸入「sudo docker run hello-world」
   
   
   
   
sudo docker run hello-world
保存後,點擊 當即構建
 點擊前面的小地圖,能夠看到控制檯輸出,看到如下命令,成功!


 注:

   
   
   
   
在容器中調用docker的方式如今的問題是,jenkins是運行docker容器中,沒法感知docker的存在。Docker中使用Docker有三種方:DooDDocker-outside-of-Docker咱們須要賦予jenkins用戶sudo權限以便能在容器內運行Docker命令。固然,也能夠將jenkins用戶加入到Docker組中來避免在全部Docker命令前使用‘sudo’,不過因爲這個組gid的不一樣會形成不可移植DinDDocker in Dockerdocker鏡像中要再安裝docker服務。此時,在容器中的docker和宿主機的docker是兩個不一樣的程序,相互沒有關聯,DinD並不比使用特權模式的容器安全性高,不過確實能避免使用sudoDinD最主要的劣勢是你沒法重用宿主緩存的鏡像(不過若是須要爲測試容器提供一個與宿主隔離的乾淨環境,這將頗有用)。使用HTTPSDocker後臺程序通信jenkins配置docker插件,而且docker進行端口配置。經過HTTPS暴露socket不須要sudo而且可使用宿主的鏡像,但由於打開了端口增長了攻擊面,能夠說是最不安全的

新建應用:
選擇git,並複製git地址,選擇分支

輸入Token,線上應複雜。複製路徑到git上 

**** 

選擇增長構建步驟,而後Excute shell

*****
   
   
   
   
REGISTRY_URL=192.168.80.146:5000cp /root/apache-maven-3.3.9-bin.tar.gz $WORKSPACE/mavensudo docker build -t $REGISTRY_URL/fu/maven:3.3.9 $WORKSPACE/mavenif sudo docker ps -a | grep -i maven ;then sudo docker rm -f mavenfisudo docker create --name maven $REGISTRY_URL/fu/maven:3.3.9sudo docker cp maven:/hello/target/hello.war $WORKSPACE/hellosudo docker build -t $REGISTRY_URL/fu/hello:1.0 $WORKSPACE/hellosudo docker push $REGISTRY_URL/fu/hello:1.0if sudo docker ps -a | grep -i hello; then sudo docker rm -f hellofisudo docker run -d -p 80:8080 --name hello $REGISTRY_URL/fu/hello:1.0

   
   
   
   
  1. 注:需要在registry中加入REGISTRY_URL=192.168.80.146:5000 的過濾,如{ "insecure-registries":["99fu.cn:5000","192.168.80.146:5000"] }
    
    
    
    
設置registry路徑copy maventar包到項目maven中( $WORKSPACEgit pull下來項目中)build maven 項目查看當前容器,-i 忽略大小寫,若是存在剛刪除而後再建立一個新的maven容器重新建立的容器中取出maven項目下的hellowar包,到hello而後再構建hello項目hello應用pushregistry中,以便別的服務能夠拉取若是hello容器已存在,須先刪除,容器名字相同會使容器啓動失敗啓動hello容器,可從瀏覽器中查看更改

保存,而後設置webHooks:

點擊用戶名(99fu)--> 設置:
show api Token 查看Token:
 
 

 配製gitosc上的webHooks:


    
    
    
    
http://fu:8b1a616bb9f22c01542465b81c3e5ad7@192.168.80.147:8080/job/docker-app/build?token=java-token
     
     
     
     
   
    /job/docker-app/build?token=
      java-token


fu:8b1a616bb9f22c01542465b81c3e5ad7@ jenkins中獲取

配製完,保存,測試
 
若是是外網,就能夠經過修改代碼,而後提交更改後,測試jenkins是否可以自動構建。



下載gitlab鏡像,由於咱們是本地,沒法用gitosc上的勾子(webHooks)

如下是hub.docker.com 上的鏡像:
   
   
   
   
docker pull sameersbn/gitlab:8.13.3
 
 
 
 

先下載鏡像:
    
    
    
    
docker pull sameersbn/gitlab:8.13.3

 以上提到兩種方式安裝:
第一種:
新建一個 gitlab目錄,cd gitlab,
   
   
   
   
wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml

而後運行給合命令,啓動多個容器:
   
   
   
   
docker-compose up
第二種:
Step 1. Launch a postgresql container
   
   
   
   
docker run --name gitlab-postgresql -d \ --env 'DB_NAME=gitlabhq_production' \ --env 'DB_USER=gitlab' --env 'DB_PASS=password' \ --env 'DB_EXTENSION=pg_trgm' \ --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \ sameersbn/postgresql:9.5-3
Step 2. Launch a redis container
   
   
   
   
docker run --name gitlab-redis -d \ --volume /srv/docker/gitlab/redis:/var/lib/redis \ sameersbn/redis:latest
Step 3. Launch the gitlab container
   
   
   
   
docker run --name gitlab -d \ --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \ --publish 10022:22 --publish 10080:80 \ --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \ --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \ --volume /srv/docker/gitlab/gitlab:/home/git/data \ sameersbn/gitlab:8.13.3
docker-compose.yml安裝後 瀏覽器中: http://192.168.80.147:10080  設置root密碼
 
一步步啓動容器後,註冊登錄用戶:
 
 
用以上的,不知爲何都是報502,鏈接超時,並且登錄不進去,仍是換用熟悉的mysql吧!
多是虛擬機設的內存比較下吧。會很慢,卡
 
 MySQL 存儲:
    
    
    
    
docker run --name gitlab-mysql -d \ --env 'DB_NAME=gitlabhq_production' \ --env 'DB_USER=gitlab' --env 'DB_PASS=password' \ --volume /srv/docker/gitlab/mysql:/var/lib/mysql \ sameersbn/mysql:latest


從新用link啓動,咱們用mysql做爲數據存儲:
咱們刪除以前的gitlab, postgresql 而後再運行如下執行容器命令,不然會提示容器名稱重複。
   
   
   
   
docker run --name gitlab -d \ --link gitlab-mysql:mysql --link gitlab-redis:redisio \ --publish 10022:22 --publish 10080:80 \ --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \ --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \ --volume /srv/docker/gitlab/gitlab:/home/git/data \ sameersbn/gitlab:8.13.3


 
啓動後:首先會讓咱們改一下root密碼,我用的zhangxiaofu

而後登錄進去:
 咱們新建一個項目爲 app-test:
(能夠看到我用的root用戶)
 咱們上傳項目到 app-test:
由於咱們是新項目,進入項目文件夾:

    
    
    
    
git initgit remote add origin http://192.168.80.147:10080/root/app-test.gitgit add .git commit -m "init"git push -u origin master
(需要多來幾回,我是push啦好幾回的)

打開慢的緣由,以前用的vmwart 的NAT模式,內存爲1G,發現特別慢
而後,停掉全部容器,而後用將內存提高到3G,網絡改爲啦橋接,呵呵,網一會兒快啦,看來跟數據庫不要緊的。

驗權:

 

設置做者用戶名,並輸入密碼
 
 

咱們遇到以下問題:
    
    
    
    
remote: GitLab: You are not allowed to push code to protected branches on this project.To http://192.168.1.103:10080/fu/CI.git ! [remote rejected] master -> master (pre-receive hook declined)error: failed to push some refs to 'http://192.168.1.103:10080/fu/CI.git'


解決方法:
登錄進入---> projects-->選擇項目
 先擇設置,Members  成員
 
 增長成員,能夠搜索,  增長到哪一個分支   到期時間
 
好啦,咱們再push:
 
 
 





 接下來,咱們要設置webHooks


fu是用啓名,
79dc814d0177397b46557831252b8c62 爲token
192.168.1.103:8080/job/CI/build?token=java-token
身份令牌,在jenkins中獲取
   
   
   
   
Use the following URL to trigger build remotely: JENKINS_URL/job/CI/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAMEOptionally append &cause=Cause+Text to provide text that will be included in the recorded build cause.


 
提交,能夠測試。
這裏,我遇到啦問題。
   
   
   
   
Hook executed successfully but returned HTTP 403 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Error 403 No valid crumb was included in the request</title> </head> <body><h2>HTTP ERROR 403</h2> <p>Problem accessing /job/CI/build. Reason: <pre> No valid crumb was included in the request</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/> </body> </html>

 

能夠看到,請求被重置,由於在jenkins中,默認開啓啦(防止跨站點請求僞造)

咱們需要進入jenkins中,關閉(去掉勾選:  防止跨站點請求僞造
 
而後再測試:
   
   
   
   
Hook executed successfully: HTTP 201

 
能夠看到成功啦,再看一下控制檯:
 
好啦,咱們提交一下代碼,看一下效果,是否能自動執行命令(注,紅色的表示失敗啦哦,藍色是成功)
提交完代碼,同時,就看到了jenkins執行啦!
 


注:
jenkins 默認git pull下來的代碼在:cd /var/jenkins_home/workspace/CI/
jenkins_home 環境變量
CI  爲項目名

新增長一個mysql給hello項目用

   
   
   
   
docker run --name mysql -d -p 3307:3306 \ --env 'DB_NAME=xc' \ --env 'DB_USER=admin' --env 'DB_PASS=admin' \ --volume /srv/docker/mysql_data/mysql:/var/lib/mysql \ sameersbn/mysql:latest


  
  
  
  
============================> dev-springemp <============================
#jenkins docker 命令說明
--persistent String parameter
2個參數
Registry_URL
image_repository
--Registry_URL
默認值:localhost
描述:registry倉庫地址
例如:139.129.21.58:443
--image_repository
描述:
應用鏡像名
csphere/my-web-app
--git
https://git.oschina.net/2839543/springemp.git
--Execute Shell 4 step
# build image
docker build -t ${Registry_URL}/${image_repository}:$GIT_COMMIT $WORKSPACE/
# push image to registry
docker push ${Registry_URL}/${image_repository}:$GIT_COMMIT
# tag with latest
docker tag -f ${Registry_URL}/${image_repository}:$GIT_COMMIT ${Registry_URL}/${image_repository}:latest
# push image to registry
docker push ${Registry_URL}/${image_repository}:latest
============================> test-springemp <============================
--persistent String parameter
4個參數
Registry_URL
image_repository
image_tag
test_url
--git
https://git.oschina.net/2839543/springemp.git
--Execute Shell
#增長可執行權限
chmod u+x deploy.sh init.sh test-script.sh
#執行測試
./test-script.sh
--增長郵件通知
============================> prod-springemp <============================
--persistent String parameter
4個參數
Registry_URL
image_repository
image_tag
image_new_tag
--Execute Shell
# new tag
docker tag -f ${Registry_URL}/${image_repository}:${image_tag} ${Registry_URL}/${image_repository}:${image_new_tag}
# docker push image
docker push ${Registry_URL}/${image_repository}:${image_new_tag}


相關文章
相關標籤/搜索