Fork me on GitHub

持续集成Jenkins

简介

Jenkins前身是Hudson(Sun开发),2010年从Hudson分支出来。由于Sun被Oracle收购,并拥有Hudson的商标所有权。2011年1月11日,“Hudson”改名为“Jenkins”,分支出来的Jenkins免费且开源,而Hudson用于商业用途,二者都在继续开发中。
Jenkins是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。无需人工干预,减少重复过程以节省时间、费用和工作量。具有易安装、易配置、跨平台、支持安装多种第三方插件等特点。

持续集成(Continuous Integration)

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,团队每个成员每天集成一次或多次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。保证产品快速迭代,同时还能保持高质量
优点:

  • 快速发现问题,并作出响应;
  • 最大限度地减少风险,降低修复错误代码的成本;
  • 将重复性的手工流程自动化,让工程师更加专注于代码;
  • 保持频繁部署,快速生成可部署的软件;
  • 提高项目的能见度,方便团队成员了解项目的进度和成熟度;
  • 增强开发人员对软件产品的信心,帮助建立更好的工程师文化

持续交付 (Continuous Delivery)

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
优点:

  • 快速发布。能够应对业务需求,并更快地实现软件价值。
  • 编码->测试->上线->交付的频繁迭代周期缩短,同时获得迅速反馈;
  • 高质量的软件发布标准。整个交付过程标准化、可重复、可靠,
  • 整个交付过程进度可视化,方便团队人员了解项目成熟度;
  • 更先进的团队协作方式。从需求分析、产品的用户体验到交互 设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费。

持续集成(Continuous Integration)

持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。这意味着,所有通过了一系列的自动化测试的改动都将自动部署到生产环境。它也可以被称为“Continuous Release”
实际上,产品在从需求到部署的过程中,会经历若干种不同的环境,例如QA环境、各种自动化测试运行环境、生产环境等。这些环境的搭建、配置、管理,产品在不同环境中的具体部署,状况是比较非常复杂的,从头到尾地全自动持续部署的确困难。那么,如果能做到持续交付,保证代码在模拟环境没问题,也就基本成功完成了

安装

Red Hat/Fedora/CentOS:

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins -y

Ubuntu/Debian:

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
deb https://pkg.jenkins.io/debian-stable binary/
apt-get update 
apt-get install jenkins -y

下载jenkins.war包:

Jenkins下载地址:https://jenkins.io/download/
运行:java –jar jenkins.war --httpPort=8080 (默认端口)

Docker Jenkins:

docker run --name jenkins --restart=always \
    -p 8080:8080 \
    -v /var/www/myjenkins:/var/jenkins_home \
    -d jenkinsci/blueocean

针对采用jenkins镜像安装遇到的问题:

[root@localhost ~]# docker logs myjenkins
#错误日志如下
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied

检查”/var/jenkins_home”目录权限,当前用户是”jenkins”而且”/var/jenkins_home”目录是属于jenkins用户拥有的

[root@localhost ~]# docker run -ti --rm --entrypoint="/bin/bash" docker.io/jenkinsci/blueocean  -c "whoami && id"
jenkins
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)

而宿主机本地数据卷/var/www/jenkins目录的拥有者是root用户,解决方案:
1.把当前目录的拥有者赋值给uid 1000,再启动jenkins容器(或者修改宿主机本地数据卷目录权限777)

chown -R 1000 /var/www/myjenkins

2.让容器中以root用户启动

docker run --name jenkins --restart=always -u 0 \
        -p 8080:8080 \
        -v /var/www/myjenkins:/var/jenkins_home \
        -d jenkinsci/blueocean

3.注意开启SELinux情况
1)关闭宿主机的selinux
2)在宿主机上添加 selinux 规则

chcon -Rt svirt_sandbox_file_t /path/to/volume #man docker-run 查看
轻轻的我走了,正如我轻轻的来