真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python+JenkinsApi自動(dòng)化部署.NetCore項(xiàng)目

  • 部署環(huán)境與流程
    1) Jenkins是java產(chǎn)品,需安裝JDK8。由于.netFreamwork項(xiàng)目自動(dòng)化發(fā)布時(shí)是基于Windows,所以繼續(xù)使用Windows,在Windows server 2012環(huán)境下已有的Jenkins環(huán)境,部署、構(gòu)建dotnet Core項(xiàng)目繼續(xù)在Windows平臺(tái)下操作。
    2) .NET Core SDK:2.2.402。dotnet build構(gòu)建。
    3) 代碼倉(cāng)庫(kù)GitLab。
    4) .NET Core服務(wù)端CentOS7
    部署環(huán)境流程:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
  • 部署需求
    一個(gè)項(xiàng)目下分兩個(gè)子項(xiàng)目,而子項(xiàng)目需分別進(jìn)行構(gòu)建部署,構(gòu)建后子項(xiàng)目分別打包同步到不同的server上。所以,計(jì)劃Jenkins上創(chuàng)建三個(gè)Job:A、B、C。A、B分別表示子項(xiàng)目,C進(jìn)行統(tǒng)一管理A、B。即C作為A、B的構(gòu)建入口。C-Job中上按參數(shù)選擇構(gòu)建應(yīng)用,會(huì)觸發(fā)對(duì)應(yīng)的Job-B或Job-C構(gòu)建,實(shí)現(xiàn)思路是python調(diào)用JenkinsAPI去實(shí)現(xiàn),后面會(huì)具體講到。大致流程如下:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
  • Jenkins操作
    1) Jenkins具體安裝略。下載見官方網(wǎng)站:https://jenkins.io/download/ ,選擇安裝Windows版本。
    這里Jenkins安裝前,需配置好JDK環(huán)境,配置JDK8。
    2) 插件安裝
    Jenkins安裝好后,進(jìn)入系統(tǒng)管理->插件管理,安裝好Msbuild、GitLab、python等。
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    3) 新建Job-A
    列出Job中主要設(shè)置項(xiàng)。
    Gitlab代碼倉(cāng)庫(kù)和分支配置如下:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    構(gòu)建build:
    build前新建“Exceute Windows batch command”,如下圖:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    build命令:
    dotnet restore "%WORKSPACE%\PreventFraudAPI.Server"
    dotnet build "%WORKSPACE%\PreventFraudAPI.Server"
    dotnet publish "%WORKSPACE%\PreventFraudAPI.Server\PreventFraudAPI.sln" -o "E:\Publish-web\PreventFraudAPI-test\PreventFraudAPI.Server"

    dotnet restore :還原。主要是尋找當(dāng)前目錄下的項(xiàng)目文件(project.json),利用NuGet庫(kù)還原整個(gè)項(xiàng)目的依賴庫(kù),并且遍歷每個(gè)目錄,生成項(xiàng)目文件,繼續(xù)還原該項(xiàng)目文件中的依賴項(xiàng)。
    dotnet build :編譯應(yīng)用程序。該命令將項(xiàng)目及其依賴項(xiàng)生成為一組二進(jìn)制文件。二進(jìn)制文件包括擴(kuò)展名為 .dll 的中間語言 (IL) 文件中的項(xiàng)目代碼。
    dotnet publish:發(fā)布項(xiàng)目,使可跨平臺(tái)運(yùn)行程序。Windows環(huán)境build完之后,可發(fā)布到Linux環(huán)境下運(yùn)行。
    dotnet run:運(yùn)行應(yīng)用程序。
    Build構(gòu)建完后,再新建“Exceute Windows batch command”,從gitlab中拉取項(xiàng)目文件配置項(xiàng)。gitlbab中進(jìn)行集中存放。將集中配置項(xiàng)文件copy到項(xiàng)目構(gòu)建后的目錄中。
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    配置文件操作完后,需將Jenkins平臺(tái)下已構(gòu)建完后的項(xiàng)目文件打包、同步到.NET Core服務(wù)器端的CentOS7 Server上。Windows和Linux不同平臺(tái)文件操作,這里選擇Python實(shí)現(xiàn),主要作了服務(wù)器端dotnet應(yīng)用服務(wù)操作、應(yīng)用程序備份、代碼同步等。
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    這里使用python下的paramiko模塊實(shí)現(xiàn)。paramiko模塊屬于第三方庫(kù),實(shí)現(xiàn)了SSHv2協(xié)議,可以在Python代碼中直接使用SSH協(xié)議對(duì)遠(yuǎn)程服務(wù)器執(zhí)行操作,而無需通過ssh命令對(duì)遠(yuǎn)程服務(wù)器進(jìn)行操作,使用前需要使用如下命令先進(jìn)行安裝:

    創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、石龍網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為石龍等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

    pip install paramiko

    paramiko包含兩個(gè)核心組件:SSHClient和SFTPClient。
    SSHClient:類似于Linux的ssh命令,是對(duì)SSH會(huì)話的封裝,該類封裝了傳輸(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),常用于執(zhí)行遠(yuǎn)程命令。
    SFTPClient:類似與Linux的sftp命令,是對(duì)SFTP客戶端的封裝,用以實(shí)現(xiàn)遠(yuǎn)程文件操作,如文件上傳、下載、修改文件權(quán)限等操作。
    這里根據(jù)實(shí)際需求,使用了SSHClient這個(gè)組件。
    Python代碼細(xì)節(jié)如下:

    import sys
    import paramiko
    class SSHconnection(object):
    def __init__(self, host, port, username, password):
        self._host = host
        self._port = port
        self._username = username
        self._password = password
        self._transport = None
        self._client = None
        self._connect()
    #建立connect連接
    def _connect(self):
        transport = paramiko.Transport((self._host, self._port))
        transport.connect(username=self._username, password=self._password)
        self._transport = transport
    def exec_command(self, command, step):
        if self._client is None:
            self._client = paramiko.SSHClient()
            self._client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self._client._transport = self._transport
        stdin, stdout, stderr = self._client.exec_command(command)
        data = stdout.read()
        print('%s 執(zhí)行結(jié)果: ' % step)
        print(data.decode('utf-8'))
        # #輸出結(jié)果
        # if len(data) > 0:
            # print('執(zhí)行結(jié)果:')
            # print(data.decode('utf-8'))
        err = stderr.read()
        #輸出錯(cuò)誤結(jié)果
        if len(err) > 0:
            print('%s 執(zhí)行的錯(cuò)誤輸出:' % step)
            print(err.decode('utf-8'))
    #關(guān)閉close連接
    def close(self):
        if self._transport:
            self._transport.close()
        if self._client:
            self._client.close()
    if __name__=="__main__":
    host = "10.10.10.75"
    port = 65089
    username = "root"
    password = "password"
    cmd_stop = "systemctl stop supervisor"
    cmd_backup = "cp -r /usr/soft/package/HiCore.PreventFraudAPI.Web/ /usr/soft/backup/HiCore.PreventFraudAPI.Web-`date +%Y-%m-%d-%H:%M`"
    cmd_rsync = "rsync   -vzrtopg  --no-super --numeric-ids  --progress  --port=873 --password-file=/opt/scripts/passwd.sh   rsync_user@10.10.10.69::PreventFraudAPI-test   /usr/soft/package/HiCore.PreventFraudAPI.Web/"
    cmd_start = "systemctl start supervisor"
    conn = SSHconnection(host, port, username, password)
    print('開始停supervisor服務(wù)...')
    conn.exec_command(cmd_stop, 'supervisor_stop_service')
    print('開始備份本地PreventFraudAPI程序...')
    conn.exec_command(cmd_backup, 'backup_app')
    print('開始同步PreventFraudAPI程序...')
    conn.exec_command(cmd_rsync, 'rsync_app')
    print('開始啟supervisor服務(wù)...')
    conn.exec_command(cmd_start, 'supervisor_start_service')
    print('PreventFraudAPI程序發(fā)布完成,請(qǐng)驗(yàn)證!')

    同理,Job-B操作跟Job-A一樣。主要是Job-C有差異,Job配置中有帶參數(shù)。
    4) 新建Job-C
    列出Job中主要設(shè)置項(xiàng)。
    選擇“This project is parameterized”,添加參數(shù)選擇“Choice Parameter”,配置如下:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    根據(jù)選擇的參數(shù)觸發(fā)遠(yuǎn)程Job構(gòu)建。如選擇選項(xiàng)"Web"觸發(fā)遠(yuǎn)程Job-A構(gòu)建,選擇選項(xiàng)"File"觸發(fā)遠(yuǎn)程Job-B構(gòu)建。
    構(gòu)建build:
    build構(gòu)建步驟選擇新建“Exceute Windows batch command”,如下圖:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目

  • Python操作Jenkins API
    目前Python版本Jenkins支持的API主要有2個(gè)第三方的包。
    JenkinsApi 和 Python-Jenkins
    1) Python-Jenkins
    多數(shù)文章建議使用Python-Jenkins模塊,相對(duì)JenkinsApi,Python-Jenkins模塊封裝的更好,接口調(diào)用更方便,更容易。這里本來也是首選建議的Python-Jenkins模塊,但是,在實(shí)際操作時(shí)報(bào)錯(cuò):
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    此類報(bào)錯(cuò)網(wǎng)上看了幾篇文章,描述的多數(shù)是因?yàn)閖enkins-python在python3.6存在bug,url沒有轉(zhuǎn)碼。而這里是python3.7版本,也歸類到版本問題。在Python2中可以使用。這里貼出Python-Jenkins方式代碼,主要是要導(dǎo)入import jenkins模塊。代碼如下:
    import jenkins
    jenkins_server_url = 'http://jenkins.hicore.local/'
    user = 'yuhuanghui'
    api_token= '11f6714b10b086b9165ed507dd2f5e161a'
    #實(shí)例化jenkins對(duì)象,連接遠(yuǎn)程的jenkins server
    server = jenkins.Jenkins(jenkins_server_url,username=user,password=api_token)
    print(server)
    #構(gòu)建job
    server.build_job('PreventFraudAPI-test')
    #查看某個(gè)job的構(gòu)建信息
    job_info=server.get_job_info('PreventFraudAPI-test')
    print(job_info)

    這里就不更換python版本了,其他Job用到的python都是Python3,所以用另一種API方式JenkinsApi 。
    2) JenkinsApi
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    使用JenkinsApi方式需要導(dǎo)入from jenkinsapi.jenkins import Jenkins、from jenkinsapi.build import Build模塊。
    上面Job-C中的python腳本:

    import os,sys
    from jenkinsapi.jenkins import Jenkins
    from jenkinsapi.build import Build
    def get_server_instance():
    jenkins_url = 'http://10.10.10.69:8080/'
    server = Jenkins(jenkins_url, username='xiaoming', password='password')
    return server
    server = get_server_instance()
    #版本
    print('Jenkins版本:',server.version)
    #所有的job列表
    #print('Jobs:', server.keys())
    print('查看Jobs列表:',server.get_jobs_list())
    #判斷job是否存在,存在返回true,不存在返回false。
    Web_Job = server.has_job('PreventFraud-test')
    File_Job = server.has_job('PreventFraudFile-test')
    env = os.getenv("ENV")
    print('選擇發(fā)布構(gòu)建的應(yīng)用是:', env)
    if env == 'Web':
    print('開始Build構(gòu)建PreventFraud-Web項(xiàng)目!')
    if Web_Job == True:
        #獲取job名稱
        job = server.get_job('PreventFraud-test')
        print('要Build構(gòu)建的job是:', job)
        #構(gòu)建,無參數(shù)的構(gòu)建
        #params = {'Branch': 'oriin/master', 'host': '192.168.1.1'}
        res = server.build_job('PreventFraud-test')
        print('開始觸發(fā)遠(yuǎn)程Job的構(gòu)建,請(qǐng)查看遠(yuǎn)程Job:%s' % job)
        print(res)
        #print(job.__dict__['_data']['builds'])
        url = job.__dict__['_data']['lastBuild']['url']
        number = job.__dict__['_data']['lastBuild']['number']
        obj = Build(url, number, job)
        print('此次構(gòu)建的Job名稱:%s,Job的URL是:%s, 是第 %d 次構(gòu)建。' % (job, url, number))
        print('構(gòu)建的結(jié)果:', obj.get_status())
    else:
        print('要構(gòu)建的Job不存在,請(qǐng)檢查!')
    elif env == 'File':
    print('開始Build構(gòu)建PreventFraud-File項(xiàng)目!')
    if File_Job == True:
        #獲取job名稱
        job = server.get_job('PreventFraudFile-test')
        print('要遠(yuǎn)程觸發(fā)Build構(gòu)建的job是:', job)
        #構(gòu)建,無參數(shù)的構(gòu)建
        #params = {'Branch': 'oriin/master', 'host': '192.168.1.1'}
        res = server.build_job('PreventFraudFile-test')
        print('開始觸發(fā)遠(yuǎn)程Job的構(gòu)建,請(qǐng)查看遠(yuǎn)程Job:%s' % job)
        print(res)
        #print(job.__dict__['_data']['builds'])
        url = job.__dict__['_data']['lastBuild']['url']
        number = job.__dict__['_data']['lastBuild']['number']
        obj = Build(url, number, job)
        print('此次構(gòu)建的Job名稱:%s,Job的URL是:%s, 是第 %d 次構(gòu)建。' % (job, url, number))
        print('構(gòu)建的結(jié)果:', obj.get_status())
    else:
        print('要構(gòu)建的Job不存在,請(qǐng)檢查!')
    else:
    print('請(qǐng)選擇正確ENV環(huán)境項(xiàng)目!')
  • 構(gòu)建
    Job-C中選擇帶參數(shù)構(gòu)建,點(diǎn)擊“Build with Parameters"進(jìn)入后在”ENV“中選擇”Web“構(gòu)建,此時(shí)會(huì)遠(yuǎn)程觸發(fā)Job-A構(gòu)建。如下圖所示:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    Job-C控制臺(tái)輸出情況:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目
    幾秒鐘后,查看Job-A控制臺(tái)輸出情況:
    Python+JenkinsApi自動(dòng)化部署.Net Core項(xiàng)目

新聞標(biāo)題:Python+JenkinsApi自動(dòng)化部署.NetCore項(xiàng)目
當(dāng)前地址:http://weahome.cn/article/pdghgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部