这里先介绍下两个东西 CI/CD
、GitLab Runner
,固然在此以前你须要对 git
有所了解,关于 git 这里不作说明,能够自行百度。html
首先介绍 CI/CD :随着咱们开发方式的转变,程序的发布变得很是频繁,而其这些发布操做都是重复的。CI/CD
就是为了使这些操做能变得自动化,那它是怎么实现自动化的呢?其实它作的就是当咱们使用 git push
(推送)代码的时候会执行 任务
(task) 而这个 任务
里面其实又包含多个 做业
(job),如对代码进行单元测试、部署项目等等,这些 任务
和 做业
在 gitlab 中实际上是以一个 .gitlab-ci.yml
文件存在的,这个文件后面会说明。好了咱们知道了 CI/CD
是什么(心虚~,大家能够自行百度查看更详细的说明。),那么究竟是谁在执行这些 任务
和 做业
的呢?这就是下面要介绍的 GitLab Runner
。linux
GitLab Runner:GitLab Runner
就是用来运行咱们定义好的 任务
和 做业
也就是 .gitlab-ci.yml
文件。Runner 分为 Shared Runner
(共享型) 和 Specific Runner
(专有型),Shared Runner
是全部的项目都能用,但只能由管理员建立,而 Specific Runner
(专有型)只能为指定的项目服务。Shared Runner
通常是用在有多个项目的服务器上,Specific Runner
则是单个项目的服务器,或者是你本身的电脑上。git
下面列出我本次使用的环境:docker
操做系统:Windows 10
项目版本:.NET Core 2.2
脚本执行环境:PowerShell 5.1.17763.316
Web服务器:IIS 10.0
Gitlab:使用 gitlab.com (*Gitlab 支持私有化部署 )shell
项目地址:https://gitlab.com/WigorRunnerTestwindows
首先你须要在 GitLab 上注册个帐号,这里须要使用你懂的工具上网,由于它使用了谷歌的 reCAPTCHA
,若是你是本身部署的 gitlab 将没有这个问题。若是你们有须要请留下邮箱。安全
Gitlab 默认的界面是英文的,只须要点击头像行的 Settings
,而后点击 左侧导航栏
的 Preferences
,以后在滑到最底部找到 Localization
旁边的 Language
选择 简体中文
,最后点击 Save changes
,F5
刷新页面便可。bash
查看设置中文教程服务器
设置好后咱们可能更方便的操做 gitlab 了,接着咱们须要建立一个项目,这里将使用一个 DotNET Core
项目为例。建立好项目后咱们须要将它先 clone
到本地。app
在咱们定义 任务
和 做业
以前咱们须要在咱们的服务器或者是电脑上安装好 Gitlab Runner
。
官网下载地址:https://docs.gitlab.com/runner/install/
下面是我整理好的下载地址,本次使用的是 Windows amd64
:
下载好后,找到你下载的目录,将软件重命名为 gitlab-runner.exe
。只用使用 cmd 进入到该目录,须要注意的是你须要以 管理员
的方式运行 cmd,否者后面执行命令的时候会报错。
接着在命令行中输入:
gitlab-runner register
这时会出现提示:Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
它叫你输入协调器的地址,这个地址是在你 gitlab 项目的 左侧导航栏
,设置
下的 CI/CD
中,找到 Runner
点击展开,就会看到 专有Runner
和 共享Runner
,这里咱们使用 专有Runner
作演示说明。红色框中的东西是咱们后面须要用到的东西。
好了咱们有了 coordinator URL 把它复制下了,粘贴到刚刚的命令中回车。
出现了另一个提示:Please enter the gitlab-ci token for this runner:
,须要你输入 token ,这个 token 就是你刚刚复制 URL 下面的 注册令牌。接着它要你输入这个 Runner 的描述,这个根据本身的状况填。
以后又来一个提示:Please enter the gitlab-ci tags for this runner (comma separated):
,须要咱们输入 Runner 的标签,这里我使用 deploy。
最后一个提示:Please enter the executor: docker, virtualbox, shell, ssh, docker+machine, docker-ssh+machine, kubernetes, docker-ssh, parallels:
,须要咱们填入脚本的执行环境,这里先填 shell
,这时你的 gitlab-runner.exe 下会生成一个 config.toml
文件,里面保存着咱们刚刚输入的信息。
须要注意的是这个标签就是咱们后面编写
.gitlab-ci.yml
里的 job 会用到,它根据 tags 来指派哪些 Runner 会执行该任务
和做业
。
以后咱们回到 gitlab 能够看到这里已经有个激活的运行器了,这里的图标也变成了绿色。若是你这里显示的不是绿色,那么你刷新下页面看看,还不行的话那么你须要运行 gitlab-runner restart
命令来重启 Runner,接着可使用 gitlab-runner status
查看 Runner 的运行状态。出现 gitlab-runner: Service is running!
那么表示你的服务已经运行成功了。 再次强调你的命令须要使用 管理员
身份运行。
上面选择脚本执行环境的时候咱们选了 shell
,可是本次我是在 Windows 环境下运行,因此须要将它改成 PowerShell,打开 config.toml
文件,在 [[runners]]
下加入 shell = "powershell"
,而后保存文件便可。
上面已经提过 .gitlab-ci.yml
使用来干什么的了,.gitlab-ci.yml
实际上是本次自动化发布的核心,它是放在你 gitlab 上项目的根目录下。这里将对 .gitlab-ci.yml
该怎么配作一个简单说明,我只会介绍我用的东西更多的东西你能够查看我下面的「相关文档」。
首先在项目根目录下创建一个 .gitlab-ci.yml
文件,代码以下:
before_script: - cd src stages: - test # job test: stage: test # 将会执行的脚本 script: - dotnet restore - dotnet build # 哪一个分支会执行 only: - master #runner 注册时的 tag,这里指会触发的 runner tags: - deploy
咱们来一个个说明这些东西的做用:
before_script
在整个项目 clone 到 Runner 所处的服务器时会先执行这个里面的脚本,这里我是进入到了 src 目录,你还能够在这里面作一些包还原的操做。
stages
里放的是将会执行的 job。
test
是作做业(job),这个命名你能够根据本身的状况来。test
就是上面 stages
会执行的 job 的真正配置处。
stage
对应 stages
中的项,若是一个 job 没有指定 stage,那么这个任务会分配到test stage。
script
就是执行的脚本,构建自动化的核心也就是在此处。做为简单的演示,我就还原了包和生成项目。
only
是值该 job 会在被哪些分支 push 触发。
tags
上面在咱们注册时有提到过,这个 tags
对应的是咱们注册 gitlab runner
时所填的 tages
,表示的是该 job 会触发哪些 Runner。
OK,咱们此时已经将一个最简单的 .gitlab-ci.yml
构建好了,在项目根目录下执行 git commit -am "[init] .gitlab-ci.yml"
,git push
,将配置好的文件 push(推送)到远端。回到 gitlab 中,咱们点击 CI/CD
能够看到有一个流水线在运行。
点进去能够看到运行的日志,能够看到咱们 before_script
、script
中的命令在一条条的执行,固然若是你的脚本出现了错误,状态会是 失败
,你须要检查你的脚本是否有误。若是你的状态一直处于 等待中
那么须要检查你的 gitlab runner
是否容许正常,以及上面提到的 设置
中的 Runner
是否处于激活状态(绿色图标)。
你可能发现了这里怎么有一些奇怪的字符,这是由于个人操做系统是中文,乱码了解决办法是在 before_script
加入 - chcp 65001
脚本。
再次提交代码,ok 此次的中文信息显示正确了。
.gitlab-ci.yml
是存放在咱们项目的根目录下的,若是咱们项目使开源的,那么咱们将会暴露一些私密信息如token,密钥,项目发布所处服务器的路径,这些信息公开可能会使咱们的项目存在安全隐患。亦或者咱们须要部署多个项目可是它们的 .gitlab-ci.yml
文件十分类似那么咱们就能够经过变量控制哪些可变的因素。
那么到底怎么使用变量呢?第一步咱们须要先声明变量,在 gitlab 的项目中找到 设置
下的 CI/CD
,能够看到 变量
而后展开,这里就是能够声明咱们须要用到的变量。.gitlab-ci.yml
只须要在脚本须要用到变量的方法使用 $env:变量名
的形式使用便可,须要注意的是:不一样的系统使用变量的方法也不同,这里我使用是 PowerShell。
经常使用的变量使用方法:
Shell | 使用方法 |
---|---|
bash/sh | $variable |
windows batch | %variable% |
PowerShell | $env:variable |
关于变量的更多说明能够参考官方的文档:https://gitlab.com/help/ci/variables/README#variables
前面已经介绍了构建一个自动化的流程,有了前面的基础其实自动化部署到 IIS 也就是编写的脚本发生了变化。
再开干以前咱们须要把咱们的思路捋一捋,核心在于怎么经过命令的形式发布一个站点。
dotnet publish -c release -r win81-x64
获取咱们须要发布站点的部署文件下面一步一步已脚本的形式来讲明:
test
和 deploy
,第一个 job 用于校验咱们的代码是否正确,第二个是部署的 job。第一个 job 只有两行命令,还原和编译。before_script: #中文乱码问题 - chcp 65001 - cd src # 执行的 job stages: - test - deploy # 校验代码 test: stage: test # 将会执行的脚本 script: - dotnet restore - dotnet build # 哪一个分支会执行 only: - master #runner 注册时的 tag,这里指会触发的 runner tags: - deploy # 部署 deploy: stage: deploy # 将会执行的脚本 script: # 哪一个分支会执行 only: - master #runner 注册时的 tag,这里指会触发的 runner tags: - deploy
ProjectName
:项目名称,用于 publish 用,如 VS 下一个解决方案可能存在多个项目,这时候就须要知道咱们 publish 的项目使哪一个。WebSiteName
:站点名称,用户关闭 IIS 站点和 IIS 对应进程池的,若是你的进程池和站点的名称不一致请在声明一个变量。WebSitePath
:站点的路径,用于备份、删除原有站点、新的项目复制到该路径下。定义好这些变量后接着写咱们 deploy
的脚本:
能够看到这里使用了:$env:ProjectName
、$env:WebSitePath
、$env:WebSiteName
变量。
# 部署 deploy: stage: deploy # 将会执行的脚本 script: # 声明一个变量保存当前时间,用做备份数据文件夹名称 - $datetime=Get-Date -Format 'yyyy-MM-dd-HH-mm' # 编译打包项目 - dotnet publish -c release -r win81-x64 # 进入编译好的项目目录 - cd $env:ProjectName\bin\Release\netcoreapp2.2\win81-x64\ # 中止 IIS 对应站点 - C:\Windows\System32\inetsrv\appcmd.exe stop site $env:WebSiteName # 中止进程池 - C:\Windows\System32\inetsrv\appcmd.exe stop apppool /apppool.name:"$env:WebSiteName" # 备份原有项目文件,项目名_当前时间 - cp "$env:WebSitePath" "$env:WebSitePath$datetime" -Recurse # 删除原有站点 - del "$env:WebSitePath" -Recurse #复制 publish 文件到站点 - cp "publish" "$env:WebSitePath" -Recurse # 启动进程池 - C:\Windows\System32\inetsrv\appcmd.exe start apppool /apppool.name:"$env:WebSiteName" # 启动 IIS 站点 - C:\Windows\System32\inetsrv\appcmd.exe start site $env:WebSiteName # 哪一个分支会执行 only: - master #runner 注册时的 tag,这里指会触发的 runner tags: - deploy
到这一步整个自动化发布已经完成了,咱们只要 push 代码到远端就会自动部署咱们的项目到 IIS 中,须要注意的是你必须确保你的 IIS 中已经有这个站点了。
回到 gitlab 中查看 CI/CD
能够看到此次咱们的阶段有两个,由于我配置了两个 做业(job),一个 test一个 deploy。
点击每一个做业中看看执行的脚本是否是咱们定义好的,须要提一下 powershell 脚本若是出错的话 gitlab-ci 返回的结果仍是会显示成功,错误提示仍是乱码的,坑啊。额~目前还找到解决的办法,若是是 docker 或者 linux 下应该没有这问题。
再看看 IIS 这边的效果,文件已经自动备份了,站点也正常运行了,一个自动化部署项目到 IIS 站点已经完成了。
下面修改代码而后 push 上去看看,看看咱们的网站没有没有更新。
before_script: #中文乱码问题 - chcp 65001 - cd src # 执行的 job stages: - test - deploy # 校验代码 test: stage: test # 将会执行的脚本 script: - dotnet restore - dotnet build # 哪一个分支会执行 only: - master #runner 注册时的 tag,这里指会触发的 runner tags: - deploy # 部署 deploy: stage: deploy # 将会执行的脚本 script: # 声明一个变量保存当前时间,用做备份数据文件夹名称 - $datetime=Get-Date -Format 'yyyy-MM-dd-HH-mm' # 编译打包项目 - dotnet publish -c release -r win81-x64 # 进入编译好的项目目录 - cd $env:ProjectName\bin\Release\netcoreapp2.2\win81-x64\ # 中止 IIS 对应站点 - C:\Windows\System32\inetsrv\appcmd.exe stop site $env:WebSiteName # 中止进程池 - C:\Windows\System32\inetsrv\appcmd.exe stop apppool /apppool.name:"$env:WebSiteName" # 备份原有项目文件,项目名_当前时间 - cp "$env:WebSitePath" "$env:WebSitePath$datetime" -Recurse # 删除原有站点 - del "$env:WebSitePath" -Recurse - cp "publish" "$env:WebSitePath" -Recurse # 启动进程池 - C:\Windows\System32\inetsrv\appcmd.exe start apppool /apppool.name:"$env:WebSiteName" # 启动 IIS 站点 - C:\Windows\System32\inetsrv\appcmd.exe start site $env:WebSiteName # 哪一个分支会执行 only: - master #runner 注册时的 tag,这里指会触发的 runner tags: - deploy
至此已经实现了 push 时项目自动发布到 IIS 。固然在这个过程当中踩了 n 多的坑,总结要细心安装步骤一步一步认真的走。下一步准备对接钉钉的机器人。实现的效果是当咱们项目发布时会自动通知,发布成功后也会自动通知。
《什么是 CI/CD?》:https://linux.cn/article-9926-1.html
《GitLab-CI与GitLab-Runner》: http://www.cnblogs.com/cnundefined/p/7095368.html
《IIS 站点和进程池关闭》:http://www.javashuo.com/article/p-fdeajjtb-dn.html
《Gitlab-CI job 配置文件 .gitlab-ci.yml 配置方式(翻译)》:http://www.javashuo.com/article/p-hefxoaqh-g.html
powershell论坛:https://www.pstips.net
GitLab Runner 官方文档:https://docs.gitlab.com/ee/ci/runners/README.html