美文网首页
Docker+Jenkins+Pipeline实现持续集成(一)

Docker+Jenkins+Pipeline实现持续集成(一)

作者: 禾苗zj | 来源:发表于2019-01-02 18:05 被阅读116次

    本地安装

    1. Docker环境准备

    2. Jenkins容器运行

    可使用Jenkins官方提供的镜像,其稳定版镜像为:jenkins/jenkins:lts
    通过如下命令启动Jenkins容器:
    docker run -d -p 8080:8080 jenkins/jenkins:lts
    Jenkins工作目录为/var/jenkins_home,可将此目录挂载到宿主机上,如下(通过JNLP使用slave服务时需要使用50000端口):
    docker run -d -p 8080:8080 -p 50000:50000 -v your_dir:/var/jenkins_home jenkins/jenkins:lts
    注:当挂载jenkins的工作目录jenkins_home时,可能会出现容器无法启动,查看日志出现如下错误:

    jenkins容器启动失败
    这是由于Jenkins容器的当前用户是"jenkins",但当"/var/jenkins_home"映射本地数据卷时,该目录的拥有者是root用户,因此jenkins用户访问root权限目录会出现"Permision denied"的问题。解决办法是将目录用户者改为1000,再重新启动容器即可,如下:

    sudo chown -R 1000 your_dir
    docker restart container

    3. 获取Jenkins初始密码

    在容器启动后,通过查看启动日志获取Jenkins的初始密码:docker logs 容器ID/容器名
    如下图所示,日志中“Please use the following password to proceed to installation:”下的一行为初始化密码:


    初始化密码

    4. Jenkins初始化

    本地访问Jenkins服务地址为:http://localhost:8080
    第一次打开Jenkins页面时,会进入“Getting Started”页面,需要输入“Adminitrator password”即第3步获取的密码,输入后点击“Continue”继续,如下图所示:

    Jenkins初始化
    (注:如果没有复制密码,可通过命令docker exec −it jenkins /bin/bash进入到Jenkins容器里,根据提示位置查找初始密码)

    然后页面会提示安装插件,可点击选择安装其推荐的插件(这些插件都比较常用),即“Install Suggested Plugins”,等插件安装完成后进入管理员账号页面设置账号(注:最好填写上电子邮件地址,以防使用Blue Ocean创建Jenkinsfile时失败),如下两图所示:

    插件安装
    设置管理员账号

    当管理员账号设置完成,点击“Save and Finish”,即可开始Jenkins的使用,如下图所示:


    开始使用

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

    自定义dockerfile:

    为了通过Jenkins实现Docker镜像的build、push,我们需要一个使用Docker命令的环境。因此,我们在Jenkins容器里挂载宿主机的docker.sock和Docker二进制文件,Rancher上的docker-compose文件如下(my_jenkins为自定义的Docker镜像,下面会给出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
    

    相应的Docker运行命令如下:
    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用户能够有权限运行Docker命令,可以将Jenkins用户加到主机的Docker组里(这样会由于组gid的不同造成不可移植),或令Jenkins用户可以免密使用sudo命令(在命令行中运行echo jenkins ALL=NOPASSWD: ALL>> /etc/sudoers,这种方式会使得Jenkins在每次使用docker命令时必须输sudo)。我们现在采取的解决方法是直接使用root权限运行Jenkins容器。

    通过如上的方式,我们能够在Jenkins容器里使用Docker命令,但在使用过程中,可能会报如下图的错误:

    图片.png
    libltdl.so.7位于/usr/lib/x86_64-linux-gnu/文件夹下,我们可以将该文件通过-v挂载到Jenkins容器,或者通过自定义dockerfile将libltdl.so.7直接复制到容器中。
    另外,自定义的dockerfile还能够实现定制化的Jenkins配置,令Jenkins容器启动时就能满足我们的需求。例如,可以将Jenkins系统的时区设置为PRC;可以将需要的插件通过plugins.txt在Jenkins镜像构建时安装下载;可以下载Android SDK并配置好环境变量,使得Jenkins容器能够进行Android项目构建。

    如下是一个自定义的dockerfile样例:

        FROM jenkins/jenkins:lts
    
        MAINTAINER ×××
    
        USER root
    
        ### 设置jenkins的时区
        RUN cp /usr/share/zoneinfo/PRC /etc/localtime
        ENV JAVA_OPTS=-Duser.timezone=Asia/Shanghai
    
        ### 自动安装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远程仓库登录认证的config.json
        COPY libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7
        COPY config.json /root/.docker/config.json
    

    相关文章

      网友评论

          本文标题:Docker+Jenkins+Pipeline实现持续集成(一)

          本文链接:https://www.haomeiwen.com/subject/bjedlqtx.html