搭建環境是 Centos 7.2,本地測試是本身搭建的虛擬機,測試環境是阿里雲ECS的Centos 7.2python
yum默認帶有的docker版本比較低,我通常都是會安裝更新版本的dockerlinux
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
複製代碼
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce
複製代碼
systemctl enable docker
systemctl daemon-reload
systemctl start docker
複製代碼
docker --version
Docker version 18.09.6, build 481bc77156
複製代碼
docker-compose是一個python編寫的docker編排工具,後面的啓動服務都是以docker-compose來啓動,這樣就不須要每次都手動輸入docker啓動命令的各項配置參數,簡化操做,最後也能夠吧gitlab,jenkins等關聯的服務編寫在同一個 docker-compose 腳本中,方便一塊兒管理nginx
咱們部署環境有python3環境,因此直接使用pip3安裝docker-composegit
sudo pip3 install docker-compose
複製代碼
首先在工做目錄下,建立一個docker-compose的腳本,docker
# /data/gitlab 是自定義映射gitlab存放配置參數及數據的目錄,能夠修改爲本身須要的目錄
cat > docker-compose.yml << EOF
version: '2'
services:
jenkins:
image: gitlab/gitlab-ce:12.0.3-ce.0
container_name: gitlab
ports:
- "9022:9022"
- "9080:80"
volumes:
- "/data/gitlab/cfg:/etc/gitlab"
- "/data/gitlab/logs:/var/log/gitlab"
- "/data/gitlab/data:/var/opt/gitlab"
restart: always
EOF
# 後臺啓動服務,第一次或自動pull鏡像,添加 -d 表示後臺啓動
docker-compose up -d
複製代碼
gitlab會監聽22端口(ssh鏈接),80端口(http)及443端口(https),咱們gitlab前面加上一個haproxy作反向代理,haproxy監聽443端口代理到9443端口,docker不開80端口所有都走9443端口(映射至433端口)shell
使用vim編輯gitlab的配置文件,gitlab的配置文件默認爲 /data/gitlab/cfg/gitlab.rb ,前面的目錄就是docker中配置的映射目錄vim
docker container exec -it gitlab bash
vim /etc/gitlab/cfg/gitlab.rb
# 如下爲gitlab的配置項
# 配置 gitlab 顯示 url 的內容,external_url配置爲https的連接時,gitlab會自動建立監聽443端口的nginx配置,證書須要放置在 /etc/gitlab/ssl 目錄下,而且文件名爲配置的域名.crt
# 例如配置域名爲 https://git.xxx.com,則須要證書文件爲 git.xxx.com.crt 及 git.xxx.com.key
external_url 'https://git.xxx.com'
# 配置郵箱信息
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'no-reply@xxx.com'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "hwsmtp.xxx.com"
gitlab_rails['smtp_port'] = 994
gitlab_rails['smtp_user_name'] = "no-reply@xxx.com"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_domain'] = "qiye.xxx.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
# 配置完成後輸入一下命令從新配置gitlab
sudo gitlab-ctl reconfigure
複製代碼
gitlab正常使用能夠參考網上其餘的資料,主要是用戶,組及項目的建立centos
# /data/jenkins 是自定義映射jenkins存放數據的目錄,能夠修改爲本身須要的目錄,docker的映射是爲了讓jenkins能使用宿主環境下的docker
cat > docker-compose.yml << EOF
version: '2'
services:
jenkins:
image: jenkins/jenkins:lts
user: root
container_name: jenkins
ports:
- "8002:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/data/jenkins:/var/jenkins_home"
- "/usr/bin/docker:/usr/bin/docker"
restart: always
EOF
# 後臺啓動服務,第一次或自動pull鏡像,添加 -d 表示後臺啓動,能夠添加這個參數用於後臺啓動
docker-compose up
複製代碼
當 jenkins 正常運行時,啓動日誌中會有第一次登錄須要的管理員密碼,以下:bash
拷貝此密碼,而後登錄主機地址:8002訪問,會進入jenkins初始化頁面,輸入剛纔拷貝的密碼,而後進入引導頁面,根據引導安裝推薦的插件app
完成插件以後能夠添加一個管理員帳號,添加完畢後會進入jenkins的主頁
在 系統管理 > 插件管理 > 可選插件中搜索並安裝gitlab,docker相關插件
須要再gitlab中添加一個測試項目,而且該項目須要有dockerfile腳本,咱們測試主要流程是gitlab push tag,而後 jenkins 觸發構建開始自動部署,項目部署以docker鏡像生成及部署的方式實現
# 生成密鑰對, 輸入後一路回車,默認保存密鑰在 ~/.ssh 目錄下, id_rsa(私鑰)及id_rsa.pub(公鑰)
ssh-keygen -o -t rsa -b 4096 -C "email@example.com"
複製代碼
拷貝 公鑰信息,在gitlab > 用戶設置 > SSH密鑰 > 添加一個SSH密鑰
在jenkins中添加一個任務
任務中須要配置源碼信息,這裏使用gitlab託管代碼,因此須要gitlab倉庫的地址,用戶須要對倉庫具備相應的權限,這裏由於還沒配置gitlab用戶信息,因此提示沒法讀取倉庫源碼
點擊 Credentials 後面的添加按鈕能夠添加證書信息,類型選擇 SSH username with private key,而後添加以前生成密鑰的私鑰,再點擊添加完成錄入
而後在在源碼管理中選擇剛剛添加的認證信息,添加沒問題則紅色的出錯信息將會消失
在構建中增長一個構建步驟,即將代碼構建 docker 鏡像
完成後點擊保存完成任務的添加,而後再首頁點擊構建按鈕查看構建效果,第一次會觸發docker 下載相應的未下載的鏡像,可能會比較慢,以後能夠看到任務構建成功,查看控制檯輸出能夠看到構建時shell的輸出日誌,至此任務的構建已經沒有問題,接下去要實現 gitlab push 自動觸發構建
在 jenkins 任務的構建觸發器中開啓 push event 的觸發器,而後在高級中點擊生成生成一個回調地址的 Secret token,而後保存
在 gitlab 項目 > 設置 > 集成 中將 Jenkins 及 生成的 token配置到gitlab 中,事件選擇 tag push
而後建立一個標籤,jenkins 收到回調會自動構建,在首頁能查詢構建的歷史記錄
能接受 tag 推送回調以後,須要修改構建的shell腳本
# 定義變量,CONTAINER_NAME 是項目名稱,對應阿里雲鏡像服務中的倉庫名稱,GIT_TAG 變量是自動獲取本地git版本的tag
CONTAINER_NAME="citest"
GIT_TAG=`git describe --always --tag`
CONTAINER_FULL_NAME=${CONTAINER_NAME}-${GIT_TAG}
REPOSITORY=registry.cn-shanghai.aliyuncs.com/xxx/${CONTAINER_NAME}:${GIT_TAG}
# 構建Docker鏡像
docker build -t $REPOSITORY -f Dockerfile .
# 推送Docker鏡像,username 跟 password 爲 阿里雲容器鏡像服務的帳號密碼
docker login --username=xxxxx --password=xxxxxx registry.cn-shanghai.aliyuncs.com
docker push $REPOSITORY
# 刪除生成的image
docker images | grep citest | awk '{print $1":"$2}' | xargs docker rmi
# 刪除名稱或標籤爲none的鏡像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
複製代碼
修改至這個版本,能夠在gitlab中建立一個tag,而後gitlab會回調至jenkins,而後jenkins開始構建並將生成的鏡像推送至阿里雲registry中並清理現場
目前已經完成了 gitlab ——— jenkins ——— DockerRegistry 的鏡像發佈,後續會繼續實現 jenkins 將發佈的鏡像分發到每一個機器並部署的功能