使用docker安装jenkins并且用jenkins构建打包服务
使用docker安装jenkins并且用jenkins构建打包服务,用到harbor,kuboard
·
利用docker安装jenkins
1.基于公共jenkins镜像构建自定义镜像
创建jenkins资源相关目录
mkdir jenkins
cd jenkins
将之前下载好的maven、openjdk、nodejs的安装包放入此文件夹中,以及maven的setting.xml文件
创建Dockerfile文件
vim Dockerfile
内容如下
FROM jenkins/jenkins
EXPOSE 8080
# 将maven和jdk添加到容器中
# tar.gz添加进去后会自动解压,无需手动解压
ADD apache-maven-3.6.1-bin.tar.gz /usr/local
ADD openjdk-8u44-linux-x64.tar.gz /usr/local
ADD node-v14.0.0-linux-x64.tar.gz /usr/local
# 覆盖容器里的settings.xml
ADD settings.xml /usr/local/apache-maven-3.6.1/conf/
# 配置环境变量
ENV TZ=Asia/Shanghai
ENV M2_HOME=/usr/local/apache-maven-3.6.1
ENV NODE_HOME=/usr/local/node-v14.0.0-linux-x64
# 配置maven、node的环境变量
# jdk环境变量不可在这里配,会影响jenkins的运行
ENV PATH=$M2_HOME/bin:$NODE_HOME/bin:$PATH
执行构建自定义镜像命令
docker build -t jenkins-self .
2.创建Jenkins数据目录
在宿主机上创建一个目录用于持久化Jenkins的数据,并设置合适的权限:
mkdir -p /home/jenkins/data
chown -R 1000:1000 /home/jenkins/data
3.启动Jenkins容器
使用以下命令启动Jenkins容器,映射端口和数据卷:
docker run -d --name jenkins-self -p 8080:8080 -p 50000:50000 \
-v /home/jenkins/data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
--restart=on-failure:3 \
jenkins-self
命令解读
1. docker run
功能:用于创建并启动一个新的Docker容器。
2. -d
功能:表示以守护进程模式运行容器,即在后台运行。
作用:容器不会在终端中阻塞,允许您继续在终端中执行其他命令。
3. --name jenkins-self
功能:为容器指定一个名称。
作用:方便您通过名称引用容器,而不是使用容器的ID。例如,您可以使用docker stop jenkins-self来停止该容器。
4. -p 8080:8080
功能:将容器的8080端口映射到宿主机的8080端口。
作用:允许您通过宿主机的IP地址和端口8080访问Jenkins的Web界面。例如,http://<宿主机IP>:8080。
5. -p 50000:50000
功能:将容器的50000端口映射到宿主机的50000端口。
作用:Jenkins使用50000端口进行与代理节点(如Jenkins Agent)的通信。如果您计划使用Jenkins的分布式构建功能,这个端口是必需的。
6. -v /home/jenkins/data:/var/jenkins_home
功能:将宿主机的/home/jenkins/data目录挂载到容器的/var/jenkins_home目录。
作用:/var/jenkins_home是Jenkins存储其配置文件、插件、作业定义和构建历史的地方。通过挂载卷,您可以将这些数据持久化到宿主机,即使容器被删除,数据也不会丢失。
7. -v /var/run/docker.sock:/var/run/docker.sock
功能:将宿主机的Docker套接字文件/var/run/docker.sock挂载到容器的相同路径。
作用:允许Jenkins容器直接与宿主机上的Docker守护进程通信,从而可以在Jenkins中直接管理宿主机上的Docker容器,例如构建Docker镜像、运行Docker容器等。
8. -v $(which docker):/usr/bin/docker
功能:将宿主机上的docker可执行文件路径挂载到容器的/usr/bin/docker路径。
作用:确保Jenkins容器内部可以使用宿主机上的docker命令。这对于在Jenkins Pipeline中直接调用Docker命令非常有用。
9. --restart=on-failure:3
功能:设置容器的重启策略。
作用:如果容器因错误退出(非正常退出),Docker将尝试重启容器,最多尝试3次。这有助于提高容器的可靠性,确保Jenkins服务在遇到问题时能够自动恢复。
10. jenkins-self
功能:指定要使用的Docker镜像。
4. 查看初始密码
Jenkins首次启动时,需要使用初始密码进行登录。可以通过以下命令查看初始密码:
docker logs -f jenkins
在日志中找到类似以下的输出,即为初始密码:
复制
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
<initialAdminPassword>
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
5. 访问Jenkins Web界面
在浏览器中访问 http://<宿主机IP>:8080,输入初始密码,按照提示完成Jenkins的初始化配置。

6. 安装推荐插件
在Jenkins的初始化过程中,可以选择安装推荐的插件。
后续到系统设置-插件管理里面去下载
Subversion
Maven Integration
Publish Over SSH 进行远程文件传输,命令执行
Subversion Plug-in 集成svn进行代码检出
7. 配置Jenkins
安装Docker插件:在Jenkins的管理界面中,选择“系统管理”->“插件管理”,搜索并安装Docker插件。
配置Docker环境:在“系统管理”->“配置系统”中,配置Docker主机地址(通常是unix:///var/run/docker.sock)。
配置全局工具:在“系统管理”->“全局工具配置”中,配置JDK、Maven、Git等工具的路径。
8.jenkins使用宿主机的docker
除了上面运行镜像时,映射docker相关文件 还要设置宿主机docker.sock权限
sudo chown root:root /var/run/docker.sock
sudo chmod o+rw /var/run/docker.sock
9.下载相关插件
点击 【系统管理】->【插件管理】->【available plugins 】
搜索第六步中的相关清单插件,进行安装,安装完成后,在http://<宿主机IP>:8080/restar 进行重启,或者直接重启jenkins-self容器,重启命令如下
docker restart jenkins-self
10. 配置maven、jdk信息
点击【系统管理】->【全局工具配置】
在此页面中配置maven、jdk相关信息



11.构建后端Java项目
点击【新建任务】,输入项目名称,选择自由风格的软件项目,填写相关信息

12.最后构建成功后可以写一个脚本进行镜像的打包,推送至kuboard进行发布
cd 到有Dockerfile文件的目录
docker build -f Dockerfile -t harbor服务器IP:port/public/self-server:1.0 .
# 登录harbor
docker login harbor服务器IP:port -u admin -p 密码
# 推送镜像到haobor
docker push harbor服务器IP:port/public/self-server:1.0
# 搭建一个nginx 用于jar包下载,下面的ip,port是nginx访问的地址
project="self-server.jar"
mkdir -p /var/jenkins_home/workspace/docker-images/jar
rm -rf /var/jenkins_home/workspace/docker-images/jar/$project
mv target/$project /var/jenkins_home/workspace/docker-images/jar/$project
echo "jar包下载地址:http://ip:port/docker-images/jar/$project"
# 下面的ip是kuboard的访问ip,KuboardAccessKey的值需要到kuboard的个人设置-访问密码里面去创建
curl -X PUT \
-H "Content-Type: application/yaml" \
-H "Cookie: KuboardUsername=admin; KuboardAccessKey=*******.*******" \
-d '{"kind":"deployments","namespace":"default","name":"self-server"}' \
"http://ip/kuboard-api/cluster/default/kind/CICDApi/admin/resource/restartWorkload"
13.构建vue前端项目
14.构建成功后也可以写一个脚本进行镜像打包,推送至kuboard部署
# 设置npm仓库源
npm config set registry http://ip:port/repository/npm/
npm install
npm run build-comp
# 清除有问题的镜像
docker images | grep 'none' | awk '{print $3}' | while read id; do docker rmi $id; done
# 删除本地对应镜像
docker rmi ip:port/public/self-frontend:1.0 || true
# 构建镜像,这里的ip:port/public/self-frontend:1.0 之所以这样命名,为了推送给harbor,所以ip:port是harbor的访问ip和端口
docker build -f build/docker/Dockerfile -t ip:port/public/self-frontend:1.0 .
# 登录harbor
docker login ip:port -u admin -p 密码
# 推送镜像至harbor
docker push ip:port/public/self-frontend:1.0
# 打包程序到nginx目录下方便进行下载,ip:port是nginx的访问地址
project="self-pc"
mkdir -p $project
cp -r dist $project
mkdir -p /var/jenkins_home/workspace/docker-images/frontend
rm -rf /var/jenkins_home/workspace/docker-images/frontend/$project.tar.gz
tar -zcvf $project.tar.gz $project
mv $project.tar.gz /var/jenkins_home/workspace/docker-images/frontend/$project.tar.gz
echo "压缩包下载地址:http://ip:port/docker-images/frontend/$project.tar.gz"
# 下面的ip是kuboard的访问ip,KuboardAccessKey的值需要到kuboard的个人设置-访问密码里面去创建
curl -X PUT \
-H "Content-Type: application/yaml" \
-H "Cookie: KuboardUsername=admin; KuboardAccessKey=*******.*******" \
-d '{"kind":"deployments","namespace":"default","name":"self-pc"}' \
"http://ip/kuboard-api/cluster/default/kind/CICDApi/admin/resource/restartWorkload"
15.构建后端,前端的Dockerfile文件内容
后端dockerfile文件内容如下:
# 基于openjdk-alpine
FROM openjdk:8-jdk-alpine
# 将本地文件夹挂在到当前容器,指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat默认使用/tmp作为工作目录。
# 这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
VOLUME /tmp
# 解决时差8小时问题
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 复制文件到容器,表示把文件拷入docker ,并改名成 app.jar
ADD /target/self-server-1.0-SNAPSHOT.jar app.jar
#JAVA_OPTS中可以加一些参数,如果配置了多环境,可以加"-Dspring.profiles.active=prod"
ENV JAVA_OPTS=""
#表示使用指定命令在镜像运行时执行,启动jar。表示使用指定命令在镜像运行时执行,启动jar。
#另一种写法
#ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
# 加入探针之前
#ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]
#ENTRYPOINT ["java","-javaagent:/agent/skywalking-agent.jar", "-Djava.securisplitty.egd=file:/dev/./urandom", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]
#ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]
ENTRYPOINT ["java","-Xms1024m", "-Xmx3072m","-Djava.security.egd=file:/dev/./urandom","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8601", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]
前端Dockerfile文件内容如下:
FROM nginx:stable-alpine-perl
RUN rm -f /etc/nginx/nginx.conf \
&& rm -f /etc/nginx/conf.d/default.conf
COPY build/docker/nginx.k8s.conf /etc/nginx/nginx.conf
# 解决时差8小时问题
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
EXPOSE 80
COPY ./dist /home/frontend
ENTRYPOINT ["nginx", "-g", "daemon off;"]
里面的nginx配置文件nginx.k8s.conf文件内容如下:
user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
client_max_body_size 100m;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream gateway_server{
server ip:port weight=1;
}
server {
listen 80;
server_name web;
location / {
alias /home/frontend;
index index.html;
autoindex on;
add_header Cache-Control no-cache;
add_header Pragma no-cache;
add_header Expires 0;
}
location /self-pc {
alias /home/frontend;
index index.html;
autoindex on;
add_header Cache-Control no-cache;
add_header Pragma no-cache;
add_header Expires 0;
}
#后台服务
location /gateway-k8s/ {
client_max_body_size 1000m;
proxy_pass http://gateway_server/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
# 工作流前台
location /workplatform/ {
proxy_pass http://self-workplatform:80/workplatform/;
proxy_set_header Host $host:31080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
absolute_redirect on;
}
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)