jenkins+github自動部署

1.jenkins安裝

下載jenkins

官方網頁下載: https://jenkins.io/zh/doc/pipeline/tour/getting-started/
直接下載鏈接: http://mirrors.jenkins.io/war-stable/latest/jenkins.war

2.運行jenkins

java -jar jenkins.war --httpPort=9999

打開網頁: http://ip:port/可以看到:

image.png

過一會后命令行顯示(框起來的是密碼):
image.png

等待網頁加載jenkins:
image.png

輸入密碼即可進入jenkins

3.Jenkins安裝插件提速

  1. 進入jenkins配置目錄: cd ~/.jenkins
  2. 進入插件配置目錄: cd updates
  3. 更換插件下載地址: sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
  4. 重新啟動jenkins,需要記錄管理員密碼

4.安裝插件

image.png

5.創建管理員

image.png

6.配置根URL

按照他默認的即可


image.png

7.集成github的WebHook

注意: 部署jenkins服務器必須要是有公網IP的服務器

  1. 打開jenkins管理界面


    image.png
  2. 進入jenkins配置界面


    image.png
  3. 點擊高級


    image.png
  4. 配置jenkins回調地址


    image.png
  5. 點擊應用


    image.png
  6. github上創建一個項目倉庫
    創建一個倉庫,私有或公共倉庫均可


    image.png
  1. 進入配置倉庫WebHook界面


    image.png
  1. 配置倉庫的WebHook
    當有人對這個倉庫發出push時候,github會調用配置的WebHook地址,這個地址就配置第4步jenkins的回調地址

點擊添加WebHook


image.png

點擊保存

8.使用BlueOcean進行項目構建

此處使用jenkins最新的Blue Ocean構建項目

  1. 進入插件安裝界面


    image.png

    image.png
  2. 安裝blue ocean插件

    image.png

  3. 返回首頁


    image.png
  4. 進入Blue Ocean界面


    image.png
  5. 創建流水線


    image.png
  6. 選擇github


    image.png
  7. 為jenkins創建訪問github的 access token


    image.png
  8. 在github上創建即可


    image.png

    點擊最后的創建


    image.png
  9. 在jenkins填寫生成的token
    輸入token,點擊connect

    image.png

  10. 選擇用戶


    image.png
  11. 選擇項目


    image.png

    最后因為倉庫沒有Jenkinsfile文件,會顯示如下界面


    image.png

此時,會因為github倉庫中沒有Jenkinsfile文件,無法進行自動化構建,下面準備編寫Jenkinsfile文件

9. 準備一個自動化構建項目

  1. 準備一個Java項目,我們將它進行自動化構建
    項目很簡單,使用maven創建一個項目,編寫Main.java文件
// Main.java
/**
 * @author: jiangxch
 * @date: 2019/12/31 12:57
 */
public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 11; i++) {
            System.out.println("hello world");
        }

    }
}
  1. 將項目打包成一個可執行的jar包
    因為我們的演示期望可以使用java -jar xxx.jar來執行main函數,所以需要打包成一個可執行的jar文件
    pom.xml添加
     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>
                                        <!-- 替換為你自己的類 -->
                                        com.sanjin.jenkins.demo.Main
                                    </mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>

                                <!-- 最終生成的可執行文件名${project.artifactId}-${project.version}-jar-with-dependencies -->
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

使用mvn clean package進行打包,可以看到target中生成的jar文件

image.png

使用java -jar target/jenkins-demo-1.0-SNAPSHOT-jar-with-dependencies.jar執行,注意不是jenkins-demo-1.0-SNAPSHOT.jar,輸出如下:

image.png

  1. 編寫Jenkinsfile文件進行自動化部署
    回想一下上面java項目部署的步驟:1編譯 2部署
    我們需要通過jenkins實現這一過程

10. 編寫Jenkinsfile自動構建腳本

  1. 我們先將項目與遠程庫連接
    git remote add origin https://github.com/jiangxiaochuan/jenkins-demo.git

  2. 為jenkins配置docker
    由于我們要實現編譯、部署的過程,所以使用docker是最方便的,一些公司也都是用這種方式進行構建的。

  • 首先需要在運行jenkins的服務器上安裝docker,此處自行查閱資料
  • 其次jenkins需要安裝docker插件
  1. 在項目目錄下創建Jenkinsfile文件
    我用的Linux系統,就用touch命令創建了
    touch Jenkinsfile
    注意文件名稱: 一定要是 Jenkinsfile
    內容如下:
pipeline {

  // 設置全局變量
  environment {
    // jar 文件的stash名稱,maven編譯好的jar包需要轉移到jdk容器中
    STASH_JAR = "targetfiles"
    // 宿主機maven的.m2目錄,會將宿主機的maven庫掛載到maven容器中,不需要下載過多的jar包
    MAVEN_M2_PATH = "/home/lanlan/.m2"
    // jar鏡像名稱,定義jar文件名 ->
    IMAGE_JAR_NAME = "${JOB_NAME}:latest"
  }

  agent none
  stages{

    // 進行maven構建
    stage('Build jar file'){
        agent {
          // 制定docker鏡像,jenkins會自動拉取image,運行一個容器
          // 所以需要部署jenkins的服務器事先安裝好docker
          docker {
            image 'maven:3-alpine'
            args "-v ${MAVEN_M2_PATH}:/root/.m2"
          }
        }
        steps {
            // 在鏡像中執行的shell命令
            sh 'mvn -DskipTests clean package'
            // 將打包的好的jar文件臨時存儲起來,我們需要把這個jar文件移動到jdk容器中運行起來
            stash includes: 'target/*.jar', name: "${STASH_JAR}"
        }
    }

    // 構建部署鏡像
    stage('Build docker image') {
        agent any

        steps {
            script {
                // 刪除之前的鏡像,${IMAGE_JAR_NAME}相同不會生成重復的image
                // sh "docker rmi ${IMAGE_JAR_NAME}"

                // 將打包的jar從臨時存放的位置拿出來,這就轉移到了宿主機中
                unstash "${STASH_JAR}"
                // ${JOB_NAME} -> github-jenkins-demo/master
                // 構建鏡像
                def targetImage = docker.build("${IMAGE_JAR_NAME}", ' .')
            }
        }
    }

    // 運行容器
    stage('Deploy docker continer') {
        agent any

        steps {
            script {
                // 運行鏡像容器,--rm表示容器kill后不保存,直接刪除
                sh "docker run --rm ${IMAGE_JAR_NAME}"
            }
        }
    }
  }
}

然后commit

  1. 編寫dockerfile
    因為我們需要構建部署的docker容器,所以需要實現編寫一個dockerfile文件
    在項目根目錄創建dockerfile文件
#install OS
#FROM centos
FROM openjdk:8
#install java
#RUN yum install -y java



#put jar into container
#ADD target/AdWordsProducer-1.0-SNAPSHOT-shaded.jar adwordsproducer.jar
ADD target/*-jar-with-dependencies.jar target.jar
#run jar

ENTRYPOINT ["java", "-jar", "/target.jar"]

  1. push本地項目到github
    push項目后,github因為配置了WebHook,所有會發送一個請求到jenkins,jenkins會根據我們編寫的JenkinsFile進行自動化部署。


    image.png

    可以看到jenkins完全已經完成了自動化構建過程

  2. 手動觸發構建
    有時候網絡等原因可能會導致push代碼后無法出發WebHook的自動構建,此時就需要手動拉去代碼并進行自動話構建


    image.png

    點擊該按鈕后會手動進行構建

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容