一、Docker Compose 部署 GitLab
GitLab 是利用 Ruby on Rails 一個開源的版本管理系統(tǒng),實現(xiàn)一個自托管的 Git 項目倉庫,可通過 Web 界面進行訪問公開的或者私人項目。它擁有與 Github 類似的功能,能夠瀏覽源代碼,管理缺陷和注釋。可以管理團隊對倉庫的訪問,它非常易于瀏覽提交過的版本并提供一個文件歷史庫。團隊成員可以利用內(nèi)置的簡單聊天程序 (Wall) 進行交流。它還提供一個代碼片段收集功能可以輕松實現(xiàn)代碼復用,便于日后有需要的時候進行查找。
1、部署 GitLab
我們使用 Docker 來安裝和運行 GitLab 中文版,docker-compose.yml 配置如下:
version: '3'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh'
restart: always
container_name: 'gitlab'
privileged: true
hostname: 'gitlab'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.152.204或者域名'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxx@163.com"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'xxx@163.com'
gitlab_rails['gitlab_shell_ssh_port'] = 220
unicorn['port'] = 8888
nginx['listen_port'] = 80
ports:
- '8081:80'
- '443:443'
- '220:22'
volumes:
- /data/gitlab/config:/etc/gitlab
- /data/gitlab/data:/var/opt/gitlab
- /data/gitlab/logs:/var/log/gitlab
2、配置 GitLab
- 訪問地址:http://ip:8081

設(shè)置管理員初始密碼,這里的密碼最好是 字母 + 數(shù)字組合,并且大于等于 8 位
配置完成后登錄,管理員賬號是 root

注意: 如果服務器配置較低,啟動運行可能需要較長時間,請耐心等待
3、設(shè)置 GitLab
第一次使用時可以做一些初始化設(shè)置,點擊 管理區(qū)域 -> 設(shè)置

- 關(guān)閉頭像功能,由于 Gravatar 頭像為網(wǎng)絡(luò)頭像,在網(wǎng)絡(luò)情況不理想時可能導致訪問時卡頓

- 由于是內(nèi)部代碼托管服務器,可以直接關(guān)閉注冊功能,由管理員統(tǒng)一創(chuàng)建用戶即可

4、賬戶管理
使用時請不要直接通過 root 用戶操作,需要先創(chuàng)建用戶,然后通過創(chuàng)建的用戶操作,如果你是管理員還需要為其他開發(fā)人員分配賬戶
- 創(chuàng)建賬戶,點擊 管理區(qū)域 -> 新建用戶

- 設(shè)置賬戶信息,同時你可以將自己設(shè)置為管理員

- 修改用戶密碼,由于我們創(chuàng)建時并沒有配置郵箱,所以還需要重新編輯用戶信息并手動設(shè)置密碼


- 退出并使用新賬戶登錄


注意: 創(chuàng)建完賬戶,第一次登錄時還會提示你修改登錄密碼
5、項目管理
- 點擊 + 號 -> 新建項目

- 輸入項目名稱及描述信息,設(shè)置可見等級為私有,這樣別人就看不見你的項目


我們選擇通過增加一個 README 的方式來初始化項目
直接提交修改即可
6、使用 SSH 方式拉取和推送
1、生成 SSH KEY
- 使用 ssh-keygen 工具生成,位置在 Git 安裝目錄下,我的是
C:\Program Files\Git\usr\bin,輸入命令:
ssh-keygen -t rsa -C "GitLab的郵箱賬號"
- 執(zhí)行成功后的效果:
Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有權(quán)利。
C:\Program Files\Git\usr\bin>ssh-keygen -t rsa -C "topsale@vip.qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Lusifer/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Lusifer/.ssh/id_rsa.
Your public key has been saved in /c/Users/Lusifer/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:cVesJKa5VnQNihQOTotXUAIyphsqjb7Z9lqOji2704E topsale@vip.qq.com
The key's randomart image is:
+---[RSA 2048]----+
| + ..=o=. .+. |
| o o + B .+.o.o |
|o . + +=o+.. |
|.= . oo... |
|= o So |
|oE . o |
| .. .. . |
| o*o+ |
| *B*oo |
+----[SHA256]-----+
C:\Program Files\Git\usr\bin>
2、復制 SSH-KEY 信息到 GitLab
- 密鑰位置在:
C:\Users\你的用戶名\.ssh目錄下,找到id_rsa.pub并使用編輯器打開,如:
image.png

登錄 GitLab,點擊“用戶頭像”-->“設(shè)置”-->“SSH 密鑰”
成功增加密鑰后的效果

7、使用 TortoiseGit(window10)
1、克隆項目
新建一個存放代碼倉庫的本地文件夾
在文件夾空白處按右鍵
-
選擇 Git 克隆...
image.png

- 復制項目地址到 URL

- 如果彈出連接信息請選擇是

- 成功克隆項目到本地

2、推送項目
創(chuàng)建或修改文件(這里的文件為所有文件,包括:代碼、圖片等)
我們以創(chuàng)建
.gitignore過濾配置文件為例,該文件的主要作用為過濾不需要上傳的文件,比如:IDE 生成的工程文件、編譯后的 class 文件等在工程目錄下,新建
.gitignore文件,并填入如下配置
target/
!.mvn/wrapper/maven-wrapper.jar
## STS ##
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
## IntelliJ IDEA ##
.idea
*.iws
*.iml
*.ipr
## JRebel ##
rebel.xml
## MAC ##
.DS_Store
## Other ##
logs/
temp/

-
右鍵呼出菜單,選擇 提交 Master...
image.png 點擊 全部 并填入 日志信息

- 點擊 提交并推送


- 成功后的效果圖
8、查看 GitLab 確認提交成功

二、Docker-Compose 部署 Jenkins
官方的:https://jenkins.io/doc/book/installing/
1、部署 Jenkins
docker-compose.yml文件:
version: '3'
services:
jenkins:
image: jenkins/jenkins:lts stephdw/jenkins-ansible
volumes:
- /data/jenkins/:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
ports:
- "8080:8080"
expose:
- "8080"
- "50000"
privileged: true
user: root
restart: always
container_name: jenkins
environment:
JAVA_OPTS: '-Djava.util.logging.config.file=/var/jenkins_home/log.properties'
這里注意一點使用鏡像:jenkins 擁有root權(quán)限這里要注意 運行命令:
docker-compose up -d
如果如下錯誤:

解決辦法修改文件權(quán)限:chown -R 1000:1000 /data/jenkins 直接可以訪問:ip:端口

查看正在運行的容器:
docker ps
docker-compose ps
查看安裝密碼:
cat /data/jenkins/secrets/initialAdminPassword

選擇默認插件

賬戶密碼設(shè)置


2、Jenkins 安裝 Gitlab 插件
1.首先登錄Jenkins,點擊“系統(tǒng)管理”>"插件管理"。在插件管理中可以看到“可更新”、“可選插件”、“已安裝”插件。

2.我們切換到“可選插件”選項卡,在搜索框中輸入gitlab,找到gitlab pulgin。選中點擊安裝。如下是已經(jīng)安裝好的Gitlab插件。

3、Jenkins 整合 Gitlab
1、配置 Gitlab
創(chuàng)建一個新項目

2、上傳服務器秘鑰到 gitlab
# docker 生成密鑰
[root@deploy ~]# docker exec -it jenkins /bin/bash
root@2e8b64783be4:/# ssh-keygen -t rsa -C "xxx@163.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:+wxdAKOjCWMiiLNktBgnzH0h9RToHBrvUsdWUPf9tt4 18611142071@163.com
The key's randomart image is:
+---[RSA 2048]----+
|=.o..oo+*. . |
|=*.o.+o. +. . . |
|B++ B =.. . . . |
|+= + B = . .|
|. = o S . o|
| . . o . ..|
| . o . . |
| + . .|
| o .E|
+----[SHA256]-----+
root@2e8b64783be4:/# cat ~/.ssh/id_rsa.pub
秘鑰放到gitlab中
# 虛擬機生成秘鑰
[root@deploy ~]# ssh-keygen -t rsa -C "xxx@163.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:+wxdAKOjCWMiiLNktBgnzH0h9RToHBrvUsdWUPf9tt4 18611142071@163.com
The key's randomart image is:
+---[RSA 2048]----+
|=.o..oo+*. . |
|=*.o.+o. +. . . |
|B++ B =.. . . . |
|+= + B = . .|
|. = o S . o|
| . . o . ..|
| . o . . |
| + . .|
| o .E|
+----[SHA256]-----+
[root@deploy ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAB3NzaC1yc2EAAAADAQABAAABAQC1kOUt1qRxd/rJJkOIYOeM9u0twE9pZq4txKwEtAy3lT2LCcxgWbcjC0VBI84FO9XE8BKA/oEA1wCErVevnDoYfLT99x8t6SLc8bKZ9SOSAAt1LO5HkzaaBDnuoXyVRduWJHlN9zS7lGYxbEY1AHYWwA3hDl3Y/SPUC6ulwCU7QnbOn8GE7qGXW8BDdeTyIEXqn3pFYFTa7TiqnjR9w3iqzso32Yo/sDeEsdsm6uw8uEVUexBqeUdjB6OP35JLpnwaGhoXeiIW87fCtk37PFzb5quZB2yoBKTJHFU8lC+Ihh/Z/iGOyU0mmjvq8ot8P5RfDPFtpFc4Oipm3c3etNd root@deploy
3、將公鑰上傳到 gitlab

1、初始化項目
[root@deploy ~]# mkdir -p /data/Ansible/
[root@deploy ~]# cd /data/Ansible/
[root@deploy Ansible]# git config --global user.name "baiyongjie"
[root@deploy Ansible]# git config --global user.email "misterbyj@163.com"
[root@deploy Ansible]# git clone ssh://git@101.89.82.106:59888/root/Ansible.git code
Cloning into 'code'...
The authenticity of host '[101.89.82.106]:59888 ([101.89.82.106]:59888)' can't be established.
ECDSA key fingerprint is SHA256:KgiTZyrCxFQwHivVyAYc1XrpvfWVliLaC+S0cg2fwYE.
ECDSA key fingerprint is MD5:b8:f9:75:c9:53:c1:48:6e:90:65:c5:5b:e7:5c:bd:ba.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[101.89.82.106]:59888' (ECDSA) to the list of known hosts.
warning: You appear to have cloned an empty repository.
[root@deploy Ansible]# cd code/
[root@deploy code]# echo "##### jenkins test" > README.md
[root@deploy code]# git add .
[root@deploy code]# git commit -m 'add readme'
[master (root-commit) 3b6717d] add readme
1 file changed, 1 insertion(+)
create mode 100644 README.md
[root@deploy code]# git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@101.89.82.106:59888/root/Ansible.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
2、配置 Gitlab 為整合 Jenkins 做準備
創(chuàng)建訪問令牌,設(shè)置方法如下圖

復制訪問令牌,備用

復制Gitlab倉庫地址,備用

配置Jenkins
選擇系統(tǒng)管理->管理插件->可選擇插件->搜索 gitlab

插件安裝完成后會顯示

然后繼續(xù)安裝Gitlab Authentication和Gitlab Hook

配置jenkins連接gitlab,選擇左側(cè)的系統(tǒng)管理,然后選擇中間的系統(tǒng)設(shè)置

然后點擊左上角的配置,選擇Gitlab

配置GitLab,Connection Name隨便填,Git Host URL填GitLab的訪問地址,然后點Add—jenkins,如圖:


image](https://i.loli.net/2018/08/03/5b64754243a45.png)
Credentials選擇剛創(chuàng)建的GitLab Api Token,然后點下Test Connection,看下是否成功,如成功點擊最下面的保存

配置Git plugin

創(chuàng)建一個測試工程,選擇自由風格

源碼管理選擇git,選擇Add-Jenkins,配置Gitlab的賬號密碼


配置自動觸發(fā),點擊構(gòu)建觸發(fā)器,先勾選Build when a change is pushed to GitLab,點擊高級,然后再點擊一下Generate就會生成一個Secret Token,如下

點擊左下角的保存按鈕。記錄兩個東西,一個是Build when a change is pushed to GitLab那一行中,GitLab CI Service URL:后面的 URL; 還有一個就是剛剛生成的Secret Token,這倆在后面配置GitLab工程時需要用到
配置Gitlab工程
在gitlab進入那個叫Ansible的項目,點擊設(shè)置,點擊導入所有倉庫,在URL里填寫剛剛記下來的URL,在安全令牌里填寫剛剛記下來的Secret Token,如圖:

然后點擊下面綠色的增加Web鉤子,如多出一個如下圖的web鉤子

如果提示 Urlis blocked: Requests to localhost are not allowed,這需要開啟允許鉤子訪問本地網(wǎng)絡(luò)

對剛剛生成的web鉤子點擊test,選擇push events,然后就會出現(xiàn)200的成功字樣,如圖:

如果你再點擊一下test上面的edit,就會看到鉤子最近調(diào)用情況,再點擊view details的話,就會看到具體的調(diào)用細節(jié),如圖:

測試自動構(gòu)建
在服務器上push代碼,
[root@deploy code]# echo "測試jenkins是否會自動構(gòu)建" > auto-jenkins
[root@deploy code]# git add .
[root@deploy code]# git commit -m 'test autojenkins'
[master 2290848] test autojenkins
1 file changed, 1 insertion(+)
create mode 100644 auto-jenkins
[root@deploy code]# git push origin master
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 320 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@101.89.82.106:59888/root/Ansible.git
3b6717d..2290848 master -> master
到Jenkins查看構(gòu)建記錄,發(fā)現(xiàn)push動作已經(jīng)出發(fā)了Jenkins的自動構(gòu)建

查看構(gòu)建的控制臺輸出日志,重點看commit message和Finished

結(jié)束語.
至此,Jenkins結(jié)合Gitlab就已經(jīng)做完了, 每次開發(fā)push代碼后觸發(fā)jenkins的自動構(gòu)建, 可以在下面的構(gòu)建步驟里增加一些shell,ansible-playbook等來幫助我們完成自動部署等操作.
Jenkins 整合 Ansible
安裝 jenkins 和 ansible
要 jenkins 支持 ansible 的前提條件是在 jenkins 所在的主機上安裝 ansible
jenkins 和 ansible 安裝可以參考 https://baiyongjie.com/?p=188
測試ansible
[root@deploy ansible]# cd /etc/ansible/
[root@deploy ansible]# > hosts
[root@deploy ansible]# vim hosts
[client]
10.241.0.2
# 生成秘鑰
[root@deploy ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:NRuBl+TBQow5l3nb+E/MCg95tpZRF/+amoRTaBIhTXw root@deploy
The key's randomart image is:
+---[RSA 2048]----+
| .O+*+. |
| +.XoEo . |
| o.==+ o|
| oo=. . o|
| S +o.+ ..|
| o+o= + .|
| o*.B o |
| o*.+ |
| .o. |
+----[SHA256]-----+
#將秘鑰拷貝到客戶機
[root@deploy ansible]# ssh-copy-id 10.241.0.2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.241.0.2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '10.241.0.2'"
and check to make sure that only the key(s) you wanted were added.
#測試ansible能否正常運行
[root@deploy ansible]# ansible client -m ping
10.241.0.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
#新建一個測試的ansible-playbook
[root@deploy ~]# mkdir -p /data/Ansible-playbook
[root@deploy ~]# vim /data/Ansible-playbook/jenkins-mkdir.yml
---
- hosts: client
gather_facts: no
tasks:
- name: mkdir jenkins-test-dir
file: path=/data/jenkins-test-dir state=directory
配置jenkins
登陸jenkins 選擇系統(tǒng)管理->管理插件 安裝以下兩個插件: Ansible、AnsiColor

回到首頁,新建一個任務,選擇構(gòu)建一個只有風格的任務

然后構(gòu)建的步驟新加一個Ansible-playbook,配置腳本路徑,然后保存

查看新構(gòu)建的工程

執(zhí)行剛才構(gòu)建工程

查看工程構(gòu)建的控制臺輸出


到client主機查看 jenkins-test-dir 目錄是否創(chuàng)建成功
#查看client的ip地址
[root@deploy ~]# cat /etc/ansible/hosts
[client]
10.241.0.2
#登陸到遠程主機
[root@deploy ~]# ssh 10.241.0.2
Last login: Fri Aug 3 22:02:58 2018 from gateway
#查看目錄是否存在
[root@client ~]# tree /data/
/data/
└── jenkins-test-dir
#查看目錄的詳細信息
[root@client ~]# stat /data/jenkins-test-dir/
File: ‘/data/jenkins-test-dir/’
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: 802h/2050d Inode: 68197841 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-08-03 22:19:48.393000000 +0800
Modify: 2018-08-03 22:12:27.046000000 +0800
Change: 2018-08-03 22:12:27.046000000 +0800
#從上面的信息可以看到目錄的創(chuàng)建時間為22:12:27, 與jenkins構(gòu)建時間一致


