工具系列 | Jenkins 构建伟大,无所不能

2020-07-23 17:31:10 浏览数 (1)

Jenkins 是什么?

Jenkins 是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

一、安装包安装

1、安装Java环境

要安装此版本,请先更新软件包索引

代码语言:javascript复制
sudo apt update

接下来,检查 Java 是否已经安装java -version。如果Java当前未安装,你将看到以下输出:

代码语言:javascript复制
Command 'java' not found, but can be installed with:

apt install default-jre
apt install openjdk-11-jre-headless
apt install openjdk-8-jre-headless
apt install openjdk-9-jre-headless

执行以下命令来安装OpenJDK:

代码语言:javascript复制
sudo apt install default-jre

该命令将安装Java运行时环境(JRE)。这将允许你运行几乎所有的Java软件。验证安装:java -version,你将看到以下输出:

代码语言:javascript复制
openjdk version "10.0.1" 2018-04-17
OpenJDK Runtime Environment (build 10.0.1 10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1 10-Ubuntu-3ubuntu1, mixed mode)

除了JRE之外,你可能还需要Java开发工具包(JDK)才能编译和运行一些特定的基于Java的软件。要安装JDK,请执行以下命令,该命令也将安装JRE:

代码语言:javascript复制
sudo apt install default-jdk

通过检查javac Java编译器的版本来验证是否安装了JDK :javac -version

代码语言:javascript复制
javac 10.0.1

接下来,我们来看看指定我们要安装的OpenJDK版本。安装OpenJDK的特定版本: OpenJDK 8。Java 8是目前的长期支持版本,虽然公共维护在2019年1月结束,但仍然得到广泛支持。要安装OpenJDK 8,请执行以下命令:

代码语言:javascript复制
sudo apt install openjdk-8-jdk

验证安装:java -version

代码语言:javascript复制
java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.16.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)

也可以只安装JRE,你可以通过执行sudo apt install openjdk-8-jre来安装它。

2、安装Jenkins

在基于Debian的发行版(如Ubuntu)上,您可通过apt安装Jenkins

代码语言:javascript复制
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

安装这个软件包将会:

  • 将Jenkins设置为启动时启动的守护进程。查看/etc/init.d/jenkins获取更多细节
  • 创建一个'jenkins'用户来运行此服务
  • 直接将控制台日志输出到文件/var/log/jenkins/jenkins.log。如果您正在解决Jenkins问题,请检查此文件
  • /etc/default/jenkins为启动填充配置参数,例如JENKINS_HOME
  • 将Jenkins设置为在端口8080上进行监听。使用浏览器访问此端口以开始配置
  • 如果你的/etc/init.d/jenkins文件无法启动Jenkins,编辑/etc/default/jenkins, 修改 ----HTTP_PORT=8080----为----HTTP_PORT=8081---- 在这里,“8081”也可被换为其他可用端口。

很庆幸18.04 默认安装后直接是使用systemctl管理

代码语言:javascript复制
sudo systemctl status jenkins.service  // 查看
sudo systemctl restart jenkins.service
3、配置Java环境
  • OpenJDK 8位于 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
  • 复制首选安装的路径。然后打开/etc/environment使用vim编辑器 sudo vim /etc/environment 在该文件的末尾,添加以下行,确保使用自己的复制路径替换突出显示的路径 JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/bin/java"
  • 修改此文件将为JAVA_HOME系统上的所有用户设置路径,保存文件并退出编辑器。
  • 现在重新加载此文件以将更改应用于当前会话:source /etc/environment
  • 验证是否设置了环境变量echo $JAVA_HOME,你会看到你刚刚设置的路径: /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/bin/java
  • 其他用户需要执行该命令source /etc/environment或注销并重新登录才能应用此设置。
4、配置Jenkins环境
  • 配置文件:/etc/default/jenkins
    • JENKINS_HOME=/home/www/jenkins 这里直接是使用的Docker安装的目录(Jenkins迁移目录)
    • HTTP_PORT=8081
  • 默认安装目录:/var/lib/jenkins/ 替换为/home/www/jenkins
  • docker 的Jenkins目录赋予权限:sudo chmod -R 777 jenkins/,使jenkins用户有访问的权限 这里直接使用的是以前Docker 安装的Jenkins_home目录 ,如果是新安装则直接跳过。
  • 【可以代替以上】将jenkins添加到www用户组里面:sudo gpasswd -a jenkins www
5、Nginx 代理主机配置(Docker Nginx)
代码语言:javascript复制
server {
    listen 443 ssl http2;
    server_name jenkins.tinywan.com;

    ssl_certificate /etc/letsencrypt/jenkins.tinywan.com/full_chain.pem;
    ssl_certificate_key /etc/letsencrypt/jenkins.tinywan.com/private.key;

    location / {
        proxy_set_header        Host $host:$server_port;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;

        proxy_redirect http:// https://;
        proxy_pass          http://172.17.0.1:8081;
        proxy_read_timeout  90;

        proxy_http_version 1.1;
        proxy_request_buffering off;
        proxy_buffering off;
        add_header 'X-SSH-Endpoint' 'p2p.herbeauty.top:50000' always;
    }
}

二、Docker 安装

普通构建
代码语言:javascript复制
docker run -d -p 8084:8080 --name tinywan-jenkins --user root -v host_mntdJenkins2:/var/jenkins_home jenkins
稳定版本
代码语言:javascript复制
docker run -d --name lnmp-jenkins --user root -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.165

jenkins/jenkins:lts 版本为最新的(由于不支持中文),不推荐使用。而是推荐使用每周发布的稳定版本,如:jenkins/jenkins:2.165

使用 blueocean 构建(推荐)
代码语言:javascript复制
docker run -d --name lnmp-jenkins --network dnmp_backend --network-alias jenkins --user root -p 8081:8080 -v $HOME/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v "$HOME":/home jenkinsci/blueocean
  • 使用该版本构建的好处就是可以使用Nginx Docker 容器,通过容器与容器网络连接进行 jenkins 的代理
  • --network dnmp_backend 必须和nginx docker在同一个个网络内

进入容器

代码语言:javascript复制
$ docker exec -it tinywan-jenkins bash
root@7eaff7d087c3:/# ls
遇到的错误

1、时区时间问题

直接使用宿主机的时间和时区

代码语言:javascript复制
docker cp /etc/localtime lnmp-jenkins:/etc/
docker cp /etc/timezone lnmp-jenkins:/etc/
  • /etc/timezone 的内容是时区,比如 Asia/ShangHai
  • /etc/localtime 的内容是时间
  • Alpine Linux 时区设置 。https://wiki.alpinelinux.org/wiki/Setting_the_timezone cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo Asia/Shanghai >/etc/timezone

2、权限问题

Window 环境下如果容器运行的时候挂在目录的会有插件安装不成功,就是由于权限的问题: 例如:

  • 1. Workspace Cleanup 清理失败
  • 2. admin密码更改忘记情况

3、docker权限报错解决

代码语言:javascript复制
docker inspect -f . python:3.5.1
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http:///var/run/docker.sock/v1.39/containers/python:3.5.1/json: dial unix /var/run/docker.sock: connect: permission denied

将jenkins用户加入docker组,重启Jenkins服务

代码语言:javascript复制
sudo gpasswd -a jenkins docker
sudo systemctl restart jenkins.service

三、自动部署脚本

测试环境

代码语言:javascript复制
# 进入目录
cd /home/www/dnmp/www/jl-pay-develop
# 将本地更改的代码存放git栈中 
git stash
#拉取代码
git reset --hard origin/test
git pull origin test
#从栈中将你的代码
git stash pop

正式环境

代码语言:javascript复制
cd /home/www/lnmp/www/juhepay
git reset --hard origin/master
git pull origin master

自动登录问题:ssh-copy-id -i ~/.ssh/id_rsa.pub www@47.112.97.230

代码语言:javascript复制
# ssh-copy-id -i ~/.ssh/id_rsa.pub www@47.112.97.230
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ERROR: @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
ERROR: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ERROR: IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
ERROR: Someone could be eavesdropping on you right now (man-in-the-middle attack)!
ERROR: It is also possible that a host key has just been changed.
ERROR: The fingerprint for the ECDSA key sent by the remote host is
ERROR: SHA256:OOk4eZh636rBw/uw5Amt7IjAeMs8yFvMaDYAoxxOGws.
ERROR: Please contact your system administrator.
ERROR: Add correct host key in /root/.ssh/known_hosts to get rid of this message.
ERROR: Offending ECDSA key in /root/.ssh/known_hosts:6
ERROR:   remove with:
ERROR:   ssh-keygen -f "/root/.ssh/known_hosts" -R 47.112.97.230
ERROR: ECDSA host key for 47.112.97.230 has changed and you have requested strict checking.
ERROR: Host key verification failed.

解决办法

代码语言:javascript复制
# ssh-keygen -f "/root/.ssh/known_hosts" -R 47.112.97.230

admin密码更改忘记情况

1.删除Jenkins目录下config.xml文件中下面代码,并保存文件

代码语言:javascript复制
  <useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
    <denyAnonymousReadAccess>true</denyAnonymousReadAccess>
  </authorizationStrategy>
  <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
    <disableSignup>true</disableSignup>
    <enableCaptcha>false</enableCaptcha>
  </securityRealm>

2.重启Jenkins服务;

3.进入首页>“系统管理”>“Configure Global Security”;

4.勾选“启用安全”;

5.点选“Jenkins专有用户数据库”,并点击“保存”;

6.重新点击首页>“系统管理”,发现此时出现“管理用户”;

7.点击进入展示“用户列表”;

8.点击右侧进入修改密码页面,修改后即可重新登录。

参考

  • 在Ubuntu 18.04上使用apt安装Java
  • https://jenkins.io/zh/doc/book/installing/
  • PHP优雅上线——Jenkins可持续集成部署
  • PHP Jenkins 持续集成
  • SpringBoot Docker Git Jenkins实现简易的持续集成和持续部署
  • 使用Docker Jenkins自动构建部署
  • 修改使用Alpine Linux的Docker容器的时区

0 人点赞