1. 程式人生 > >Jenkins之使用Pyinstaller構建Python應用程序

Jenkins之使用Pyinstaller構建Python應用程序

nload java8 系統 pil 100% examples sgd .gz fig

目錄

  • 1. 極簡概述
  • 2. Jenkins配置
    • 2.1 安裝JDK
    • 2.2 安裝Jenkins
  • 3. 安裝Docker
  • 4. 使用PyInstaller構建Python應用程序
    • 4.1 Fork 一個庫
    • 4.2 克隆項目
    • 4.3 在Jenkins創建管道項目
    • 4.4 為初始管道創建Jenkinsfile
    • 4.5 測試階段
    • 4.6 交付階段



1. 極簡概述

Jenkins是一個獨立的開源自動化服務器,可用於自動執行與構建,測試,交付或部署軟件相關的各種任務,。

Jenkins可以通過本機系統軟件包,Docker安裝,甚至可以由安裝了Java Runtime Environment(JRE)的任何機器獨立運行。






2. Jenkins配置

安裝Jenkins很簡單,首先安裝Java8,然後再安裝Jenkins,這裏使用Jenkins的2.173版本。包的話,直接去官網下載吧。


2.1 安裝JDK

(1) 解壓JDK

[[email protected] ~]# tar zxvf jdk-8u171-linux-x64.tar.gz
[[email protected] ~]# mv jdk1.8.0_171/ /usr/local/java


(2)添加環境變量

[[email protected] ~]# vim /etc/profile # 寫入如下內容 
export JAVA_HOME=/usr/local/java 
export PATH=$PATH:$MAVEN_HOME/bin:$JAVA_HOME/bin 
export JRE_HOME=$JAVA_HOME/jre 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib


(3) 立即生效

[[email protected] ~]# source /etc/profile
[[email protected] ~]# java -version 
java version "1.8.0_171" 
Java(TM) SE Runtime Environment (build 1.8.0_171-b11) 
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)



2.2 安裝Jenkins


(1) 直接用jre跑

[[email protected] ~]# java -jar jenkins.war --httpPort=8080


(2) 訪問Web

http://localhost:8080


(3) 跟著配置
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

註意:如果這一步出現:Problem accessing /setupWizard/createAdminUser. Reason:,那麽直接使用admin登陸。


(4) 安裝插件Open Blue Ocean
Blue Ocean為開發人員提供了更具樂趣的Jenkins使用方式,它是從基礎開始構建的,實現了一種全新的、現代風格的用戶界面,有助於任何規模的團隊實現持續交付。它以Jenkins插件的方式安裝,並集成於Jenkins的流水線中。

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

註意:版本2.165可能出現安裝失敗。解決方法未知。






3. 安裝Docker

(1)安裝依賴

[[email protected] ~]# yum install -y yum-utils   device-mapper-persistent-data   lvm2
[[email protected] ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[[email protected] ~]# yum install docker-ce docker-ce-cli containerd.io
[[email protected] ~]# sudo systemctl start docker

[[email protected] ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/






4. 使用PyInstaller構建Python應用程序

必須條件:

  • GitHub賬號


4.1 Fork 一個庫

該存儲庫中包含一個簡單的Python應用程序,它是一個命令行工具“add2vals”,它輸出兩個值的相加。如果至少有一個值是字符串,則“add2vals”將這兩個值視為字符串,而是將值連接起來。
鏈接為:https://github.com/jenkins-docs/simple-python-pyinstaller-app
技術分享圖片
技術分享圖片
技術分享圖片


4.2 克隆項目

技術分享圖片

# 自己創建GitHub這個目錄
[[email protected] GitHub]# pwd
/root/GitHub
[[email protected] GitHub]# git clone https://github.com/liuhedong135/simple-python-pyinstaller-app.git
Cloning into 'simple-python-pyinstaller-app'...
remote: Enumerating objects: 36, done.
remote: Total 36 (delta 0), reused 0 (delta 0), pack-reused 36
Unpacking objects: 100% (36/36), done.
[[email protected] GitHub]# tree simple-python-pyinstaller-app/
simple-python-pyinstaller-app/
├── jenkins
│?? └── Jenkinsfile
├── README.md
└── sources
    ├── add2vals.py
    ├── calc.py
    └── test_calc.py

2 directories, 5 files


4.3 在Jenkins創建管道項目

技術分享圖片
技術分享圖片
技術分享圖片

[[email protected] GitHub]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Fgo8vZIPd5ITBmPVx0nB5m8Ihc0wxZUTOjeTJZv7qrA [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|    [email protected]+++o.  |
|   o +  [email protected]*   |
|    + + .=o B.   |
|     = =...o +   |
|    + B S. o.    |
|     = =  . o.   |
|      . .  .  .  |
|         o   .   |
|        E ...    |
+----[SHA256]-----+
[[email protected] GitHub]# cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA4RrL+SbBJgMWmZJTvnZoMQ9L1pfQ1qPDDG+rcM/nCIng8ai+
WI6adg894jIP20pYvDLojTHx/zKMcOAOhUuileclui5coViYnFUwLpr+V6agWjqX
C7p09WtpVuz3i9+0+1n91BzK/0QiErdbALtm5UcSh2qcGq0aPQc7Bn/pzDmwC74F
ylrl5yykKqlUfDTUDtZZCtj48g7nkRUq0c/Kk5ETSPJDSBf4kMgOLwM4bAazCCWZ
allApAiGWP9Bc61WCz1Dyr29Jwgd9q3n6g7WxxcCmZOolxdJzwZKsyvKpweeiXOY
wc4mO7jrXprRbf3QIsLO0MvEZmHFvydYnOc6xQIDAQABAoIBAAcJsHDkvksy84Tv
p0CgMRe/k65s5rGfQxzjbOfFCEMjFG5ZyUG5i6i/Rz8IM6i2hVm0+cJYWmmRKgTp
bGrMd5PaOzq78ld1DqhsnWoHnIYfBoprpIdQWBHIPu3h0MeFwgHNyXrVP5+FgM82
/lhig5ANjc3ADoti+BwKWtUUMLoa0JxfMb7LDM1TxLVDp3iReMeQQFbM7OhAg27k
18RCLNDKYcenxFKhaU0N/fUNbpAwhowqj792H2AfLtsTX1wpncwJlYgzBVSKMsQc
bzbuRidLTnhN4JU24QggJDzM8eTLlVzAf3PwbkjPavKe7EmNAUYpmwjPUwMytgBq
8Lq42CECgYEA8cm9F951o6SpvAwodXCDbWX8EDo1pzF89aISEMus4rQLa97cnGv+
bqF5Rp8Rh7L0OEDXFFAXiDYlUtUpKqFopG+dxPxEyRq1XcGTFjHWguBCwUUM6YkU
ZZdyWSF53nuSObzZhnxIVk7RqlX8eqKWkNcqXvrr5PEdbonO9xfU6M0CgYEA7lYE
qbTSsYiH5l2tYfQ2Ku8wgSfv8YbrsMoe4Wn4StRAvcYYpy9XpF0XrhG1BJqzbxKh
nXZ6VpJMxwkeH+ADuwWGD8NIqSO+6OYeRt3j+7+qbhtixyoQmqChREk1JYyZ+y8S
PLI78gDuR+aGvK+BYaHxfmbCSNdg7T55GLj5edkCgYA8KXlungDhhhBh5RiQGD3r
k6vDkehVwL+aEwixuyw6gJgy8BIurcRyXKVjiCMBg+q2sJOTz1X7o5Vn5fhHTkBO
YiN8p1SqQYYNXSQvKpl4mTqjAn5zAZPcr3FZcjXzwQWibjYl+3i4WQZcfubC0P/r
7E3zsjXOEpzDK3EfFIP6pQKBgDVRLufcGMo4ddZ2HGRuYnPGYH50Nbw9Z5p8DN52
e2IaC4WovDkiYSPW44ZAVdN63Cs76sW0DHgzcFOSWZfd4FfFS5FZKXcVFQ8684j8
+JSH8xOAst9FLMO6rXj+O5Jz2rqTdCv532krBiM1kezCAlqaBNE3Ib1z2S4ZrLN4
Je85AoGAU5L+ZEjGB/9ayk47j5UOaquFfvRd+0v0sgdRnU0QxPSYy/vuRvTiaADS
Cp4//7+z+fixHgbtZQYSYdGK4c6YSj6bcVhlvOfSG1oe/O/J42PzDVljl6DCxMT9
mJc31CK32iFpQmXXPV8lyWcPuVr6qHmg1gvd4eNqp0N9L3Z9x6Y=
-----END RSA PRIVATE KEY-----

技術分享圖片
技術分享圖片


4.4 為初始管道創建Jenkinsfile

[[email protected] simple-python-pyinstaller-app]# pwd
/root/GitHub/simple-python-pyinstaller-app
[[email protected] simple-python-pyinstaller-app]# vim Jenkinsfile
# 寫入如下內容
pipeline {
    agent none 
    stages {
        stage('Build') { 
            agent {
                docker {
                    image 'python:2-alpine' 
                }
            }
            steps {
                sh 'python -m py_compile sources/add2vals.py sources/calc.py' 
            }
        }
    }
}
[[email protected] simple-python-pyinstaller-app]# git config --global user.email "[email protected]/com"
[[email protected] simple-python-pyinstaller-app]# git config --global user.name "liuhedong"
[[email protected] simple-python-pyinstaller-app]# git add .
[[email protected] simple-python-pyinstaller-app]# git commit -m "Add initial Jenkinsfile"
[master 6966a7d] Add initial Jenkinsfile
 1 file changed, 15 insertions(+)
 create mode 100644 Jenkinsfile


4.5 測試階段

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

[[email protected] simple-python-pyinstaller-app]# pwd
/root/GitHub/simple-python-pyinstaller-app
[[email protected] simple-python-pyinstaller-app]# vim Jenkinsfile
# 添加如下內容
        stage('Test') {
            agent {
                docker {
                    image 'qnib/pytest'
                }
            }
            steps {
                sh 'py.test --verbose --junit-xml test-reports/results.xml sources/test_calc.py'
            }
            post {
                always {
                    junit 'test-reports/results.xml'
                }
            }
        }

[[email protected] simple-python-pyinstaller-app]# cat Jenkinsfile 
pipeline {
    agent none 
    stages {
        stage('Build') { 
            agent {
                docker {
                    image 'python:2-alpine' 
                }
            }
            steps {
                sh 'python -m py_compile sources/add2vals.py sources/calc.py' 
            }
        }
        stage('Test') {
            agent {
                docker {
                    image 'qnib/pytest'
                }
            }
            steps {
                sh 'py.test --verbose --junit-xml test-reports/results.xml sources/test_calc.py'
            }
            post {
                always {
                    junit 'test-reports/results.xml'
                }
            }
        }
    }
}
[[email protected] simple-python-pyinstaller-app]# git stage .
[[email protected] simple-python-pyinstaller-app]# git commit -m "Add Test stage"
[master 342b643] Add Test stage
 1 file changed, 16 insertions(+)

重新進入Blue Ocean
技術分享圖片
技術分享圖片


4.6 交付階段

[[email protected] simple-python-pyinstaller-app]# pwd
/root/GitHub/simple-python-pyinstaller-app
[[email protected] simple-python-pyinstaller-app]# vim Jenkinsfile
# 寫入如下內容
stage('Deliver') {
            agent {
                docker {
                    image 'cdrx/pyinstaller-linux:python2'
                }
            }
            steps {
                sh 'pyinstaller --onefile sources/add2vals.py'
            }
            post {
                success {
                    archiveArtifacts 'dist/add2vals'
                }
            }
        }
# 最終為如下內容
[[email protected] simple-python-pyinstaller-app]# cat Jenkinsfile 
pipeline {
    agent none 
    stages {
        stage('Build') { 
            agent {
                docker {
                    image 'python:2-alpine' 
                }
            }
            steps {
                sh 'python -m py_compile sources/add2vals.py sources/calc.py' 
            }
        }
        stage('Test') {
            agent {
                docker {
                    image 'qnib/pytest'
                }
            }
            steps {
                sh 'py.test --verbose --junit-xml test-reports/results.xml sources/test_calc.py'
            }
            post {
                always {
                    junit 'test-reports/results.xml'
                }
            }
        }
        stage('Deliver') {
            agent {
                docker {
                    image 'cdrx/pyinstaller-linux:python2'
                }
            }
            steps {
                sh 'pyinstaller --onefile sources/add2vals.py'
            }
            post {
                success {
                    archiveArtifacts 'dist/add2vals'
                }
            }
        }
    }
}
[[email protected] simple-python-pyinstaller-app]# git stage .
[[email protected] simple-python-pyinstaller-app]# git commit -m "Add Deliver stage"
[master 19c0c48] Add Deliver stage
 1 file changed, 15 insertions(+)

重新進入Blue Ocean
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
最後點擊下載,並傳入到linux,

[[email protected] ~]# ls -lh
total 3.4M
-rw-r--r-- 1 root root 3.4M Apr 21 10:54 add2vals
drwxr-xr-x 3 root root   43 Apr 22 09:32 GitHub
[[email protected] ~]# chmod +x add2vals 
[[email protected] ~]# ./add2vals 

You entered 0 value/s.

Usage: 'add2vals X Y' where X and Y are individual values.
       If add2vals is not in your path, usage is './add2vals X Y'.
       If unbundled, usage is 'python add2vals.py X Y'.

[[email protected] ~]# ./add2vals 1 1

The result is 2

最後我們就成功的將應用打包,並在linux上運行,這個應用是一個簡單的計算。

Jenkins之使用Pyinstaller構建Python應用程序