本文共 9299 字,大约阅读时间需要 30 分钟。
• Jenkins是由java编写的一款开源软件
• 作为一款非常流行的CI(持续集成)工作,用于构建和测试各种项目 • Jenkins 的主要功能是监视重复工作的执行,例如软件工程的构建或在 cron下设置的 jobs• 持续集成(CI)是当下最为流行的应用程序开发实践方式
• 程序员在代码仓库中集成了修复bug、新特性开发或是功能革新 • CI工具通过自动构建和自动测试来验证结果。这可以检测到当前程序代码的问题,迅速提供反馈• 简单、可扩展、用户界面友好
• 支持各种SCM(软件配置管理)工具,如SVN、GIT、CVS等 • 能够构建各种风格的项目 • 可以选择安装多种插件 • 跨平台,几乎可以支持所有的平台[root@localhost ~]# wget http://mirrors.jenkins.io/war-stable/2.222.1/jenkins.war[root@localhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.222.1-1.1.noarch.rpm
• 安装Jenkins
[root@localhost ~]# yum -y install java-1.8.0-openjdk[root@localhost ~]# java -version[root@localhost ~]# yum -y install jenkins-2.222.1-1.1.noarch.rpm
• 启动服务
[root@localhost ~]# systemctl enable jenkins[root@localhost ~]# systemctl start jenkins
• Jenkins默认运行在8080端口
打开浏览器输入: 127.0.0.1:8080
[root@localhost ~]# cat /var/lib/jenkins/secrets/initialAdminPasswordf019e6b3799f4008b7a56c06f675da37
• 可以直接使用Admin登陆
• 安装成功如下图所示:
• 修改管理员密码:admin->设置
• 程序开发的生命周期内,需要程序员和运维共同协作
清华大学插件地址: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
• 如果是英文界面,可以在插件管理中,安装:Localization: Chinese (Simplified)
• 初始化git仓库
[root@localhost ~]# yum -y install git[root@localhost ~]# git config --global user.name 'zzg'[root@localhost ~]# git config --global user.email 'zzg@tedu.cn'[root@localhost ~]# git config --global core.editor vim
[root@localhost ~]# mkdir myweb[root@localhost ~]# git init myweb初始化空的 Git 版本库于 /root/myweb/.git/[root@localhost ~]# cd myweb/[root@localhost myweb]# echo 'My Web Site
' > index.html[root@localhost myweb]# git add .[root@localhost myweb]# git commit -m "web v1.0"
• 如果达到一个重要的阶段,并希望永远记住那个特别的提交快照,可以使用 git tag 给它打上标签
• 将初始化打标签v1.0[root@localhost myweb]# git tag v1.0 # 将当前状态标记为v1.0版本
[root@localhost myweb]# echo 'My Web 2 version
' >> index.html[root@localhost myweb]# git add .[root@localhost myweb]# git commit -m "web v2.0"[master 4518874] web v2.0 1 file changed, 1 insertion(+)[root@localhost myweb]# git tag v2.0
[root@localhost myweb]# git tag v1.0v2.0
密码: 72y1
Linux上部署GitLab[root@localhost ~]# unzip docker.zip[root@localhost ~]# cd /root/docker/docker_pkgs/[root@localhost docker_pkgs]# yum -y install *.rpm[root@localhost docker_pkgs]# systemctl enable docker[root@localhost docker_pkgs]# systemctl restart docker[root@localhost docker_pkgs]# cd ../images/[root@localhost images]# docker load < gitlab_zh.tar[root@localhost images]# docker images
• 将物理主机ssh端口改为2222后,起动容器
[root@localhost ~]# vim /etc/ssh/sshd_configPort 2022 # 17行[root@localhost ~]# firewall-cmd --zone=public --add-port=2022/tcp --permanent success[root@localhost ~]# firewall-cmd --reloadsuccess[root@localhost ~]# firewall-cmd --zone=public --query-port=2022/tcpyes[root@localhost ~]# setenforce 0[root@localhost ~]# systemctl restart sshd
[root@localhost ~]# 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:latest[root@localhost ~]# docker ps # 直到显示(health)才能正常访问[root@localhost ~]# docker logs gitlab # 日志文件
在gitlab上,在devops组中创建名为myweb的公开项目,新建的用户是该项目的主程序员
• 访问http://127.0.0.1,第一次需要设置root密码[root@localhost ~]# ssh-keygen -t rsa -C "zzg@tedu.cn" -b 4096[root@localhost ~]# cat /root/.ssh/id_rsa.pub程序员上传代码到gitlab
[root@localhost myweb]# git remote rename origin old-originerror: 不能重命名配置小节 'remote.origin' 到 'remote.old-origin'# 此处错误可以忽略
[root@localhost myweb]# git remote add origin git@192.168.138.160:/devops/myweb.git[root@localhost myweb]# git push -u origin --all[root@localhost myweb]# git push -u origin --tags
• 新建任务
• 选择自由风格• 添加Git Parameter参数
• 源码采用git 在jenkins上创建工程,自动下载代码。创建一个自由风格的项目=>勾选This project is parameterized =>添加参数 git parameter=> name: webver, Default Value: origin/master =>源码管理:git =>Repository URL: http://IP:/devops/myweb.git => Branch Specifier (blank for ‘any’): $webver => 保存• 构建工程
• 选择指定的标签 • 选择指定的标签 • 查看日志输出 • 查看日志输出 执行任务,jenkins将会下载myweb项目到/var/lib/jenkins/workspace目录[root@localhost ~]# ll /var/lib/jenkins/workspace/myweb/总用量 4-rw-r--r--. 1 jenkins jenkins 47 4月 3 22:42 index.html[root@localhost ~]# cat /var/lib/jenkins/workspace/myweb/index.htmlMy Web Site
My Web 2 version
• 在Jenkins服务器上安装apache,用于分发应用程序
• 为了方便应用服务器下载,Jenkins构建的工程应该 打包成为一个文件 • 为了应用服务器可以获知下载的程序文件是没有损坏 的,应该为其生成md5值• 通过web服务为应用服务器提供应用程序
• 下载目录为/var/www/deploy/packages[root@localhost ~]# yum -y install httpd[root@localhost ~]# vim /etc/httpd/conf/httpd.confListen 88 # 42行[root@localhost ~]# systemctl restart httpd[root@localhost ~]# systemctl enable httpd[root@localhost ~]# netstat -untlp | grep 88tcp6 0 0 :::88 :::* LISTEN 9397/httpd[root@localhost ~]# mkdir -p /var/www/html/deploy/pkgs# /var/www/html/deploy/: 保存livever、lastver,即当前版本和前一个版本的版本号# /var/www/html/deploy/pkgs/: 保存软件压缩包和它的md5值[root@localhost ~]# chown -R jenkins.jenkins /var/www/html/deploy/
• 为下载的应用打包,以及生成md5可以能过在工程中 增加构建步骤完成
编辑项目,选择下面的Additional Behavious => 新增 Checkout to a sub-directory: myweb-$webver 增加构建步骤=> Excute shell:deploy_dir=/var/www/html/deploypkgs_dir=/var/www/html/deploy/pkgscp -r myweb-$webver $pkgs_dir # 将下载的软件目录拷贝到web服务器目录cd $pkgs_dirrm -rf myweb-$webver/.git # 删除版本库文件tar czf myweb-$webver.tar.gz myweb-$webver # 打包压缩md5sum myweb-$webver.tar.gz | awk '{ print $1}' > myweb-$webver.tar.gz.md5 # 计算并保存md5值rm -rf myweb-$webver # 删除程序目录cd $deploy_dir[ -f livever ] && cat livever > lastver # 将当前版本内容写到前一版本文件echo $webver > livever # 更新当前版本
[root@localhost ~]# rm -rf /var/lib/jenkins/workspace/*
• 执行构建工程
[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb/myweb-v1.0[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb/myweb-v1.0/index.html[root@localhost ~]# cat /var/lib/jenkins/workspace/myweb/myweb-v1.0/index.htmlMy Web Site
[root@localhost ~]# ls /var/www/html/deploy/livever pkgs[root@localhost ~]# cat /var/www/html/deploy/livever v1.0[root@localhost ~]# ls /var/www/html/deploy/pkgs/myweb-v1.0.tar.gz myweb-v1.0.tar.gz.md5
[root@localhost ~]# ls /var/www/html/deploy/pkgs/myweb-v1.0.tar.gz myweb-v1.0.tar.gz.md5 myweb-v2.0.tar.gz myweb-v2.0.tar.gz.md5[root@localhost ~]# ls /var/lib/jenkins/workspace/myweb/myweb-v1.0 myweb-v2.0[root@localhost ~]# cat /var/www/html/deploy/lastver v1.0[root@localhost ~]# cat /var/www/html/deploy/livever v2.0[root@localhost ~]# ls /var/www/html/deploy/pkgs/myweb-v1.0.tar.gz myweb-v1.0.tar.gz.md5 myweb-v2.0.tar.gz myweb-v2.0.tar.gz.md5
1. 检查是否有新版本 2. 如果有新版本,下载 3. 检查下载的压缩包是否损坏 4. 如果没有损坏,部署
将物理主机作为应用服务器,对外提供服务: /var/www/download/:用于存储下载的软件包 /var/www/deploy/:用于存储当前版本文件和解压后的软件包 /var/www/html/jenkins:指向软件目录的链接[root@localhost ~]# pip install -i https://pypi.douban.com/simple/ requests[root@localhost ~]# mkdir /var/www/download
[root@localhost ~]# vim deploy_web.pyimport requestsimport wgetimport osimport hashlibimport tarfiledef has_new_ver(ver_url, ver_fname): # 如果本地没有版本文件,则有新版本 if not os.path.isfile(ver_fname): return True # 取出本地版本 with open(ver_fname) as fobj: local_ver = fobj.read() # 如果本地版本和远程版本不一致,则有新版本 r = requests.get(ver_url) if local_ver != r.text: return True return Falsedef check_pkgs(md5_url, pkg_path): # 取出远程md5值 r = requests.get(md5_url) remote_md5 = r.text.strip() m = hashlib.md5() with open(pkg_path, 'rb') as fobj: while True: data = fobj.read(4096) if not data: break m.update(data) local_md5 = m.hexdigest() if local_md5 == remote_md5: return True return Falsedef deploy(pkg_path, deploy_dir, version): dest = '/var/www/html/jenkins' src = '/var/www/deploy/myweb-%s' % version tar = tarfile.open(pkg_path, 'r') tar.extractall(path=deploy_dir) tar.close() # 如果目标链接已存在,先删除,否则无法创建 if os.path.exists(dest): os.remove(dest) # 创建链接 os.symlink(src, dest)if __name__ == '__main__': # 如果没有新版本则退出 ver_url = 'http://192.168.138.161:88/deploy/livever' ver_fname = '/var/www/deploy/livever' download_dir = '/var/www/download/' deploy_dir = '/var/www/deploy/' if not has_new_ver(ver_url, ver_fname): print('没有发现新版本') exit(1) # 有新版本,下载软件压缩包 r = requests.get(ver_url) version = r.text.strip() pkg_url = 'http://192.168.138.161:88/deploy/pkgs/myweb-%s.tar.gz' % version wget.download(pkg_url, download_dir) # 检查软件包是否损坏 pkg_path = pkg_url.split('/')[-1] pkg_path = os.path.join(download_dir, pkg_path) md5_url = pkg_url + '.md5' if not check_pkgs(md5_url, pkg_path): print('软件包已损坏') os.remove(pkg_path) exit(2) # 如果软件压缩包是完好的,则部署,并更新软件版本文件 deploy(pkg_path, deploy_dir, version) with open(ver_fname, 'w') as fobj: fobj.write(r.text)
执行
[root@localhost ~]# python3 deploy_web.py 100% [....................................................................] 205 / 205
[root@localhost ~]# ls /var/www/deploy/livever myweb-v2.0