目錄
- show case
- docker 和jenkins 介紹
- 使用docker部署jenkins
- jenkins 的一些常用配置
- 搭建一個自動集成環(huán)境
- 總結(jié)
docker 和jenkins 介紹
- Docker是目前最流行的虛擬化技術(shù)
- Jenkins是一個開放易用的持續(xù)集成工具
Centos 7 安裝docker
# 卸載舊版本(如果安裝過舊版本的話)
sudo yum remove docker docker-common docker-selinux docker-engine
# 安裝需要的軟件包苞笨, yum-util 提供yum-config-manager功能款筑,另外兩個是devicemapper驅(qū)動依賴的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 設(shè)置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 可以查看所有倉庫中所有docker版本,并選擇特定版本安裝
yum list docker-ce --showduplicates | sort -r
# 安裝docker
sudo yum install docker-ce
# 啟動并加入開機啟動
sudo systemctl start docker
sudo systemctl enable docker
#驗證安裝是否成功(有client和service兩部分表示docker安裝啟動都成功了)
docker version
安裝nginx
docker pull nginx:latest # 最新版本
docker pull nginx:1.11.1 # 指定版本
通過docker images
查看當(dāng)前的鏡像
可以通過鏡像id屈藐,刪除鏡像:
docker rmi 8cf1bfb43ff5
注:這里也只能刪除沒有創(chuàng)建容器的鏡像踩娘,如果鏡像被使用了娘荡,就不能刪除
運行容器
docker run --name nginx-test -p 8080:80 -d nginx
通過docker ps
查看運行中的容器
可以看出容器id為e889f0283dea
, 然后停止容器
docker stop e889f0283dea # 停止容器
此時再通過docker ps
已經(jīng)看不到運行中的容器了,但是可以通過docker ps -a
查看stop的容器魁袜。
可以訪問nginx服務(wù)了:http://127.0.0.1:8080/
刪除容器
docker rm e889f0283dea # 刪除指定id的容器
再回顧一下前面啟動容器的命令:
docker run --name nginx-test -p 8080:80 -d nginx
桩撮,我們再啟動的時候指定了name參數(shù),所以在執(zhí)行命令的時候峰弹,可以用name
替代id店量,比如刪除容器可以寫為docker rm nginx-test
。啟動容器的命令中還有
-d
參數(shù)代表在“后臺運行”鞠呈。而
-p
是容器端口映射到本機的端口的參數(shù)融师。
現(xiàn)在,如果我們想修改nginx文件蚁吝,應(yīng)該怎么做呢旱爆?
- 首先能想到的是進入容器
docker exec -it e889f0283dea bash
# 進入容器之后舀射,找到nginx配置文件目錄
cd /etc/nginx/conf.d/
接下來按照nginx配置修改即可。
這個方式有點不靠譜
我們用數(shù)據(jù)卷怀伦,加上-v參數(shù)
docker run --name nginx-test -p 8080:80 \
-v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/docker-nginx/log:/var/log/nginx \
-d \
nginx
這樣的話, 直接可以在本地修改配置后控,不用進入到容器里面了,而且能做到配置持久化
空镜。
Dockerfile
想想浩淘,如果哪天,需要對nginx 配置ssl證書吴攒,感覺需求會一直變動张抄,為了對操作步驟自動化,引入Dockerfile
. 創(chuàng)建如下目錄結(jié)構(gòu)(可以從本項目中看到):
- config目錄中包含了nginx的配置文件
- ssl目錄用來保存ssl證書洼怔。
實現(xiàn)簡單的Dockerfile文件如下:
FROM nginx:1.11.1
RUN mkdir -p /etc/nginx/ssl \
mkdir -p /var/www
COPY ./ssl/ /etc/nginx/ssl/
此鏡像繼承自nginx:1.11.1
, 后面可以配置一些自己的特殊需求署惯。
build鏡像
docker build -t my/nginx:v1 .
后面啟動nginx,就可以直接用my/nginx:v1
鏡像了镣隶。
docker-compose
如果想進一步自動化极谊,可以通過配置docker-compose 新建一個docker-compose.yml
文件,內(nèi)容如下:
version: '3'
services:
web:
build:
context: ./services/nginx
dockerfile: Dockerfile
ports:
- "8081:8081"
- "80:80"
volumes:
- ./services/nginx/config:/etc/nginx/conf.d
- ./www:/var/www
docker-compose 常用的操作
# build Dockerfile
docker-compose build
# 啟動安岂, -d代表后臺啟動
docker-compose up -d
# stop
docker-compose down
# 進入容器內(nèi)部
docker-compose exec nginx bash
目前這些都還是單機的轻猖,如果想用集群,那么有
Kubernetes(k8s)和Docker swarm
目前k8s完全勝出域那。
小技巧:快速批量刪除 docker 鏡像或容器
Docker 本身并沒有提供批量刪除的功能咙边,當(dāng)有大量的鏡像或者容器需要刪除的時候,手動的一個一個刪就比較麻煩了次员。
1. 直接刪除所有鏡像或容器
# 直接刪除所有鏡像
docker rmi `docker images -q`
# 直接刪除所有容器
docker rm `docker ps -aq`
2. 按條件篩選之后刪除
# 按條件篩選之后刪除鏡像
docker rmi `docker images | grep xxxxx | awk '{print $3}'`
# 按條件篩選之后刪除容器
docker rm `docker ps -a | grep xxxxx | awk '{print $1}'`
使用docker部署jenkins
創(chuàng)建如下docker-compose.yml文件
version: '3'
services:
web:
build:
context: ./services/nginx
dockerfile: Dockerfile
ports:
- "8081:8081"
- "80:80"
volumes:
- ./services/nginx/config:/etc/nginx/conf.d
- ./www:/var/www
jenkins:
image: jenkins:latest
environment:
JAVA_OPTS: -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai
ports:
- "50000:50000"
- "9001:8080"
volumes:
- ./app/jenkins:/var/jenkins_home
- ~/.ssh:/var/jenkins_home/.ssh
ps: 值得注意的是environment
部分的JAVA_OPTS
配置败许,能解決時區(qū)問題。
配置jenkins
的nginx
server {
listen 80; # Listen on port 80 for IPv4 requests
server_name localhost;
gzip on;
gzip_min_length 1000;
gzip_types application/json text/css application/x-javascript;
keepalive_timeout 65;
client_max_body_size 2m;
#this is the jenkins web root directory (mentioned in the /etc/default/jenkins file)
# root /var/run/jenkins/war/;
# access_log /var/log/nginx/jenkins/access.log;
# error_log /var/log/nginx/jenkins/error.log;
location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
#rewrite all static files into requests to the root
#E.g /static/12345678/css/something.css will become /css/something.css
rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
}
location /userContent {
#have nginx handle all the static requests to the userContent folder files
#note : This is the $JENKINS_HOME dir
root /var/lib/jenkins/;
if (!-f $request_filename){
#this file does not exist, might be a directory or a /**view** url
rewrite (.*) /$1 last;
break;
}
sendfile on;
}
location @jenkins {
sendfile off;
proxy_pass http://jenkins:8080;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_max_temp_file_size 0;
#this is the maximum upload size
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location / {
# Optional configuration to detect and redirect iPhones
if ($http_user_agent ~* '(iPhone|iPod)') {
rewrite ^/$ /view/iphone/ redirect;
}
try_files $uri @jenkins;
}
}
通過docker-compose up
啟動淑蔚。 然后訪問http://localhost
,即可進入jenkins市殷。
依次安裝即可。 ps:安裝過程可能會遇到一些問題刹衫,比如: 安裝jenkins時出現(xiàn) No such plugin: cloudbees-folder的解決辦法
jenkins 的一些常用配置
系統(tǒng)設(shè)置
- 可以配置主目錄
- JenkinsURL
- 郵件SMTP
- ...
權(quán)限配置
權(quán)限配置誤操作了怎么辦醋寝?
ps: 配置的時候需要慎重,不然誤點了會導(dǎo)致進不了系統(tǒng)了绪妹。 萬一真的誤點了甥桂,可以參考這里 https://www.cnblogs.com/sker/p/9255368.html
當(dāng)然也可以備份里面找到j(luò)enkins的config.xml 配置文件,找到如下幾行邮旷,恢復(fù)重啟即可。
推薦插件
- Backup plugin | 備份
- description setter plugin
- Global Variable String Parameter
- Hidden Parameter plugin
- Readonly Parameter plugin
- Mask Passwords
- Rebuilder
- ......
節(jié)點配置
目前安裝完jnekins之后蝇摸,此時執(zhí)行任務(wù)的話都是在jenkins的docker環(huán)境下面的婶肩,想象一下我們此時需要用npm
要怎么辦呢办陷?
- 可以在shell腳本中用
docker run
命令, 用專門的npm鏡像÷杉撸可以參考:https://blog.csdn.net/xiaoxiangzi520/article/details/88842200/ - 也可以通過配置節(jié)點民镜,然后將其它機器做了jenkins的節(jié)點。
這樣新建的job可以使用這個節(jié)點來打包了
備份
方式很多险毁,我采用了一個定時任務(wù)的job
https://github.com/sue445/jenkins-backup-script
可以做到每日備份制圈。
搭建一個自動集成環(huán)境
- 創(chuàng)建job
- 參數(shù)
- 構(gòu)建環(huán)境
- 構(gòu)建
- 構(gòu)建后操作
創(chuàng)建job
參數(shù)
構(gòu)建環(huán)境
構(gòu)建
構(gòu)建腳本
#!/bin/bash
function func_log_print(){
local level="$1"
local msg="$2"
case $level in
error) echo -e "\033[41;30;1m${msg}\033[0m";;
warn) echo -e "\033[43;30;1m${msg}\033[0m";;
info) echo -e "\033[47;30;1m${msg}\033[0m";;
concern) echo -e "\033[42;30;1m${msg}\033[0m";;
*) echo "${msg}";;
esac
}
function check_or_exit(){
if [ $? -ne 0 ] ; then
echo "error code : $?"
echo $1
exit 127
fi
}
echo;
func_log_print warn "------------------------Build Script Start ------------------------------\n\n"
func_log_print warn "------------------------Argument parse ------------------------------\n\n"
while [[ $# > 1 ]]; do
key="$1"
case $key in
-gitrepo)
GIT_REPO="$2"
shift
;;
-tag)
GIT_TAG="$2"
shift
;;
-build_type)
BUILD_TYPE="$2"
shift
;;
*)
# unknown option
func_log_print warn "warning--->unknown option"
;;
esac
shift # past argument or value
done
if [ -z $GIT_REPO ]; then
echo "git地址不能為空"
exit 127
fi
# tag為空的時候默認master
if [ -z $GIT_TAG ]; then
GIT_TAG='master'
fi
projectName=${GIT_REPO##*/}
projectName=${projectName%%.*}
func_log_print warn "gitrepo ---> $GIT_REPO"
func_log_print warn "tag ---> $GIT_TAG"
func_log_print warn "------------------------ pull source ------------------------------\n\n"
cd ${WORKSPACE}
rm -rf $projectName # 刪除項目
git clone $GIT_REPO -b ${GIT_TAG}
cd $projectName
npm install
func_log_print warn "------------------------ 生成test 報告 ------------------------------\n\n"
npm test
func_log_print warn "------------------------ 上傳test 報告 ------------------------------\n\n"
mkdir ${BUILD_ID}
mv testResultsProcessorResult.html ${BUILD_ID}/testResultsProcessorResult.html
sed -i "" "s/\/Users\/gtts\/Documents\/workspace\/workspace\/jstest\/jest-html-reporter\/style/http:\/\/192.168.1.26:8000\/style/g" `grep -rl \/Users\/gtts\/Documents\/workspace\/workspace\/jstest\/jest-html-reporter ./`
sed -i "" "s/\/Users\/gtts\/Documents\/workspace\/workspace\/jstest\/jest-html-reporter\/test/https:\/\/github.com\/Hargne\/jest-html-reporter\/tree\/master\/test/g" `grep -rl \/Users\/gtts\/Documents\/workspace\/workspace\/jstest\/jest-html-reporter ./`
cp -r ${BUILD_ID} ~/Desktop/jstest
echo "report: http://192.168.1.26:8000/${BUILD_ID}/testResultsProcessorResult.html username: ${BUILD_USER} buildtype: ${BUILD_TYPE}"
func_log_print warn "------------------------ done. ------------------------------\n\n"
構(gòu)建后操作
想要這樣的輸出效果:可以方便看測試報告,構(gòu)建的用戶名和構(gòu)建環(huán)境
構(gòu)建后操作
- 安裝插件:
description setter plugin
- 構(gòu)建腳本輸出:
echo "report: http://192.168.1.26:8000/${BUILD_ID}/testResultsProcessorResult.html username: ${BUILD_USER} buildtype: ${BUILD_TYPE}"
-
通過正則畔况,可以用html輸出
構(gòu)建后可以觸發(fā)通知等其它事件
其它強調(diào)點
- job執(zhí)行過程中鲸鹦,如果需要做一些其它審批,可以通過異步請求暫停跷跪,日中中輸出一個url供用戶去審批馋嗜,審批完了之后再繼續(xù)執(zhí)行
- 定時、hooks觸發(fā)
- 發(fā)短信吵瞻、郵件通知結(jié)果
- 因為是本地搭建葛菇,沒法使用Gitlab hooks功能,所以可以采用定時任務(wù)的策略橡羞,來定時構(gòu)建
總結(jié)
- docker 和jenkins 介紹
- 使用docker部署jenkins
- jenkins 的一些常用配置
- 搭建一個自動集成環(huán)境