Docker+Jenkins+Pipeline實(shí)現(xiàn)持續(xù)集成(一)安裝

本地安裝

1. Docker環(huán)境準(zhǔn)備

2. Jenkins容器運(yùn)行

可使用Jenkins官方提供的鏡像,其穩(wěn)定版鏡像為:jenkins/jenkins:lts
通過如下命令啟動(dòng)Jenkins容器:
docker run -d -p 8080:8080 jenkins/jenkins:lts
Jenkins工作目錄為/var/jenkins_home,可將此目錄掛載到宿主機(jī)上,如下(通過JNLP使用slave服務(wù)時(shí)需要使用50000端口):
docker run -d -p 8080:8080 -p 50000:50000 -v your_dir:/var/jenkins_home jenkins/jenkins:lts
注:當(dāng)掛載jenkins的工作目錄jenkins_home時(shí),可能會(huì)出現(xiàn)容器無法啟動(dòng),查看日志出現(xiàn)如下錯(cuò)誤:

jenkins容器啟動(dòng)失敗

這是由于Jenkins容器的當(dāng)前用戶是"jenkins",但當(dāng)"/var/jenkins_home"映射本地?cái)?shù)據(jù)卷時(shí),該目錄的擁有者是root用戶,因此jenkins用戶訪問root權(quán)限目錄會(huì)出現(xiàn)"Permision denied"的問題。解決辦法是將目錄用戶者改為1000,再重新啟動(dòng)容器即可,如下:

sudo chown -R 1000 your_dir
docker restart container

3. 獲取Jenkins初始密碼

在容器啟動(dòng)后,通過查看啟動(dòng)日志獲取Jenkins的初始密碼:docker logs 容器ID/容器名
如下圖所示,日志中“Please use the following password to proceed to installation:”下的一行為初始化密碼:


初始化密碼

4. Jenkins初始化

本地訪問Jenkins服務(wù)地址為:http://localhost:8080
第一次打開Jenkins頁面時(shí),會(huì)進(jìn)入“Getting Started”頁面,需要輸入“Adminitrator password”即第3步獲取的密碼,輸入后點(diǎn)擊“Continue”繼續(xù),如下圖所示:

Jenkins初始化

(注:如果沒有復(fù)制密碼,可通過命令docker exec ?it jenkins /bin/bash進(jìn)入到Jenkins容器里,根據(jù)提示位置查找初始密碼)

然后頁面會(huì)提示安裝插件,可點(diǎn)擊選擇安裝其推薦的插件(這些插件都比較常用),即“Install Suggested Plugins”,等插件安裝完成后進(jìn)入管理員賬號(hào)頁面設(shè)置賬號(hào)(注:最好填寫上電子郵件地址,以防使用Blue Ocean創(chuàng)建Jenkinsfile時(shí)失敗),如下兩圖所示:

插件安裝

設(shè)置管理員賬號(hào)

當(dāng)管理員賬號(hào)設(shè)置完成,點(diǎn)擊“Save and Finish”,即可開始Jenkins的使用,如下圖所示:


開始使用

官方的Jenkins容器有一定的限制,下面我將介紹如何在Jenkins容器中使用docker命令,以及自定義dockerfile。

自定義dockerfile:

為了通過Jenkins實(shí)現(xiàn)Docker鏡像的build、push,我們需要一個(gè)使用Docker命令的環(huán)境。因此,我們?cè)贘enkins容器里掛載宿主機(jī)的docker.sock和Docker二進(jìn)制文件,Rancher上的docker-compose文件如下(my_jenkins為自定義的Docker鏡像,下面會(huì)給出Dockerfile模板):

    version: '2'
    services:
      jenkins:
        image: my_jenkins
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - /usr/bin/docker:/usr/bin/docker
        - jenkins_home:/var/jenkins_home
        ports:
        - 8080:8080/tcp
        user: root
        labels:
          io.rancher.container.pull_image: always

相應(yīng)的Docker運(yùn)行命令如下:
docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v jenkins_home:/var/jenkins_home -u root my_jenkins

注:由于Jenkins容器是Jenkins用戶,為了使Jenkins用戶能夠有權(quán)限運(yùn)行Docker命令,可以將Jenkins用戶加到主機(jī)的Docker組里(這樣會(huì)由于組gid的不同造成不可移植),或令Jenkins用戶可以免密使用sudo命令(在命令行中運(yùn)行echo jenkins ALL=NOPASSWD: ALL>> /etc/sudoers,這種方式會(huì)使得Jenkins在每次使用docker命令時(shí)必須輸sudo)。我們現(xiàn)在采取的解決方法是直接使用root權(quán)限運(yùn)行Jenkins容器。

通過如上的方式,我們能夠在Jenkins容器里使用Docker命令,但在使用過程中,可能會(huì)報(bào)如下圖的錯(cuò)誤:

圖片.png

libltdl.so.7位于/usr/lib/x86_64-linux-gnu/文件夾下,我們可以將該文件通過-v掛載到Jenkins容器,或者通過自定義dockerfile將libltdl.so.7直接復(fù)制到容器中。
另外,自定義的dockerfile還能夠?qū)崿F(xiàn)定制化的Jenkins配置,令Jenkins容器啟動(dòng)時(shí)就能滿足我們的需求。例如,可以將Jenkins系統(tǒng)的時(shí)區(qū)設(shè)置為PRC;可以將需要的插件通過plugins.txt在Jenkins鏡像構(gòu)建時(shí)安裝下載;可以下載Android SDK并配置好環(huán)境變量,使得Jenkins容器能夠進(jìn)行Android項(xiàng)目構(gòu)建。

如下是一個(gè)自定義的dockerfile樣例:

    FROM jenkins/jenkins:lts

    MAINTAINER ×××

    USER root

    ### 設(shè)置jenkins的時(shí)區(qū)
    RUN cp /usr/share/zoneinfo/PRC /etc/localtime
    ENV JAVA_OPTS=-Duser.timezone=Asia/Shanghai

    ### 自動(dòng)安裝jenkins插件
    COPY plugins.txt /usr/share/jenkins/plugins.txt
    RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt    ### 下載安裝Android SDK    ### package_file里聲明所有需要安裝的包    RUN wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip \
    && unzip -d /android-sdk sdk-tools-linux-3859397.zip \
    && rm sdk-tools-linux-3859397.zip
    COPY package_file /android-sdk/tools/bin/
    RUN echo y | ./android-sdk/tools/bin/sdkmanager --package_file=/android-sdk/tools/bin/package_file
    ENV ANDROID_HOME=/android-sdk

    ### 將其他需要的文件拷貝到容器之中
    ### 直接在容器中使用docker所需的libltdl.so.7
    ### docker遠(yuǎn)程倉庫登錄認(rèn)證的config.json
    COPY libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7
    COPY config.json /root/.docker/config.json
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 在應(yīng)用還處于單體架構(gòu)的時(shí)候,交付周期通常都以周、月為單位,在這種情況下項(xiàng)目的部署一般都是由開發(fā)人員手動(dòng)將程序...
    Briseis閱讀 22,290評(píng)論 5 70
  • 教程:https://www.yiibai.com/jenkins/ 本節(jié)內(nèi)容: Jenkins介紹 安裝部署Je...
    達(dá)微閱讀 9,094評(píng)論 2 77
  • 第一次發(fā)布博客。希望可以給需要的朋友們一些幫助。 1. 基礎(chǔ)環(huán)境 本文基于64位的CentOS 7.2系統(tǒng),內(nèi)核版...
    凌風(fēng)TM閱讀 2,961評(píng)論 5 6
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,728評(píng)論 0 120
  • 1、傳統(tǒng)我們的項(xiàng)目開發(fā)模式是產(chǎn)品調(diào)研提出需求,開發(fā)團(tuán)隊(duì)研究決定開發(fā)方案選型。然后開始一個(gè)周期的開發(fā),模塊開發(fā)完成之...
    張熙閱讀 12,513評(píng)論 2 42

友情鏈接更多精彩內(nèi)容