持续集成与持续交付 - 使用Jenkins构建镜像

340 阅读2分钟

使用Jenkins构建镜像

步骤1 - 启动Jenkins
在部署了有docker的主机,启动一个容器:

  • 分别绑定8080与50000端口
  • 映射目录
$ docker run -d -u root --name jenkins \
>     -p 8080:8080 -p 50000:50000 \
>     -v /root/jenkins_22773:/var/jenkins_home \
>     jenkins/jenkins:2.277.3-alpine
Unable to find image 'jenkins/jenkins:2.277.3-alpine' locally
2.277.3-alpine: Pulling from jenkins/jenkins
339de151aab4: Pull complete 
3f2c100ec87a: Pull complete 
db6bab469f20: Pull complete 
eda9addfa47b: Pull complete 
c092c8f827e6: Pull complete 
a6680d8d161c: Pull complete 
db9b4e01fc34: Pull complete 
9b787e33f839: Pull complete 
d10d3008be39: Pull complete 
2aa47f96718a: Pull complete 
ba5b5e674cf0: Pull complete 
e6cbc4f99054: Pull complete 
ca84433b8cee: Pull complete 
01ed7fde834c: Pull complete 
Digest: sha256:0010e7b78300c9825b81d9dc5f5079b5d6df8772d4000707e33bda3db02fb1d6
Status: Downloaded newer image for jenkins/jenkins:2.277.3-alpine
e0cd4d3d5b5f0514fdbb4f9cbda41f02af394ef434a58f389c0bd663568d3cb6
$ docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                              NAMES
e0cd4d3d5b5f        jenkins/jenkins:2.277.3-alpine   "/sbin/tini -- /usr/…"   24 seconds ago      Up 23 seconds       0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   jenkins
$ 

使用浏览器访问8080端口,首先会让我们输入管理员密码
在这里插入图片描述
按照提示,密码可以在容器的/var/jenkins_home/secrets/initialAdminPassword文件中找到

$ docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
72c9b57faade4f6296835d1b1168e636

将这个密码粘贴单网页中,点击Continue,提示安装插件,

在这里插入图片描述
选择安装建议安装的插件进行安装,
在这里插入图片描述

随后提示创建管理员,我们选择跳过该步骤,
在这里插入图片描述设置访问URL
在这里插入图片描述点击保存完成,显示完成
在这里插入图片描述
至此,Jenkins已初始化完毕。

步骤2 - 配置Docker插件
在Dashboard里,Manage Jenkins→ Manage Plugins→ 点击Available→ 搜索Docker,选择并安装
在这里插入图片描述在这里插入图片描述
安装成功。

步骤3 - 添加Docker Agent
以上步骤完成了插件的安装,现在我们来配置启动Docker Container。
同样地,在Dashboard里,Manage Jenkins→ Configure System→ 在Configure Clouds下拉菜单中选择Docker
→ 将Docker Host URI配置为tcp://172.17.0.44:2345,然后点击Test Connection测试连通性。
在这里插入图片描述

→ Docker Agent templates→ Add Docker Template→ 设置agent的label为docker-agent→ Docker Image为benhall/dind-jenkins-agent:v2→ 在Container Settings下设置Volumes为/var/run/docker.sock:/var/run/docker.sock→ 设置Connect Method为Connect with SSH→ 最后确保是Enabled的,点击保存。
步骤4 - 创建构建项目
在这里插入图片描述

在Dashboard里,Create Item→ 输入名称“Thesre Jenkins Demo” → 点击Freestyle project并点击OK→ 选择label为docker-agent
在这里插入图片描述配置构建shell命令
在这里插入图片描述
在这里插入图片描述

点击保存。

步骤5 - 构建项目
在这里插入图片描述

上图可以看到提示(pending—‘Jenkins’ doesn’t have label ‘docker-agent’)。这是因为在后台,Jenkins在启动容器,并通过SSH连接它。这需要耗些时间。回到命令行查看容器的启动状态

$ docker logs --tail=10 jenkins
2021-04-26 12:37:37.409+0000 [id=300]   INFO    hudson.model.AsyncPeriodicWork#lambda$doRun$0: Finished DockerContainerWatchdog Asynchronous Periodic Work. 201 ms
2021-04-26 12:38:07.980+0000 [id=307]   INFO    c.n.j.plugins.docker.DockerCloud#canAddProvisionedAgent: Provisioning 'benhall/dind-jenkins-agent:v2' on 'docker'; Total containers: 0 (of 100)
2021-04-26 12:38:07.980+0000 [id=307]   INFO    c.n.j.plugins.docker.DockerCloud#provision: Will provision 'benhall/dind-jenkins-agent:v2', for label: 'docker-agent', in cloud: 'docker'
2021-04-26 12:38:07.986+0000 [id=307]   INFO    h.s.NodeProvisioner$StandardStrategyImpl#apply: Started provisioning Image of benhall/dind-jenkins-agent:v2 from docker with 1 executors. Remaining excess workload: 0
2021-04-26 12:38:07.992+0000 [id=309]   INFO    c.n.j.p.docker.DockerTemplate#pullImage: Pulling image 'benhall/dind-jenkins-agent:v2'. This may take awhile...
2021-04-26 12:38:07.996+0000 [id=309]   INFO    i.j.docker.client.DockerAPI#getOrMakeClient: Cached connection io.jenkins.docker.client.DockerAPI$SharableDockerClient@27a75718 to DockerClientParameters{dockerUri=tcp://172.17.0.86:2345, credentialsId=null, readTimeoutInMsOrNull=300000, connectTimeoutInMsOrNull=60000}
2021-04-26 12:38:09.384+0000 [id=309]   INFO    c.n.j.p.docker.DockerTemplate#pullImage: Finished pulling image 'benhall/dind-jenkins-agent:v2', took 1391 ms
2021-04-26 12:38:09.539+0000 [id=309]   INFO    c.n.j.p.docker.DockerTemplate#doProvisionNode: Trying to run container for image "benhall/dind-jenkins-agent:v2"
2021-04-26 12:38:09.579+0000 [id=309]   INFO    c.n.j.p.docker.DockerTemplate#doProvisionNode: Trying to run container for node docker-00006h094xelp from image: benhall/dind-jenkins-agent:v2
2021-04-26 12:38:10.723+0000 [id=309]   INFO    c.n.j.p.docker.DockerTemplate#doProvisionNode: Started container ID 299f49ded9eb8063f67394c87fc3c76965454b6cb41c87b36dc41491ccb27cc9 for node docker-00006h094xelp from image: benhall/dind-jenkins-agent:v2
$ 

在这里插入图片描述
在这里插入图片描述

等待10分钟发现构建完成了,查看构建好的镜像thesre/jenkins-demo:1

$ docker images
REPOSITORY                   TAG                  IMAGE ID            CREATED             SIZE
thesre/jenkins-demo          1                    a3ac0ccaff85        4 seconds ago       5.81MB
katacoda/jenkins-demo        latest               a3ac0ccaff85        4 seconds ago       5.81MB
jenkins/jenkins              2.277.3-alpine       a1eefa9056ae        5 days ago          364MB
benhall/dind-jenkins-agent   v2                   8f582645af33        3 years ago         1.14GB
jenkinsci/blueocean          1.4.2                38822be1d491        3 years ago         447MB
tomcat                       9.0                  ea872b677dfa        3 years ago         678MB
openjdk                      8-jdk                891c9734d5ab        3 years ago         726MB
jenkins/jenkins              2.112-alpine         481b49e06417        3 years ago         223MB
microsoft/dotnet             2.1-sdk-alpine       d19f9b663c61        3 years ago         1.54GB
microsoft/dotnet             2.1-runtime-alpine   c0aab70b7f6c        3 years ago         87.5MB
node                         8-alpine             adc4b0f5bc53        3 years ago         68.1MB
tomcat                       8.0                  7aa9e977bdb9        3 years ago         456MB
tomcat                       7.0                  b6002d3fc5ab        3 years ago         456MB
redis                        latest               4760dc956b2d        3 years ago         107MB
ubuntu                       latest               f975c5035748        3 years ago         112MB
alpine                       latest               3fd9065eaf02        3 years ago         4.14MB
jenkins/jenkins              2.92                 cf8d6668ff13        3 years ago         813MB
microsoft/dotnet             1.1.1-sdk            a97efbca0c48        3 years ago         879MB
microsoft/dotnet             1.1.1-runtime        76280f7f53f6        3 years ago         251MB
jenkins                      2.46.1               51c5d6c8e9a2        4 years ago         713MB
jenkins                      1.651.1-alpine       8a3f0ec8fe3a        4 years ago         254MB
benhall/dind-jenkins-agent   latest               d97d6673e8f9        5 years ago         659MB

步骤6 - 使用刚刚构建的镜像启动容器

$ docker run -d -p 80:80 thesre/jenkins-demo:1
899c965888d530d472d5f6513008317670015973095339b839b994236c83fbcb
$
$ curl host01 #访问网站获得输出,说明容器正确启动。
<h1>This request was processed by host: 899c965888d5</h1>
$