jenkins 学习笔记

这里采用 docker 容器来安装和部署 jenkins,首先下载官方镜像:

1
docker pull jenkins/jenkins:lts

然后启动:

1
2
3
4
5
6
7
8
9
# 临时运行
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts

# 长期维护
docker volume create jenkins-data # 创建数据卷
docker run -d -p 8080:8080 -p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
--name jenkins \
jenkins/jenkins:lts

然后命令行会随机生成管理员密码,先记下来,如果忘了,也可以用下面的命令查看:

1
cat /var/jenkins_home/secrets/initialAdminPassword

访问 localhost:8080 然后按照提示一步步安装即可。等安装完毕,进入容器生成公钥和密钥:

1
2
docker exec -it jenkins sh
ssh-keygen -t rsa -C "jenkins"

一路回车之后,可以通过下面的命令查看公钥和密钥:

1
2
cat /var/jenkins_home/.ssh/id_rsa.pub # 查看公钥
cat /var/jenkins_home/.ssh/id_rsa # 查看私钥

然后将生成的 id_rsa.pub 添加到 github 或 gitlab 的 ssh 认证即可。

插件

在系统管理—>管理插件页面可以下载插件,安装后这些插件都被放在了 JENKINS_HOME/tools 目录下

  • Nodejs 插件

    安装 NodeJS 插件之后,在全局工具配置里面可以找到 NodeJS 这一项,可以安装指定版本的 Node 以及该 Node 环境下的全局包,然后在创建任务的时候,Build Environment 构建环境菜单里面会出现 Provide Node & npm bin/ folder to PATH,勾选之后,选择安装好的版本即可。

  • SSH 插件

    系统管理—>系统设置—>SSH remote hosts菜单可以添加多个需要 ssh 的服务器,然后在创建任务的时候,Build Environment 和 Build 菜单中都会出现关于 ssh 的选项,如果需要勾选即可。不过这种远程SSH到目标主机属于 NoLogin 方式,无法获取 PATH 等环境变量。

  • Gitlab 插件

    安装 gitlab webhook 和 gitlab 插件,只要 gitlab 中有 push 代码,就会触发 hook,访问 Jenkins 提供的 api,然后 Jenkins Branch Filter 系统判断自己需要处理的分支是否有改动,如果有开始构建,运行构建脚本,在构建触发器 Build Triggers 里面勾选 Build when a change is pushed to GitLab,然后点开高级菜单,可以看到 Allowed branches 选项,选择 Filter branches by name 或者 Filter branches by regex,然后过滤自己需要的分支,比如(develop.*master)。

  • Publish over ssh 插件

    有了这个插件,就可以把 git 仓库中构建好的文件和文件夹传输到远程服务器上了, 在系统管理—>系统设置—>Publish over SSH 中配置:

    • Passphrase: 密码(目标机器的密码)
    • Path to key:key 文件(私钥)的路径
    • SSH Server Name: 标识的名字(随便你取什么)
    • Hostname: 需要连接ssh的主机名或ip地址,此处填写应用服务器IP(建议ip)
    • Username: 用户名
    • Remote Directory: 远程目录(要发布的目录,比如/usr/local/tomcat/webapps/)

其他问题

  • 如何修改时区?

    1
    2
    System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
    System.setProperty('user.timezone', 'Asia/Shanghai')
  • 什么是凭据和凭据域?

    凭据可以是密码、密钥、口令等等,授权访问某个服务的通行证。凭据域是用于分类整理这些凭据,比如所有访问服务器 A 的凭据都在一个域里这种情况。