共计 3746 个字符,预计需要花费 10 分钟才能阅读完成。
Jenkins 是基于 Java 开发的一种持续集成工具,主要用于持续、自动的构建 / 测试软件等相关项目。在 Java 开发中我们经常能看到使用 jenkins 来部署,.Net core 目前还是比较少见的,但是好的东西我们就应该要拿来使用、借鉴。
1. 安装 JenKins
这里使用 Docker 来安装 JenKins, 当然也可以直接安装到 Linux 中。
创建 jenkins 工作目录
mkdir /usr/local/jenkins
拉取 jenkins 镜像
docker pull jenkins
这里有个小插曲,我用的是 jenkins 镜像,默认也是 latest 一般意味着最后最新版本。很多官方最新镜像也都是如此命名;直到后来安装配置完成后,登录进去提示我不是最新版本,让我更新,并且很多插件已经不支持此版本了。发现当前版本和最新版本还相差好几个。心想这不是官方镜像吗 怎么还是这么旧的版本,最后通过搜索发现,Jenkins 官方最新镜像现在已改为 jenkins/jenkins 的了。
所以最新版是:jenkins/jenkins
我们拉取最新 lts 版本。
docker pull jenkins/jenkins:lts
看如下图 jenkins 和jenkins/jenkins两个镜像的差别,发现常规下的 latest 版本并不最新的了,它们的创建时间已经是 1 年以前了。而 jenkins/jenkins 则创建时间在 2 天不到。
所以常规的 latest 并不意味着最新版本。
修改 jenkins 目录和 docker 目录权限, 这里 1000 是容器中 Jenkins 的用户 uid
chown -R 1000:1000 /usr/local/Jenkins
sudo chown -R 1000:1000 /var/run/docker.sock
尤其 docker.sock 这个权限很重要,到时候容器里的 Jenkins 需要执行 docker 命令需要的
运行 Jenkins 注意后面的镜像名称和版本 lts
docker run -itd -p 8080:8080 -p 50000:50000 –name jenkins –privileged=true -v /usr/local/jenkins:/var/jenkins_home -v /usr/bin/docker:/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
参数解释:
-p 8080:8080 -p 50000:50000 —映射 jenkins 端口
–name jenkins —容器名称自己命名
privileged=true —授予容器管理员权限
-v /usr/local/jenkins:/var/jenkins_home —映射 jenkins 目录
-v /usr/bin/docker:/bin/docker —映射 docke 目录 到时候需要在容器里执行 docker 命令
-v /var/run/docker.sock:/var/run/docker.sock —映射 docker 执行命令 到时候需要容器里执行 docker 命令。
容器是否启动成功最好还是通过 docker ps 或者 netstat –ntlp |grep 8080 (查看我们容器映射的端口是否监听成功) 查看当前容器是否运行成功。
某些情况下,如权限没有配对,启动会不成功的。
查看正在运行的容器。
docker ps
2. 配置 JenKins
查看容器启动成功后,我们可以通过地址 + 端口访问刚刚运行的 Jenkins
例如 http://192.168.1.101:8080
安装成功访问后会如下图所示。
提示首次访问需要密码,我们通过刚刚映射的 Jenkins 目录里查看这个默认密码。
默认密码路径:/usr/local/jenkins/secrets/ (注意前面 usr/local/jenkins 路径就是刚刚自己映射的目录)
查看密码文件
cat initialAdminPassword
输入密码然后继续下一步。
下一步如果有出现 404 的,如下图
网上搜索了解听说是 Jenkins 的一个 bug;部分版本存在。
解决办法 ( 以下步骤是解决登录 404 的;如果没有 404 则可以跳过)
首先回到 Jenkins 主目录找到 config.xml 文件并打开。
将 <useSecurity> 修改为 false
停止并重新运行 jenkins
重启后一定要重新查看默认密码,否则旧密码是登录不成功的。
登录进去以后这里默认选择推荐的插件。
接下来就是等待安装,这里需要注意,如果 jenkins 版本比较老,则可能很多插件安装失败,直接红色的。此时可以跳过该界面进入首页。会有提示让你升级最新 Jenkins 版本。
安装完成后创建一个用户名和密码,即可完成安装进入首页。
3. 创建项目
1、源代码编译发布工程
源代码发布工程即将源代码提交到 git 服务器,jenkins 通过 git 拉取最新的源代码,并通过 Dockerfile 里的配置进行编译发布过程。然后通过 Docker 构建此镜像并运行到容器。
创建一个.Net Core Web 项目。
创建项目的时候可以选择启用 Docker 支持。
对于之前的项目可以右键添加 Docker 支持。
项目目录
默认的 Dockerfile 是有帮我们进行代码编译并发布动作的。所以默认的 Dockerfile 文件是适合和代码一起提交到服务器然后使用 Docker 进行构建镜像。
项目创建完成后随代码一起提交到 git 服务器。(svn 等也都可以)
git 项目目录,注意将 Dockerfile 复制到根目录。由于到时候构建镜像的时候就是从根目录执行的。git 目录如下所示。
2、已编译的Release 工程
已编译的 Release 工程,此种方式适合 git 或 svn 在局域网的;又不希望源代码不暴露到外网的需要。此种方式是将项目工程进行进行发布打包操作。例如 java 常见的打包成一个 war 包文件。.Net 就是生成对应的 DLL 文件。
项目在发布之前我们对项目的 Dockerfile 文件属性做个更改,以便在发布时将此文件复制到发布时的目录。
选择上面建立的 WebTest 项目右键发布,选择发布到指定文件夹。
将发布文件发布到自己的 git(或 svn)目录,如下图所示的,一定要包含 Dockerfile 文件。发布后的文件,可以根据自己需要将没有更新 DLL 或者 appsetting.json 等文件剔除掉。只保留本次要更新的文件即可。
修改 Dockerfile 文件,因为默认的 Dockerfile 文件是包含编译发布的命令,所以这里要将这些相关命令操作删除掉;保留如下命令配置即可。
保存然后提交到所有文件到 git 服务器。
提交后的 git 目录。
建议:无论是代码编译发布工程还是已编译的 Release 工程,第一次使用 Docker 部署时最好先自己手动将这些文件拷贝到服务器,并手动构建对象并运行容器看是否成功;能否访问网站。也就是先不用 Jenkins 将这些流程自己手动走一遍,确保一些目录包括 Dockerfile 等都是配置正确的。
4. 创建 JenKins 任务
项目工程创建完成并提交到 git 服务器后,开始在 Jenkins 里面创建任务。
输入项目描述,源代码管理选择自己对应的即可。
我这里选择的 git。第一次添加项目时需要添加一种授权方式点击右边添加按钮即可。
选择添加授权方式 常用的就是用户名加密码或者 SSH 方式。
下一步设置构建环境
设置触发器,这里主要是设置自动触发条件,有定时构建、远程触发构建、轮询 SCM。
这里只设置轮询 SCM 形式的,很简单的方式。意思是在指定间隔时间内会去轮询 git 或 svn 中版本是否有变化。如果有就立即构建该项目。其实就是做到只要代码提交了 则立刻就能自动构建项目进行发布;不在需要其他任何操作了。
选择构建—> 执行 shell; 当然我们这里是 linux 服务器所有多数选择执行 shell。
添加 shell 命令。
注意下面的 webtest 改为自己的容器名称和对应镜像名称即可。
#!/bin/bash
# 获取短版本号
GITHASH=`git rev-parse --short HEAD`
docker stop webtest
docker rm webtest
echo ---------------Building Docker Image...------------------
docker build -t webtest:$GITHASH .
docker tag webtest:$GITHASH webtest:latest
echo ---------------Launching Container...------------------
docker run --name webtest -d -p 8005:80 webtest:latest
使用 git 提交代码进行测试。
自动开始构建了 注意 jenkins 这里时间是默认是 utc 时间。utc 时间转换我们北京时间是要 + 8 小时的。
蓝色图标代表构建成功,如果失败会是红色
查看控制台输出信息,尤其构建失败时能够从里面获取到失败原因等。
控制输出如下图所示
构建成功后我们到服务器检查下是否有刚刚构建的镜像和运行的容器。(当然一般情况下只要构建成功这两步可以不用检查)
查看镜像
查看运行的容器
访问站点看能否访问成功。