到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:latest
ENV JENKINS_HOME /var/jenkins_home
ENV JENKINS_SLAVE_AGENT_PORT 50000
# Jenkins is ran with user `root`, so can operate docker
USER root
RUN apt-get update \
&& apt-get install -y sudo \
&& rm -rf /var/lib/apt/lists/*
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
我們需要賦予jenkins用戶sudo權限以便能在容器內運行Docker命令。當然,也可以將jenkins用戶加入到Docker組中來避免在所有Docker命令前使用‘sudo’,不過由於這個組gid的不同會造成不可移植(如Pini文中所述)。
最后兩行用於處理 plugins.txt 文件中定義的插件。如果你不需要任何插件可以忽略這兩行,不過1.6前推薦至少包括如下內容:
$ 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 denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
解決方法:
If the directory is empty:
sudo chown 1000 volume_dir
If 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有三種方:
DooD(Docker-outside-of-Docker)
我們需要賦予jenkins用戶sudo權限以便能在容器內運行Docker命令。當然,也可以將jenkins用戶加入到Docker組中來避免在所有Docker命令前使用‘sudo’,不過由於這個組gid的不同會造成不可移植
DinD(Docker in Docker)
在docker鏡像中要再安裝docker服務。
此時,在容器中的docker和宿主機的docker是兩個不同的程序,相互沒有關聯,DinD並不比使用特權模式的容器安全性高,不過確實能避免使用sudo。DinD最主要的劣勢是你無法重用宿主緩存的鏡像(不過如果需要為測試容器提供一個與宿主隔離的干凈環境,這將很有用)。
使用HTTPS與Docker后台程序通訊
jenkins配置docker插件,並且docker進行端口配置。
通過HTTPS暴露socket不需要sudo並且可以使用宿主的鏡像,但因為打開了端口增加了攻擊面,可以說是最不安全的
新建應用:
選擇git,並復制git地址,選擇分支

輸入Token,線上應復雜。復制路徑到git上

****
選擇增加構建步驟,然后Excute shell
*****
REGISTRY_URL=192.168.80.146:5000
cp /root/apache-maven-3.3.9-bin.tar.gz $WORKSPACE/maven
sudo docker build -t $REGISTRY_URL/fu/maven:3.3.9 $WORKSPACE/maven
if sudo docker ps -a | grep -i maven ;then
sudo docker rm -f maven
fi
sudo docker create --name maven $REGISTRY_URL/fu/maven:3.3.9
sudo docker cp maven:/hello/target/hello.war $WORKSPACE/hello
sudo docker build -t $REGISTRY_URL/fu/hello:1.0 $WORKSPACE/hello
sudo docker push $REGISTRY_URL/fu/hello:1.0
if sudo docker ps -a | grep -i hello; then
sudo docker rm -f hello
fi
sudo docker run -d -p 80:8080 --name hello $REGISTRY_URL/fu/hello:1.0
- 注:須要在registry中加入REGISTRY_URL=192.168.80.146:5000 的過濾,如{ "insecure-registries":["99fu.cn:5000","192.168.80.146:5000"] }
設置registry路徑
copy maven的tar包到項目maven中( $WORKSPACE為git pull下來項目中)
build maven 項目
查看當前容器,-i 忽略大小寫,如果存在剛刪除
然后再創建一個新的maven容器
從新創建的容器中取出maven項目下的hello的war包,到hello中
然后再構建hello項目
將hello應用push到registry中,以便別的服務可以拉取
如果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
fu:8b1a616bb9f22c01542465b81c3e5ad7@ 從jenkins中獲取
/job/docker-app/build?token=
java-token
配制完,保存,測試

如果是外網,就可以通過修改代碼,然后提交更改后,測試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 init
git remote add origin http://192.168.80.147:10080/root/app-test.git
git 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_NAME
Optionally 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 parameter2個參數Registry_URLimage_repository--Registry_URL默認值:localhost描述:registry倉庫地址例如:139.129.21.58:443--image_repository描述:應用鏡像名csphere/my-web-app--githttps://git.oschina.net/2839543/springemp.git--Execute Shell 4 step# build imagedocker build -t ${Registry_URL}/${image_repository}:$GIT_COMMIT $WORKSPACE/# push image to registrydocker push ${Registry_URL}/${image_repository}:$GIT_COMMIT# tag with latestdocker tag -f ${Registry_URL}/${image_repository}:$GIT_COMMIT ${Registry_URL}/${image_repository}:latest# push image to registrydocker push ${Registry_URL}/${image_repository}:latest============================> test-springemp <============================--persistent String parameter4個參數Registry_URLimage_repositoryimage_tagtest_url--githttps://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 parameter4個參數Registry_URLimage_repositoryimage_tagimage_new_tag--Execute Shell# new tagdocker tag -f ${Registry_URL}/${image_repository}:${image_tag} ${Registry_URL}/${image_repository}:${image_new_tag}# docker push imagedocker push ${Registry_URL}/${image_repository}:${image_new_tag}