menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

Linux下Jenkins搭建与使用实践指南

作者:Chancel Yang, 创建:2019-08-14, 字数:3762, 已阅:631, 最后更新:2019-08-14

这篇文章更新于 1715 天前,文中部分信息可能失效,请自行甄别无效内容。

CI工具有不少选择,像 JenkinsCodeshipTravis CICircle TeamCity 都是比较有名的CI工具

无论是个人还是团队使用CI工具都能有效提高代码迭代速度,实现更快更自动化的发布

1. Jenkins

Jenkins是一个开源的自动化构建工具,用于持续集成和持续交付(CI/CD)的软件开发过程,通过不同的插件来支持不同的开发工具与技术

通常Jenkins可以搭配Git Flow来实现自动化构建、自动化测试和自动化部署流程

学习Jenkins的工作原理能有效提升软件发布的效率

1.1. 安装

访问Jenkins - Build great things at any scale 官网,我们可以快速找到下列安装教程

官方最低硬件配置要求

  • 最低256MB内存,推荐512M内存以上
  • 10GB的硬盘驱动

软件依赖

  • Java 8 (either a JRE or Java Development Kit (JDK) is fine)

此次安装基于Cent7OS

1.1.1. 环境准备

首先安装依赖 java与jdk

Bash
sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

创建用于运行Jenkins的用户

Bash
sudo useradd jenkins

创建存放Jenkins文件夹

Bash
mkdir /home/jenkins/jenkins
chown jenkins:jenkins /home/jenkins/jenkins
cd /home/jenkins/jenkins

下载Jenkins

Bash
sudo -u jenkins wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

配置JENKINS_HOME的位置,如跳过,则Jenkins会默认$HOME/.jenkins作为默认目录

TEXT
sudo mkdir /var/lib/jenkins
sudo vim /etc/profile
JENKINS_HOME=/var/lib/jenkins
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL JENKINS_HOME

刷新环境设置

Bash
source /etc/profile

1.1.2. 运行Jenkins

运行Jenkins

Bash
sudo -u jenkins /usr/bin/java -jar jenkins.war --httpPort=8082 --webroot=webroot/ --pluginroot=pluginroot/

查看默认密码

Bash
cat /user/.jenkins/secrets/initialAdminPassword

采用systemd方式存储到后台运行,编辑/etc/systemd/system/jenkins.service

INI
[Unit]description=Jenkins
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/java -jar /home/jenkins/jenkins/jenkins.war --httpPort=8082 --webroot=/home/jenkins/jenkins/webroot/ --pluginroot=/home/jenkins/jenkins/pluginroot/
User=jenkins
Type=simple
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

启动Jenkins并设置后台启动

Bash
sudo systemctl start jenkins
sudo systemctl enable jenkins

2. 使用

我主要是用来持续集成前端博客vue单页应用,此处举例VUE的集成,Jenkins支持很多持续集成方案,大同小异,如有需要可查阅官网文档

2.1. 插件安装

登录Jenkins管理系统首页,依次打开系统管理-管理插件并搜索安装如下插件

  • Publish Over SSH:用于推送生成包到远程服务器上的插件
  • nodejs:用于使用npm安装生成vue项目

回到管理系统首页,依次打开 系统管理-全局工具管理-点击新增NodeJS

根据需要选择NodeJS的版本

2.2. 配置创建Jenkins任务

在管理系统首页,选择系统管理-系统设置-Publish Over SSH-新增-SSH Server,分别填入如下资料

  • Passphrase:密码
  • Path to key:如果你的服务器需要密钥输入,则在此输入你的密钥位置,当然前提是你要先在Jenkins服务器上指定的路径准备好密钥
  • Key:可以将Key粘贴到这,不过我没有试过
  • Name:服务器名称
  • Hostname:服务器IP
  • Username:服务器用户名
  • Remote Diretory:默认远程服务器路径
  • 配置结束后可点击 Test Configuration测试是否连接成功

创建Jenkins任务

  1. 点击Jenkins(回到首页点击创建),并选择 自由风格项目,进入项目详细配置页面,选择General(默认已选中)
  2. 源码管理方式选择 GIT
    1. 输入仓库的 URL
    2. 验证方式根据需要自行选择(如Git仓库是证书验证才能拉取则需要在Jenkins的系统设置中添加凭据再返回这里选择证书验证)
    3. 选择仓库的分支 Branches
  3. 触发器选择 Poll SCM
    • 注:2分钟查询一次仓库写法 - \*/2 \* \* \* \*
  4. 构建环境选择 Provide Node & npm bin/ folder to PATH
  5. 构建步骤增加1个
    • 此处根据需要选择你的构建步骤,我的构建机器由于是在本地运行,为了避免网络问题引起构建失败,我这里特意使用cnpm进行构建
      Bash
      # 安装cnpm
      npm install -g cnpm --registry=https://registry.npm.taobao.org
      # 使用cnpm
      cnpm install
      # 打包vue
      npm run build
      # 以下三步用于创建上传到服务器的压缩包
      cd dist
      rm -rf test.tar.gz 
      tar -zcvf test.tar.gz *
      cd ../
      
  6. 构建后操作选择 Send build artifacts over SSH
    • 选择在配置远程服务器连接里面配置好的服务器,之后填写Transfers信息
      Bash
      Transfer Set
      Source files : dist/test.tar.gz
      Remove prefix : dist
      Remote Directory : (不填)
      Exec command :
                      cd /home/chancel/
                      rm -rf one_view/
                      mkdir one_view/
                      mv /tmp/test.tar.gz one_view/
                      cd one_view/
                      tar -zxvf test.tar.gz
                      rm -f test.tar.gz
      

这6步做完之后VUE的持续集成就完成了,享受每次Push之后自动更新的首页吧!


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]