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

2019-01-02  本文已影响116人  禾苗zj

本地安装

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
上一篇下一篇

猜你喜欢

热点阅读