Jenkins
是一个基于 Java
语言开发的持续构建工具平台,主要用于持续、自动的构建/测试你的软件和项目。它可以执行你预先设定好的设置和构建脚本,也可以和 Git 代码库做集成,实现自动触发和定时触发构建。
因为 Jenkins
是 Java
编写的持续构建平台,所以安装 Java
必不可少。
在这里,我们选择安装开源的 openjdk
即可。 openjdk
是 SunJDK
一种开源实现。关于openjdk
是 SunJDK
的具体区别可以看下面的文章了解下。在这我们直接使用 yum
包管理器安装 openjdk
即可。
# 安装 java
yum install -y fontconfig java-11-openjdk
# 检查 java 版本
[root@localhost ~]# java -version
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS, mixed mode, sharing)
https://pkg.jenkins.io/redhat-stable/
由于 Yum
源不自带 Jenkins
的安装源,于是我们需要自己导入一份 Jenkins
安装源进行安装。导入后,使用 Yum
命令安装即可。
# 使用 wget 下载 Jenkins 软件包的存储库配置文件,并将其保存到 /etc/yum.repos.d/jenkins.repo 文件中
# 证书过期,不检查证书:sudo wget --no-check-certificate -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# 使用 rpm 导入 Jenkins 软件包的 GPG 密钥,以确保安装的软件包是经过验证的,并且没有被篡改过
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# 安装 EPEL 的发行包,通过安装 EPEL 发行包,您可以访问一些常用的第三方软件包
yum install epel-release
# 使用 yum 安装 Jenkins 软件包
yum install -y jenkins
service jenkins start
# service jenkins restart restart 重启 Jenkins
# service jenkins restart stop 停止 Jenkins
在启动 Jenkins
后,此时 Jenkins
会开启它的默认端口 8080
。但由于防火墙限制,我们需要手动让防火墙放行 8080
端口才能对外访问到界面。
这里我们在 CentOS
下的 firewall-cmd
防火墙添加端口放行规则,添加完后重启防火墙。
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=50000/tcp --permanent
systemctl reload firewalld
http://192.168.10.130:8080/
查看密码
cat /var/lib/jenkins/secrets/initialAdminPassword
因为 Jenkins
插件服务器在国外,所以速度不太理想。我们需要更换为清华大学的 Jenkins
插件源后,再安装插件,所以先不要点安装插件。
更换方法很简单。进入服务器,将 /var/lib/jenkins/updates/default.json
内的插件源地址替换成清华大学的源地址,将 google 替换为 baidu 即可。
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json
这里点击“使用admin账户继续”,此时密码还是默认密码:cat /var/lib/jenkins/secrets/initialAdminPassword
后续步骤下一步即可
找到
构建
一项,选择增加构建步骤
,选择执行shell
,输入以下命令
docker -v
docker pull node:latest
Started by user admin
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/hello-jenkins
[hello-jenkins] $ /bin/sh -xe /tmp/jenkins6376592547251823106.sh
+ docker -v
Docker version 24.0.2, build cb74dfc
+ docker pull node:latest
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImage=node&tag=latest": dial unix /var/run/docker.sock: connect: permission denied
Build step 'Execute shell' marked build as failure
Finished: FAILURE
docker
的架构是 C/S
架构。在我们使用 docker
命令时,其实是命令使用 socket
与 docker
的守护进程进行通信,才能正常执行 docker
命令。
而在 Linux
中, Unix socket
属于 root
用户,因此需要 root
权限才能访问。官方是这么解释的:
Manage Docker as a non-root user The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can only access it using sudo. The docker daemon always runs as the root user. If you don’t want to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.
以非root用户管理Docker Docker守护进程绑定到一个Unix套接字而不是TCP端口。默认情况下,该Unix套接字的所有者是root用户,其他用户只能通过sudo来访问它。Docker守护进程始终以root用户身份运行。如果您不想在使用docker命令时使用sudo,可以创建一个名为docker的Unix用户组,并将用户添加到其中。当docker守护进程启动时,它会将Unix套接字的所有权设置为docker用户组的读写权限。
但是在 docker
中, docker
提供了一个 用户组
的概念。我们可以将执行 Shell
的用户添加到名称为 docker
的用户组,则可以正常执行 docker
命令。
而在 Jenkins
中执行的终端用户做 jenkins
,所以我们只需要将 jenkins
加入到 docker
用户组即可:
sudo groupadd docker #新增docker用户组
sudo gpasswd -a jenkins docker #将当前用户添加至docker用户组
newgrp docker #更新docker用户组
sudo service jenkins restart
Started by user admin
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/hello-jenkins
[hello-jenkins] $ /bin/sh -xe /tmp/jenkins1917769180207902795.sh
+ docker -v
Docker version 24.0.2, build cb74dfc
+ docker pull node:latest
latest: Pulling from library/node
0e29546d541c: Pulling fs layer
9b829c73b52b: Pulling fs layer
cb5b7ae36172: Pulling fs layer
......
6f9f74896dfa: Pull complete
f2930ff7fb60: Pull complete
c1d26179dd86: Pull complete
1fa56dd41537: Pull complete
321141c774e9: Pull complete
Digest: sha256:36aca218a5eb57cb23bc790a030591382c7664c15a384e2ddc2075761ac7e701
Status: Downloaded newer image for node:latest
docker.io/library/node:latest
Finished: SUCCESS