gitlab和jenkins的安装及使用
gitlab
准备: 最少4G内存
先安装docker软件包
然后使用docker search gitlab 查找镜像
然后使用docker pull 镜像名:标签名 下载镜像
启动容器: docker run -d -h gitlab --name gitlab -p443:443 -p80:80 -p22:22 --restart always -v /src/gitlab/config:/etc/gitlab -v /src/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
使用 docker ps 查看 直到看到(healthy)才算成功
使用谷歌登陆数组机的ip 就能看到gitlab页面
设置密码,密码必须8位
gitlab关键概念:
(1) 群组group: 可以为一个团队创建一个group
(2) 成员member, 可以为一个用户创建一个账号,可以group中的一个成员
(3) 项目project, 一个团队可以开发很多项目
创建项目及用户
步骤:
(1) 创建名为devops的group
群组路径: http://192.168.4.1/devops
群组名称: devops
可见等级:公开
4、创建用户
添写姓名、用户名、电子邮箱,其他保持默认
创建用户的时候,不能设置密码。用户创建完毕后,编辑用户,可以修改密码。
(2) 创建名为myproject的项目
项目路径:http://192.168.4.1/devops/myproject
可见等级:公开
(3) 授权:允许新建的用户对项目有写入权限
找到项目后,点击左下角的“设置” -> “成员”
选择要邀请的成员:第4步创建用的用户
选择角色权限:主程序员
(4) 配置新建用户可以免密推送代码
(1) 退出root用户
(2) 使用新建帐号登陆,用户第一次登陆,需要修改密码
(3) 点击右上角用户图标 -> 设置 -> 点击左下角ssh密钥
ssh-keygen -t rsa -C "15867630863@163.com" -b 4096 cat /root/.ssh/id_rsa.pub
# 把公钥内容复制web页面中的ssh密钥文本框中
到此为止,gitlab 服务大功告成!!!
使用:
mkdir project 先创建一个文件夹, git init 创建一个版本库
git remote rename origin old-origin
以下错误可忽略:
error: 不能重命名配置小节 'remote.origin' 到 'remote.old-origin'
git remote add origin git@192.168.4.1:devops/myproject.git
# git push -u origin --all
如果推送失败,错误中有一项显示Permission denied,解决办法是:
执行eval $(ssh-agent) #把后面一个命令结果给前面执行
git push -u origin --all # 再次推送
再次推送
代码有更新,推送新代码到服务器
[root@node3 myproject]# echo 'how are you?' > welcome.txt
[root@node3 myproject]# git add .
[root@node3 myproject]# git commit -m "add welcome.txt"
git push 上传
错误集: 没有改sshd端口 导致端口冲突无法启动容器 端口冲突!!!
报错信息如下: error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.
May 22 22:11:32 localhost.localdomain sshd[31560]: error: Bind to port 2222 on :: failed: Per
May 22 22:11:32 localhost.localdomain sshd[31560]: fatal: Cannot bind any address.
jenkins
创建一个虚拟机(必须能连接外网)
先在jenkins官网上下载安装包: https://pkg.jenkins.io/redhat/ (最好提前下载,下载的贼慢~)
最好下载2.138.4以上的否则会报一下错误 :
警告:此插件需要依赖插件,这些插件需要Jenkins 2.138.4或更高版本。Jenkins将拒绝加载需要更新版本Jenkins的依赖插件,反过来加载此插件将失败。
rpm -ivh jenkins-2.178-1.1.noarch.rpm
systemctl restart jenkins #启动金克斯
然后使用浏览器访问,192.168.1.162:80 (我用的是谷歌浏览器)
按向导初始化。其中安装插件时,什么也不要选择。“选择插件来安装” -> “无”
“创建第一个管理员”界面,选择右下角“使用admin账号登陆” -> 保存并完成
进入管理页面后,点击右上角的admin -> 左侧的设置 -> 修改密码
安装插件:
(1) 使用国内镜像
首页 -> 系统管理 -> 插件管理 -> 高级 -> 升级站点:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
-> 提交
(2) 安装插件
可选插件 -> git parameter -> 直接安装 -> 安装完成后重启Jenkins(空闲时)
(3) 在jenkins服务器上安装git
]# yum install -y git
(4)如果在线安装不上,可以先下载,下载网址是:
http://updates.jenkins-ci.org/download/plugins/git-parameter/
下载后,在首页 -> 系统管理 -> 插件管理 -> 高级 -> 上传插件
上线流程:
1、程序员编写代码
]# git init /tmp/myweb
]# cd /tmp/myweb
]# echo '<h1>Hello World</h1>' > index.html
]# git add .
]# git commit -m "myweb version 1.0" (如果没有验证用户则需要验证: git config --global user.email "邮箱地址@163.com" && git config --global user.name "你的名字")
]# git tag 1.0 # 标记此时的版本号为1.0版本
]# git tag # 查看版本
1.0
1.0开发完毕后,继续开发新版本
[root@room8pc16 myweb]# echo '<h2>my web 2.0</h2>' >> index.html
[root@room8pc16 myweb]# git add .
[root@room8pc16 myweb]# git commit -m "my web 2.0"
[root@room8pc16 myweb]# git tag 2.0 # 标记此时的版本号为2.0版本
2、代码推送到gitlab服务器
(1) 启动gitlab服务器
(2) 在名为devops的group下创建项目myweb,可见等级为公开 #找不到的时候可以点上面那个扳手~
(3) 在myweb项目中授权用户是主程序员角色
(4) 上传代码到gitlab服务器
]# cd /tmp/myweb/
# git remote rename origin old-origin
如果出现以下报错,可以忽略
error: 不能重命名配置小节 'remote.origin' 到 'remote.old-origin'
# git remote add origin http://192.168.4.1/devops/myweb.git
# git push -u origin --all # 推送所有的确认
# git push -u origin --tags # 推送所有的tag
3 jenkins拉取gitlab上的代码
创建自由风格的软件项目 -> 参数化构建过程 -> 添加参数选git parameter
-> name: webver, parameter type: tag, Default Value: origin/master
-> 源码管理 -> Repository URL: http://192.168.4.1/devops/myweb.git
-> Branches to build: $webver ->保存
执行工程,拉取代码:Build with Parameters -> 选择1.0后构建
-> 左下角的Build History,成功显示蓝球,失败是红球
4、查看拉取下来的代码:
]# ls /var/lib/jenkins/workspace/
5、为了方便应用服务器从jenkins上把代码下载过去,在jenkins上安装apache,把
从gitlab上拉取的代码放到apache中用于下载
~]# yum install -y httpd
~]# systemctl start httpd
~]# systemctl enable httpd
6、创建apache目录
/var/www/html/deploy: 存储版本文件
/var/www/html/deploy/live_ver:最新版本文件
/var/www/html/deploy/last_ver:前一个版本文件
/var/www/html/deploy/packages/: 存储压缩后的软件包和它的md5值
~]# mkdir -p /var/www/html/deploy/packages/
~]# chown -R jenkins:jenkins /var/www/html/deploy/
7、修改jenkins工程
(1) 将check out的版本放到子目录中
在源码管理下面,Additional Behaviours -> check out to a sub-directory
-> Local subdirectory for repo: myweb-$webver
# ls /var/lib/jenkins/workspace/myweb/
(2) 将软件打包放到apache相关目录下
构建 -> 增加构建步骤 -> 执行shell
deploy_dir=/var/www/html/deploy
cp -r myweb-$webver $deploy_dir/packages/
cd $deploy_dir/packages
rm -fr myweb-$webver/.git
tar czf myweb-$webver.tar.gz myweb-$webver
rm -rf myweb-$webver
md5sum myweb-$webver.tar.gz | awk '{print $1}' > myweb-$webver.tar.gz.md5
cd $deploy_dir
[ -f live_ver ] && cat live_ver > last_ver
echo $webver > live_ver
在应用服务器上部署软件
1、检查是否有新版本
如果本地没有版本文件,或本地版本比jenkins上的版本低
2、有新版本则下载相应的压缩包
3、校验压缩包,检查下载的压缩包是否损坏
4、如果压缩包没有损坏,则部署
将压缩包解压到deploy目录下,创建到解压目录的链接
5、路径规划
/var/www/download/: 存储下载的压缩包和md5文件
/var/www/deploy/: 存储live_ver和解压后的软件目录
jenkins自动化部署:
[root@jump linux]# cat deploy_app.py
import requests
import wget
import os
import hashlib
import tarfile
def has_new_ver(ver_fname, ver_url):
# 如果本地没有版本文件,表示有新版本
if not os.path.isfile(ver_fname):
return True
# 读取本地版本文件内容
with open(ver_fname) as fobj:
local_ver = fobj.read()
# 获取远程版本
r = requests.get(ver_url)
remote_ver = r.text
# 如果本地和远程版本不一样,表示有新版本
if local_ver != remote_ver:
return True
# 如果本地和远程版本一样,则没有新版本
return False
def has_error(fname, md5_url):
# 计算本地文件的md5
m = hashlib.md5()
with open(fname, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
r = requests.get(md5_url) # 取出服务器公布的md5值
if m.hexdigest() == r.text.strip():
return False # 如果两个md5值相等,表示文件未损坏
return True
def deploy(app_fname):
# app_fname: /var/www/download/myweb-1.0.tar.gz
# 解压缩
deploy_dir = '/var/www/deploy/'
tar = tarfile.open(app_fname, 'r:gz')
tar.extractall(path=deploy_dir)
tar.close()
# 拼出解压目录的绝对路径
app_path = os.path.basename(app_fname) # myweb-1.0.tar.gz
app_path = app_path.replace('.tar.gz', '') # myweb-1.0
app_path = os.path.join(deploy_dir, app_path)
# 创建链接,如果链接已存在,先删除它
link = '/var/www/html/nsd1811'
if os.path.exists(link):
os.remove(link)
os.symlink(app_path, link)
if __name__ == '__main__':
# 检查是否有新版本
app_dir = '/var/www/download/'
ver_fname = '/var/www/deploy/live_ver'
ver_url = 'http://192.168.4.4/deploy/live_ver'
if not has_new_ver(ver_fname, ver_url):
print('没有发现新版本')
exit(1)
# 如果有新版本,则下载
r = requests.get(ver_url)
ver = r.text.strip() # 获取服务器上的版本号
app_url = 'http://192.168.4.4/deploy/packages/myweb-%s.tar.gz' % ver
wget.download(app_url, app_dir)
# 校验下载的压缩包是否损坏
app_fname = app_url.split('/')[-1]
app_fname = os.path.join(app_dir, app_fname) # 拼接压缩包的绝对路径
md5_url = app_url + '.md5' # 拼出md5值的网址
if has_error(app_fname, md5_url):
print('文件已损坏')
os.remove(app_fname) # 如果文件已扣坏,则删除它
exit(2)
# 如果下载的文件是完好的,则部署
deploy(app_fname)
# 更新本地版本文件
with open(ver_fname, 'w') as fobj:
fobj.write(r.text)