vlambda博客
学习文章列表

都2022年了,你还不会部署Jenkins?10分钟带你搞定

什么是Jenkins








官网 jenkins.io

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

为什么要使用Jenkins



我们可以通过jenkins工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

Jenkins非常易于安装和配置,简单易用。

简单来说方便如下人员:

开发人员:写好代码,不需要自己进行源码编译、打包等工作,直接将代码分支存放在SVN、GIT仓库即可

运维人员:减轻人工干预的错误率,ansible 一键完成了,同时解放运维人员繁杂的上传代码、手动备份、更新

测试人员:可以通过jenkins进行简单的代码及网站测试

持续集成的意义



  1. 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,利于减少重复过程以节省时间、费用和工作量。

  2. 持续集成保障了每个时间点上团队成员提交的代码是能成功集成的,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能。

  3. 持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。

持续集成和非持续集成



| 非持续集成

| 持续集成

都2022年了,你还不会部署Jenkins?10分钟带你搞定

安装Jenkins



| 搭建环境

都2022年了,你还不会部署Jenkins?10分钟带你搞定


# 关闭防火墙和selinux

[root@oldboy-jenkins ~]# systemctl stop firewalld.service 

[root@oldboy-jenkins ~]# systemctl disable firewalld.service 

[root@oldboy-jenkins ~]# setenforce 0

[root@oldboy-jenkins ~]# vim /etc/selinux/config

[root@oldboy-jenkins ~]# egrep  -v "^$|#" /etc/selinux/config 

SELINUX=disabled

SELINUXTYPE=targeted 


# yum 安装JDK

[root@oldboy-jenkins ~]# yum install java-1.8.0-openjdk.x86_64


# 进入链接下载rpm安装包

# https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

# 本地上传rpm包安装

[root@oldboy-jenkins ~]# rpm -ivh jdk-8u322-linux-x64.rpm


# 编译安装JDK

[root@oldboy-jenkins ~]# wget https://javadl.oracle.com/webapps/download/GetFile/1.8.0_301-b09/d3c52aa6bfa54d3ca74e617f18309292/linux-i586/jdk-8u301-linux-x64.tar.gz

[root@oldboy-jenkins ~]# ls -l

total 149480

-rw-r--r--  1 root root  145520298 Jun  9  2021 jdk-8u301-linux-x64.tar.gz

[root@oldboy-jenkins ~]# tar zxf jdk-8u301-linux-x64.tar.gz -C /oldboyedu/softwares/

[root@oldboy-jenkins ~]# 

[root@oldboy-jenkins ~]# cd /oldboyedu/softwares/

[root@oldboy-jenkins softwares]# ls -l

total 4

drwxr-xr-x 8 10143 10143 4096 Jun  9  2021 jdk1.8.0_301

[root@oldboy-jenkins softwares]# ln -s jdk1.8.0_301/ jdk

[root@oldboy-jenkins softwares]# ll

total 4

lrwxrwxrwx 1 root  root    13 Apr 11 15:53 jdk -> jdk1.8.0_301/

drwxr-xr-x 8 10143 10143 4096 Jun  9  2021 jdk1.8.0_301

[root@oldboy-jenkins softwares]# cat >/etc/profile.d/jdk.sh<<'EOF'

#!/bin/bash


export JAVA_HOME=/oldboyedu/softwares/jdk

export PATH=\$PATH:\$JAVA_HOME/bin

EOF

[root@oldboy-jenkins softwares]# source /etc/profile.d/jdk.sh


# 检查JDK是否安装成功

[root@oldboy-jenkins softwares]# java -version

java version "1.8.0_301"

Java(TM) SE Runtime Environment (build 1.8.0_301-b09)

Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)

[root@oldboy-es01 softwares]# 

| 安装 Jenkins

都2022年了,你还不会部署Jenkins?10分钟带你搞定


[root@oldboy-jenkins ~]# wget http://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.304-1.1.noarch.rpm  #获取django安装包

[root@oldboy-jenkins ~]# rpm -ivh jenkins-2.304-1.1.noarch.rpm 

| 配置 Jenkins

都2022年了,你还不会部署Jenkins?10分钟带你搞定


[root@oldboy-jenkins ~]# vim /etc/sysconfig/jenkins 

[root@oldboy-jenkins ~]# egrep -v "^$|#" /etc/sysconfig/jenkins

JENKINS_HOME="/var/lib/jenkins"

JENKINS_JAVA_CMD=""    # 编译安装JDK请输入java的安装路径

JENKINS_USER="root"

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"

JENKINS_PORT="8080"

JENKINS_LISTEN_ADDRESS=""

JENKINS_HTTPS_PORT=""

JENKINS_HTTPS_KEYSTORE=""

JENKINS_HTTPS_KEYSTORE_PASSWORD=""

JENKINS_HTTPS_LISTEN_ADDRESS=""

JENKINS_HTTP2_PORT=""

JENKINS_HTTP2_LISTEN_ADDRESS=""

JENKINS_DEBUG_LEVEL="5"

JENKINS_ENABLE_ACCESS_LOG="no"

JENKINS_HANDLER_MAX="100"

JENKINS_HANDLER_IDLE="20"

JENKINS_EXTRA_LIB_FOLDER=""

JENKINS_ARGS=""

| 启动 Jenkins

都2022年了,你还不会部署Jenkins?10分钟带你搞定


[root@oldboy-jenkins ~]# systemctl start jenkins    # 启动

[root@oldboy-jenkins ~]# systemctl enable jenkins   # 开机自启

| 访问 Jenkins 页面

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


| Manage Jenkins报错

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

| 本地直接上传插件

跳过安装插件,直接上传插件到目录

都2022年了,你还不会部署Jenkins?10分钟带你搞定


# 上传插件至服务器

# 解压插件至 /var/lib/jenkins/

[root@oldboy-jenkins ~]# tar xf jenkins_plugins.tar.gz -C /var/lib/jenkins/

[root@oldboy-jenkins ~]# cd /var/lib/jenkins/plugins/

[root@oldboy-jenkins plugins]# ls

ace-editor                              javax-activation-api              pipeline-stage-view

ace-editor.jpi                          javax-activation-api.jpi          pipeline-stage-view.bak

ant                                     javax-mail-api                    pipeline-stage-view.jpi

antisamy-markup-formatter               javax-mail-api.jpi                plain-credentials

# 下面还有一堆

jenkins主要目录

都2022年了,你还不会部署Jenkins?10分钟带你搞定

浏览器访问

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

完成

都2022年了,你还不会部署Jenkins?10分钟带你搞定

Jenkins自由风格项目创建


| 新建项目

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

| 项目配置

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

完成后保存

都2022年了,你还不会部署Jenkins?10分钟带你搞定

立即构建,然后查看控制台输出

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

| 服务器之间配置免密登录

都2022年了,你还不会部署Jenkins?10分钟带你搞定


[root@oldboy-jenkins .ssh]# ssh-keygen # 连续回车

[root@oldboy-jenkins .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.56.130 # 传到你要免密登录的服务器上

| 脚本编写

把从git仓库里获取的代码上传到web服务器站点目录下

都2022年了,你还不会部署Jenkins?10分钟带你搞定


#!/bin/sh

DATE=$(date +%Y-%m-%d-%H-%M-%S)

CODE_DIR="/var/lib/jenkins/workspace/test"

WEB_DIR="/usr/share/nginx/"

get_code_tar(){

        cd $CODE_DIR && tar zcf /opt/web-$DATE.tar.gz ./*

}


scp_code_web(){

        scp /opt/web-$DATE.tar.gz 192.168.56.130:$WEB_DIR

}


code_tarxf(){

        ssh 192.168.56.130 "cd $WEB_DIR &&mkdir web-$DATE && tar xf web-$DATE.tar.gz -C web-$DATE"


}

ln_html(){

         ssh 192.168.56.130 "cd $WEB_DIR && rm -rf html && ln -s web-$DATE html"

}


main(){


        get_code_tar;

        scp_code_web;

        code_tarxf;

        ln_html;

}

main


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

| 配置自动触发构建

需要设置安全令牌Secret token

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

GitLab配置安全令牌

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

| 测试

克隆代码到master上更改代码后进行推送测试是否自动触发

都2022年了,你还不会部署Jenkins?10分钟带你搞定


[root@oldboy-git test]# git clone http://192.168.56.144/root/test.git

Cloning into 'test'...

Username for 'http://192.168.56.144': root

Password for 'http://[email protected]': 

remote: Counting objects: 8, done.

remote: Compressing objects: 100% (4/4), done.

remote: Total 8 (delta 0), reused 0 (delta 0)

Unpacking objects: 100% (8/8), done.

[root@oldboy-git ~]# ls

index.html  test

[root@oldboy-git ~]# ls test/

index.html


# 更改代码并推送

[root@oldboy-git ~]# cd test/

[root@oldboy-git test]# vim index.html

[root@oldboy-git test]# cat index.html

jenkins

[root@oldboy-git test]# git add index.html

[root@oldboy-git test]# git commit -m "nginx-v0.4"

[master 145c0a9] nginx-v0.4

 1 file changed, 1 insertion(+), 1 deletion(-)

[root@oldboy-git test]# git push -u origin 

warning: push.default is unset; its implicit value is changing in

Git 2.0 from 'matching' to 'simple'. To squelch this message

and maintain the current behavior after the default changes, use:


  git config --global push.default matching


To squelch this message and adopt the new behavior now, use:


  git config --global push.default simple


See 'git help config' and search for 'push.default' for further information.

(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode

'current' instead of 'simple' if you sometimes use older versions of Git)


Username for 'http://192.168.56.144': root

Password for 'http://[email protected]': 

Counting objects: 5, done.

Writing objects: 100% (3/3), 243 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To http://192.168.56.144/root/test.git

   e2cbc69..145c0a9  master -> master

Branch master set up to track remote branch master from origin.

[root@oldboy-git test]# 


| GitLab报错

Hook executed successfully but returned HTTP 403

这说明你没开启【去掉跨站点请求伪造】

都2022年了,你还不会部署Jenkins?10分钟带你搞定


# 在Jenkins服务器上操作

[root@oldboy-jenkins ~]# vim /etc/sysconfig/jenkins 

[root@oldboy-jenkins ~]# egrep -v "^$|#" /etc/sysconfig/jenkins

... # 滤过

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"

...# 滤过

# 如果是204一下版本的jenkins请在web 页面中勾选

Jenkins实现参数化构建



| 参数化构建介绍

参数化构建,通过tag传递参数达到发布和代码回滚的操作

| 安装插件

注: 接下来安装插件、在可选插件中搜索Git Parameter 直接安装即可,已安装则忽略本次步骤进入到项目把前面的参数化去掉重新选择使用git parameter

| 正式配置

都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定


都2022年了,你还不会部署Jenkins?10分钟带你搞定

| 脚本传参

都2022年了,你还不会部署Jenkins?10分钟带你搞定


[root@oldboy-jenkins plugins]# vim /server/scripts/deploy_rollback.sh 

[root@oldboy-jenkins plugins]# cat /server/scripts/deploy_rollback.sh

#!/bin/sh

DATE=$(date +%Y-%m-%d-%H-%M-%S)

CODE_DIR="/var/lib/jenkins/workspace/test"

WEB_DIR="/usr/share/nginx/"


get_code_tar(){

        cd $CODE_DIR && tar zcf /opt/web-$DATE-${git_version}.tar.gz ./*

}


scp_code_web(){

        scp /opt/web-$DATE-${git_version}.tar.gz 192.168.56.130:$WEB_DIR

}


code_tarxf(){

        ssh 192.168.56.130 "cd $WEB_DIR &&mkdir web-$DATE-${git_version} && tar xf web-$DATE-${git_version}.tar.gz -C web-$DATE-${git_version}"


}

ln_html(){

        rcode=$(ssh 192.168.56.130 "find $WEB_DIR -type d  -name "web-*-$git_version"")

         ssh 192.168.56.130 "cd $WEB_DIR && rm -rf html && ln -s $rcode html"

}


main(){


        get_code_tar;

        scp_code_web;

        code_tarxf;

        ln_html;

}

if [ "$deploy_env" == "deploy" ];then

        main

elif [ "$deploy_env" == "rollback" ];then

        ln_html

fi

| 完成