1. 拉镜像
和其他的部署的镜像的方式一样,通常是直接使用docker search jenkins
然后直接docker pull jenkins
此时,在安装插件的时候发现插件都安装失败,提示jenkins版本太低
正确的安装方式是pull的时候直接带上版本号,使用docker pull jenkins/jenkins:lts
2. 部署jenkins
- 默认使用的端口号是8080和50000
- 默认数据目录为:
/var/jenkins_home
,需要映射出来持久化 - 如果需要把jenkins单独映射一级目录,则启动时添加:
JENKINS_OPTS: '--prefix=/jenkins'
- 修改时区问题,则启动时添加:
JAVA_OPTS=-Duser.timezone=Asia/Shanghai
因此使用docker部署的话,可以执行以下脚本:
docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /jenkins_data/:/var/jenkins_home -e JENKINS_OPTS="--prefix=/jenkins" JAVA_OPTS=-Duser.timezone=Asia/Shanghai
使用docker-compose时,xml为:
jenkins:
image: docker.io/jenkins/jenkins:lts
ports:
- 8080:8080
- 50000:50000
restart: always
volumes:
- /jenkins_data/:/var/jenkins_home/
- /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime
environment:
JENKINS_OPTS: '--prefix=/jenkins'
JAVA_OPTS: '-Duser.timezone=Asia/Shanghai'
3. 配置nginx转发
配置转发时,最好是把jenkins目录单独映射出来,转发时需要带上实际的请求头信息,不然会报脚本错误:
Mixed Content: The page at ‘https://XXX’ was loaded over HTTPS, but requested an insecure
nginx配置为:
location /jenkins/ {
proxy_pass http://jenkins:8080/jenkins/;
proxy_set_header Host $host;
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;
}
配置完成后基本上就可以访问了
4. 插件选择
如果是第一次用,在部署时选择默认即可,后续在按需选择
常用的插件有以下几种:
- Git plugin
- Gitee Plugin #码云插件
- GitHub plugin
- Maven Integration plugin
- Publish Over SSH
- Pipeline
- NodeJS Plugin
- Parameterized Trigger plugin #传参触发另一个构造工程插件
- FindBugs
- Checkstyle
- NodeJS Plugin
...
5. 构建时注意事项
-
默认安装后无法找到maven或者版本不对
从jenkins - 系统管理 - 全局工具配置 - maven - 新增maven安装新的maven,在构建时使用新配置的maven即可 -
gitee插件配置
Gitee 帮助中心 / 第三方服务集成 / 帮助详情 / Jenkins 插件 -
如何把构建的结果拷贝到目标机器
如果是拷贝到同一个宿主机的环境,则可以把宿主机的目录也映射到jenkins中
如果是网络可联通的环境,则使用Publish Over SSH
插件,通过插件或者shell的scp
拷贝过去 -
使用cnpm代替npm
安装好nodejs插件后,使用shell
脚本进行构建,在执行的脚本前面加上如下,就可以直接使用cnpm了:
alias cnpm="npm --registry=https://registry.npm.taobao.org
--cache=$HOME/.npm/.cache/cnpm
--disturl=https://npm.taobao.org/dist
--userconfig=$HOME/.cnpmrc"
cnpm install
cnpm run build
6. 可能会出现的权限问题
有部分同学会出现权限问题,错误日志片段如下:
java.io.IOException: Permission denied
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createTempFile(File.java:2024)
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:142)
Caused: java.io.IOException: Failed to create a temporary file in /var/jenkins_home
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:144)
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:109)
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:84)
at hudson.util.AtomicFileWriter.<init>(AtomicFileWriter.java:74)
at hudson.XmlFile.write(XmlFile.java:189)
at hudson.model.Descriptor.save(Descriptor.java:892)
at com.gitee.jenkins.connection.GiteeConnection.migrate(GiteeConnection.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104)
at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:175)
at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
at jenkins.model.Jenkins$5.runTask(Jenkins.java:1131)
at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
因为docker启动时,默认的用户是jenkins:jenkins
,因此赋予权限即可
- 修改
-v
映射出来的文件夹权限
chown -R 1000:1000 /jenkins_data/
- 修改
docker-compose.yml
配置,添加用户
services:
jenkins:
...
...
user: root
- 重启即可