本文由 简悦SimpRead 转码,原文地址 prashant-vats.medium.com
Jenkins是最流行的CI/CD工具之一,它可以使你的DevOps流程以及日常......。
Jenkins是最流行的CI/CD工具之一,它可以使你的DevOps流程和日常任务自动化。为你的基础设施设置Jenkins一直是很关键的事情。它需要处理很多事情,如管理插件、数据、从属设备及其配置。随着容器化技术的发展,每个DevOps的人都试图把Jenkins放在docker上。
通过docker容器来实现Jenkins将简化安装设置。同时,凭借docker的优势,它让我们可以灵活地启动不同配置的docker slave。在这篇博客中,我们将如何进行?首先将为主站准备docker镜像并进行部署。第二,配置Jenkins的slave。第三,定制Jenkins的从属Docker文件。
设置Jenkins主站
先决条件。
- 服务器中安装有docker守护程序。
- 在服务器上可编译的docker-compose。
- 为docker daemon暴露API服务器。
让我们为Jenkins Master创建一个Docker文件。我们将在Jenkins容器中安装docker,这样我们就可以从Jenkins容器中使用docker,因为我们不能在Docker容器上安装docker daemon,所以我们将在Jenkins容器中安装docker socket。我们将使用 jenkins/jenkins:lts. 的基础镜像,这是一个Jenkins官方镜像。
FROM jenkins/jenkins:lts
USER root
RUN apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
RUN usermod -a -G docker jenkins
USER jenkins
我们将在以下编译文件的帮助下创建一个Jenkins主控的docker容器。
version: '2'
services:
jenkins:
build: ./jenkins-master/
networks:
- jenkins
ports:
- '8080:8080'
- '9080:9080'
volumes:
- 'jenkins_data:/var/jenkins_home'
- /var/run/docker.sock:/var/run/docker.sock
networks:
jenkins:
volumes:
jenkins_data:
driver: local
/var/jenkins_home是Jenkins主容器的主目录,我们把这个路径挂载为docker volume(jenkins_data),因为我们需要它是持久的,它有所有Jenkins的配置数据。容器路径/var/run/docker.sock被挂载到主机路径/var/run/docker.sock以共享docker守护进程,你可以找到关于为什么你不应该在docker中运行docker和需要共享docker套接字的解释这里。这里使用Build上下文从Dockerfile创建一个docker镜像。Jenkins服务器将在8080端口提供服务,9080将用于JNLP代理。确保你在运行docker-compose时有以下目录结构。
.
+-- docker-compose.yaml
+-- jenkins-master
+-- Dockerfile
我们可以使用docker-compose起来,通过运行以下命令,从上面的compose文件中创建一个容器。
docker-compose -f docker-compose.yaml up -d
现在你可以通过你的服务器IP的8080端口访问Jenkins。继续进行Jenkins的必要安装。
配置Jenkins的从机
先决条件。
- 在你的Jenkins中安装Yet Another Docker Plugin。进入管理Jenkins >> 管理插件 >> 搜索Yet Another Docker Plugin >> 重启后安装 >> 在没有工作运行时重启Jenkins。
- 为JNLP代理启用TCP端口。Jenkins是Java网络启动协议,Jenkins slave将在此协议上与Jenkins Master通信。进入Manage Jenkins >> Configure Global Security >> Agent >> Select for Fixed and put 9080.
Jenkins中的JNLP代理配置
进入管理Jenkins部分,在最后你会看到一个云的选项,在下拉菜单中,你会发现另一个Docker。添加一个这样的配置。
我们可以为这个配置提供一个标识符,并提供docker daemon服务器的API端点。有一个选项可以测试我们的连接。我们也可以在保存之前进行测试。配置完docker API端点后,我们需要定义docker模板,它有一个选项,如docker图像、标签等。标签是用来将工作与相应的从属设备进行映射。我们将进一步了解这一步骤。
Docker API配置
我们使用jenkinsci/slave docker镜像作为JNLP从属代理,并在docker模板中做了以下配置。我们在这里使用了vats作为标签,你可以根据你的使用情况使用任何标签。
Docker模板配置
你也可以为作为从属代理启动的容器做一些高级设置。它可以在创建容器设置下找到。其中一个用例可以像下面显示的那样挂载卷。
容器设置
这就是关于Jenkins配置的全部内容,现在我们可以用这个标签启动一个作业了。你可以通过在作业中配置标签来限制你的作业在这个从属代理上运行。你也可以在Jenkinsfile中使用label的语法来整合同样的内容。
按照标签配置Jenkins作业
你可以在Manage Jenkins的Manage Nodes部分跟踪节点,并在Cloud Statistics上保持跟踪。
云统计
自定义Jenkins的从属Docker文件
从上面的配置中,你可以得出,我们使用了jenkinci/slave docker镜像作为JNLP代理。你也可以定制我们的从属镜像,以获得我们的使用案例所需的依赖性。你可以参考下面我使用的Docker文件。这个Docker文件将创建一个安装了Docker和ansible最新版本的slave。
FROM jenkinsci/slave:latest
USER root
RUN apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
RUN usermod -a -G docker jenkins
RUN apt-get update && apt-get install -y python-pip
RUN pip install ansible
RUN mkdir -p /home/jenkins/.ansible && \
mkdir -p /home/jenkins/.ssh && \
chown -R 1000:1000 /home/jenkins/.ansible && \
chown -R 1000:1000 /home/jenkins/.ssh
USER jenkins
这样我们就可以用docker实现Jenkins的主从功能,并且可以用任何容器化的协调工具,如Kubernetes、Docker Swarm、AWS ECS等实现。
欢迎大家提出问题和意见。如果这对你有帮助,请拍手和分享。
谢谢!
普拉山特-瓦茨
一个DevOps的家伙