IT评测·应用市场-qidao123.com

标题: 摆设GitLab服务器 [打印本页]

作者: 立山    时间: 2024-12-15 08:31
标题: 摆设GitLab服务器
环境预备


主机名IP地址设置角色windows––程序员develop192.168.0.10|公网IP2vCPU,4G内存程序员gitlab192.168.0.20|公网IP2vCPU,4G内存远程堆栈jenkins192.168.0.30|公网IP2vCPU,4G内存CI/CD服务器web1192.168.0.40|公网IP2vCPU,4G内存web服务器 项目架构图

GitLab


摆设GitLab服务器


  1. [root@gitlab ~]# cd /root/docker
  2. [root@gitlab docker]# dnf -y localinstall *.rpm                        #安装容器管理软件docker
  3. [root@gitlab docker]# dnf -y install bash-completion        #安装tab键(刷新生效)
  4. [root@gitlab ~]# systemctl start docker                                 #启动服务
  5. [root@gitlab ~]# systemctl enable docker                                #将服务设置为开机自启
复制代码
修改gitlab服务器的的sshd服务端口号为8022,因为gitlab容器也要用到22端口,有冲突。
vim +17是指打开设置文件时,光标直接定位到第17行。
  1. [root@gitlab ~]# vim +17 /etc/ssh/sshd_config                         #修改配置文件
  2. 17 Port 8022
  3. [root@gitlab ~]# systemctl restart sshd                                        #重启sshd远程管理服务
  4. #重启之后需要使用远程工具重新连接gitlab服务器,并且指定8022端口号
复制代码
gitlab容器运行需要/etc/resolv.conf文件,如果该文件已存在,则无需创建
  1. [root@gitlab ~]# touch /etc/resolv.conf
复制代码

  1. [root@gitlab ~]# docker load < /root/gitlab_zh.tar
  2. [root@gitlab ~]# docker images                                                        #查看镜像是否导入
复制代码

  1. [root@gitlab ~]# mkdir -p /srv/gitlab/{config,logs,data}        #创建持久化目录
  2. [root@gitlab ~]# ls /srv/gitlab/
  3. config data logs
复制代码

  1. [root@gitlab ~]# docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab_zh
  2. [root@gitlab ~]# docker ps                                                                #查看容器正在运行的容器
  3. # 如果一切正常,几分钟后,可以访问http://gitlab服务器的公网ip/ (以自己为准)
  4. # 例如:http://121.36.66.101/
复制代码
附:如果容启动失败,再次创建有以下错误:
  1. Error: error creating container storage: the container name "gitlab" is already in use by "ca425e33d7ff2给i他d282cbec1033023851cff285fe9b819ed50d47a08a875372fde". You have to remove that container to be able to reuse that name.: that name is already in use
复制代码
则:
  1. [root@gitlab ~]# docker rm gitlab
  2. [root@gitlab ~]# docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab_zh
复制代码
设置gitlab








点击头像–>退出,重新登录验证


GitLab中重要的概念





填写截图上的几项后,其他使用默认设置,点生存。


创建好用户后,点击编辑,可以为他/她设置密码:























客户端上传代码到gitlab服务器




  1. [root@develop ~]# dnf -y install git                                                #安装git工具
复制代码
从gitlab服务器复制地址之后,需要将gitlab单词改为自己gitlab服务器的公网IP地址
  1. ~]# git clone http://121.36.66.101/devops/myproject.git        #克隆远程仓库
  2. [root@develop ~]# ls                                                                   #本地出现一个myproject目录
  3. myproject
复制代码
windows客户端也可以使用git clone克隆远程堆栈,提前安装git客户端(安装包在2024-AI大模型Java全链路工程师环境资料/第四模块/cicd中)
如果是刚刚安装的git软件需要首先界说全局设置,方可继续使用(实行一次即可)
  1. git config --global user.name "jerry"
  2. git config --global user.email "jerry@tedu.cn"
复制代码

使用develop服务器编写README.txt文件,并上传至远程堆栈
  1. [root@develop ~]# cd myproject/
  2. [root@develop myproject]# vim README.md
  3. Welcome to my beautiful world!
  4. [root@develop myproject]# git add .                                                   #保存到暂存区
  5. [root@develop myproject]# git commit -m "init data"                 #提交至本地仓库
  6. # 将master分支推送到origin仓库。origin是默认仓库名。
  7. [root@develop myproject]# git push -u origin master
  8. Username for 'http://192.168.4.20': jerry                                   #用户名
  9. Password for 'http://jerry@192.168.4.20': 1234.com                   #密码(输入不显示)
  10. # 在服务器上刷新web页面,可以看到仓库中已经多出了README.md文件
复制代码
重新操纵编写代码,并提交远程堆栈
  1. # 将来就可以重得操作:写代码、确认到版本库、上传到服务器
  2. [root@develop myproject]# cp /etc/hosts .
  3. [root@develop myproject]# git add .
  4. [root@develop myproject]# git commit -m "add hosts"
  5. [root@develop myproject]# git push                                                   #不需要再使用-u选项
  6. Username for 'http://192.168.4.20': jerry
  7. Password for 'http://jerry@192.168.4.20': 1234.com                        #密码(输入不显示)
  8. # 在服务器上刷新web页面,可以看到仓库中已经多出了hosts文件
复制代码
另一个客户端Windows拉取新代码,并且上传自己的代码(需要windows安装好git客户端)
  1. $ git pull                                                                                                        #拉取代码
  2. remote: Counting objects: 6, done.
  3. remote: Compressing objects: 100% (4/4), done.
  4. remote: Total 6 (delta 0), reused 0 (delta 0)
  5. Unpacking objects: 100% (6/6), 515 bytes | 0 bytes/s, done.
  6. From http://121.36.66.101/devops/myproject
  7. * [new branch]      master     -> origin/master
复制代码
Windows当地堆栈中已经多出了数据

Windows上传数据至远程堆栈,编写win.txt文件,内容为"Here is Windows file."
  1. $ git add .                                                                                #提交暂存区
  2. $ git commit -m 'add Win.txt'                                        #提交本地仓库
  3. $ git push -u origin master                                                #将master分支推送到origin仓库
  4. # 在服务器上刷新web页面,可以看到仓库中已经多出了Win.txt文件
复制代码
develop服务器拉取新代码,验证是否可以或许同步Win.txt
  1. [root@devlop myproject]# git pull
  2. [root@devlop myproject]# ls                                                #查看多出Win.txt
  3. hosts  README.md  Win.txt
  4. [root@devlop myproject]# cat Win.txt                         #内容正确
  5. Here is Windows file.[root@devlop myproject]#
复制代码
CI-CD概述



软件程序上线流程

安装Jenkins服务器


  1. # 安装依赖包
  2. # jenkins需要通过git下载代码,所以装git。
  3. # jenkins是java程序,所以装java
  4. # postfix和mailx是邮件程序,jenkins可以通过它们给管理员发邮件
  5. [root@jenkins ~]# dnf -y install  git postfix mailx java-11-openjdk
复制代码
  1. [root@jenkins ~]# ls                                                                                #查看是否上传完毕
  2. jenkins-2.263.1-1.1.noarch.rpm jenkins_plugins.tar.gz
  3. ~]# dnf -y localinstall  jenkins-2.263.1-1.1.noarch.rpm                #安装jenkins
  4. [root@jenkins ~]# systemctl start jenkins                        #启动jenkins服务
  5. [root@jenkins ~]# systemctl enable jenkins                        #将jenkins服务设置为开机自启
  6. [root@jenkins ~]# ss -nutlp | grep :8080                        #查看端口8080是否正常
复制代码

  1. # 查看初始化密码,每个人的都不一样,请以自己的为准
  2. [root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
  3. b9d26edeef714940ab10aaa541081d90
复制代码
把查看到的密码粘贴到文本框中,如下:










使用admin用户,密码123456登录jenkins

设置jenkins


  1. [root@jenkins ~]# tar -xf jenkins_plugins.tar.gz
  2. #拷贝文件的时候,注意选项,-r可以拷贝目录,-p保留权限
  3. [root@jenkins ~]# cp -rp jenkins_plugins/* /var/lib/jenkins/plugins/
  4. [root@jenkins ~]# systemctl restart jenkins                                #重启jenkins服务
  5. #刷新web页面,如果出现中文,则插件安装成功
复制代码
软件版本管理


  1. [root@develop ~]# cd myproject/                                                   #进入项目目录
  2. [root@develop myproject]# git tag                                                 #查看标记,默认没有标记
  3. [root@develop myproject]# git tag 1.0                                         #将当前提交,标识为1.0
  4. [root@develop myproject]# git tag                                                #查看标记
  5. 1.0
  6. [root@develop myproject]# echo 'hello world' > index.html
  7. [root@develop myproject]# git add .
  8. [root@develop myproject]# git commit -m "add index.html"
  9. [root@develop myproject]# git tag 1.1                                        #将当前提交,标识为1.1
  10. # 将本地文件和tag推送到gitlab服务器
  11. [root@develop myproject]# git push                                           #只推送文件,不推送标记
  12. [root@develop myproject]# git push --tags
复制代码
在gitlab上查看标记

设置jenkins访问gitlab远程堆栈







git堆栈地址,在gitlab上找到myproject堆栈的http地址,注意将gitlab名称改为IP地址

指定分支构建的时候,使用上面步骤创建的变量$web






在jenkins服务器查看内容,查看是否下载乐成
  1. [root@jenkins ~]# ls /var/lib/jenkins/workspace/myproject/
  2. hosts  index.html  README.md  Win.txt
复制代码
下载到子目录




新增时,如果没有中文,英文是"checkout to a sub directory"


测试
  1. [root@jenkins ~]# rm -rf /var/lib/jenkins/workspace/myproject/        #删除之前下载的
复制代码
实行多次构建,构建不同版本




查看下载目录
  1. [root@jenkins ~]# ls /var/lib/jenkins/workspace/myproject/
  2. myproject-1.0 myproject-1.1
复制代码
摆设代码到web服务器

主动化摆设流程

设置共享服务器


  1. [root@jenkins ~]# dnf -y install httpd                                                 #安装apache的软件包
  2. [root@jenkins ~]# mkdir -p /var/www/html/deploy/packages         #创建jenkins从gitlab上下载的打包代码存放的目录
  3. [root@jenkins ~]# chown -R jenkins:jenkins /var/www/html/deploy/ #修改权限,因为是jenkins自动下载的,需要修改存放的权限
  4. [root@jenkins ~]# systemctl start httpd
  5. [root@jenkins ~]# systemctl enable httpd
复制代码
设置jenkins把gitlab下载的代码打包





  1. pkg_dir=/var/www/html/deploy/packages
  2. cp -r myproject-$web $pkg_dir
  3. rm -rf $pkg_dir/myproject-$web/.git
  4. cd $pkg_dir
  5. tar -zcf myproject-$web.tar.gz myproject-$web
  6. rm -rf myproject-$web
  7. md5sum myproject-$web.tar.gz | awk '{print $1}' > myproject-$web.tar.gz.md5
  8. cd ..
  9. echo -n $web > ver.txt
复制代码
测试修改的任务




浏览器访问:http://jenkins公网IP/deploy/packages/即可看到打包的代码

web服务主动摆设

  1. [root@web1 ~]# dnf -y install httpd  wget
  2. [root@web1 ~]# mkdir /var/www/download                         #存储jenkins主机上下载的应用代码
  3. [root@web1 ~]# mkdir /var/www/deploy                         #部署应用代码
  4. [root@web1 ~]# systemctl start httpd                        #启动httpd服务
  5. [root@web1 ~]# systemctl enable httpd                        #将httpd服务设置为开机自启
  6. [root@web1 ~]# ss -ntulp | grep :80                                #查看80端口是否正常
复制代码
编写主动上线脚本


  1. [root@web1 ~]  # vim web.py
  2. import os
  3. import requests
  4. import hashlib
  5. import tarfile
  6. def has_new_ver(web1_ver_path, ver_url):
  7.     # web1_ver_path 为应用服务器web1主机的当前版本文件路径
  8.     # 如果文件不存在,返回True, 提示没有新版本
  9.     if not os.path.exists(web1_ver_path):
  10.         return True
  11.     # 当web1_ver_path存在时,先获取当前应用的版本号
  12.     with open(web1_ver_path, mode="r") as fr:
  13.         local_ver = fr.read()
  14.     # 通过requests获取jenkins服务器上的最新版本号
  15.     r = requests.get(ver_url)
  16.     # 当web1上的版本号和Jenkins服务器上的版本号不相等时,返回True, 即有新的版本
  17.     if local_ver != r.text:
  18.         return True
  19.     return False
  20. # 声明函数file_ok(), 功能:如果下载的包文件未损坏,则返回True,否则返回False
  21. def file_ok(web1_tar_path, jenkins_tar_md5_url):
  22.     m = hashlib.md5()
  23.     with open(web1_tar_path, mode="rb") as fw:
  24.         while True:
  25.             data = fw.read(4096)
  26.             if len(data) == 0:
  27.                 break
  28.             m.update(data)
  29.     # jenkins_tar_md5_url 为jenkins服务器上的压缩包的md5值文件链接地址
  30.     r = requests.get(jenkins_tar_md5_url)
  31.     if m.hexdigest() == r.text.strip():
  32.         # 相等,代表文件未损坏,返回True
  33.         return True
  34.     return False
  35. # 声明函数deploy(), 功能:用于部署软件到 web1 服务器
  36. def deploy(web1_tar_path, web1_deploy_dir, dest):
  37.     tar = tarfile.open(web1_tar_path)  # 打开压缩包web1_tar_path
  38.     tar.extractall(path=web1_deploy_dir)  # 解压到web1_deploy_dir目录下
  39.     tar.close()  # 关闭tar
  40.     # 获取web1_tar_path变量中,最后一个'/',右边的内容,然后做切片,去除".tar.gz",只留下文件名
  41.     file_name = os.path.basename(web1_tar_path)[:-7]
  42.     # 将变量web1_deploy_dir和变量file_name拼接在一起
  43.     app_dir = os.path.join(web1_deploy_dir, file_name)
  44.     # 创建链接,如果软链接dest存在,删除软连接,然后为app_dir创建新的软链接
  45.     if os.path.exists(dest):
  46.         os.remove(dest)
  47.     os.symlink(app_dir, dest)
  48. if __name__ == "__main__":
  49.     ### 判断jenkins服务器上是否有新版本
  50.     # ver_url 为jenkins服务器的当前版本文件路径
  51.     # web1_ver_path 为应用服务器web1主机的当前版本文件路径
  52.     # 这里的地址需要求改为自己的IP地址
  53.     ver_url = "http://120.46.84.196/deploy/ver.txt"
  54.     web1_ver_path = "/var/www/deploy/ver.txt"
  55.     if not has_new_ver(web1_ver_path, ver_url):
  56.         print("no new version~")
  57.         exit(1)
  58.     # ==========================================
  59.     # 如果服务器上有新版本,则下载新版本
  60.     # r.text 为jenkins服务器的当前版本内容
  61.     # jenkins_tar_url 为jenkins服务器上的压缩包链接地址
  62.     # web1_tar_path 为应用服务器web1主机的压缩包路径
  63.     # 这里的地址需要修改为自己的IP地址
  64.     r = requests.get(ver_url)
  65.     jenkins_tar_url = f"http://120.46.84.196/deploy/packages/myproject-{r.text}.tar.gz"
  66.     web1_tar_path = f"/var/www/download/myproject-{r.text}.tar.gz"
  67.     with open(web1_tar_path, mode="wb") as fw:
  68.         fw.write(requests.get(jenkins_tar_url).content)
  69.     # 校验下载的软件包是否损坏,如果损坏则删除 os.remove()
  70.     # jenkins_tar_md5_url 为jenkins服务器上的压缩包的md5值文件链接地址
  71.     jenkins_tar_md5_url = jenkins_tar_url + ".md5"
  72.     if not file_ok(web1_tar_path, jenkins_tar_md5_url):
  73.         print("File has been broken~")
  74.         os.remove(web1_tar_path)
  75.         exit(2)
  76.     # =========================================
  77.     web1_deploy_dir = '/var/www/deploy'
  78.     dest = '/var/www/html/current'
  79.     deploy(web1_tar_path, web1_deploy_dir, dest)
  80.     # 更新本地的版本文件
  81.     if os.path.exists(web1_ver_path):
  82.         os.remove(web1_ver_path)
  83.     with open(web1_ver_path, mode="w") as fw:
  84.         fw.write(requests.get(ver_url).text)
复制代码
  1. [root@web1 ~]# python3 web.py
  2. [root@web1 html]# ls /var/www/deploy
  3. myproject-1.1  ver.txt
复制代码
浏览器访问http://web服务器公网IP/current 可以看到摆设的文件页面


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4