欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

gitlab和jenkins的安装及使用

程序员文章站 2022-07-07 23:12:40
gitlab 准备: 最少4G内存 先安装docker软件包然后使用docker search gitlab 查找镜像然后使用docker pull 镜像名:标签名 下载镜像启动容器: docker run -d -h gitlab --name gitlab -p443:443 -p80:80 - ......

                                                              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,可见等级为公开      #找不到的时候可以点上面那个扳手~gitlab和jenkins的安装及使用
(3) 在myweb项目中授权用户是主程序员角色

gitlab和jenkins的安装及使用
(4) 上传代码到gitlab服务器

gitlab和jenkins的安装及使用
]# 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)