在引入自动化部署工具的时候,我们对比了jenkins和gitlab CI,jenkins有非常丰富的插件,配置起来方便。gitlab CI更倾向于脚本配置,当然jenkins也可以使用pipeline实现全脚本化配置(everything is code,哈哈)。我们这里主要讲述jenkins的自动化部署。 基本组合是jenkins+git+msbuild+python,实现从代码仓库拉取、编译、打包、部署、自动化测试。(.net core和framework4.6.1可以不依赖msbuild构建,将在下一篇文章中讲述) 一、安装环境 1.jenkins是java生态圈的产品,需要安装jdk 2..net项目依赖.net framework,安装需要的framework版本(如framework4.5.1) 3.安装构建工具msbuild 4.安装nuget 5.安装jenkins 二、配置jenkins 1.安装好jenkins后,进入“系统管理”->“插件管理”,安装git和msbuild这两款插件。 2.安装好插件后,新建一个项目,选择“构建一个自由风格的软件项目”,然后点确定。 3.源码管理选择git。 4.添加构建步骤,构建一个项目 5.项目需要nuget获取程序包的,可以使用批处理来实现,继续添加构建步骤: 6.nuget restore 命令获取项目需要程序包 Rebulid:构建 Configuratiom = Release:按release打包 DeployOnBuild = true/false:是否打包 PublishProfile=pub100:pub100是VS打包的配置文件 注意:这里的Msbuild Version选择了vs2017里的,jenkins插件库中的msbuild版本太低,编译经常出错,最简单的做法就是安装VS,然后在“系统管理”->“全局工具配置”中配置VS工具中的msbuild路径 7.构建触发器,jenkins提供定时构建及轮询机制。轮询是设置一段时间间隔,去代码仓库检测是否有更新,有更新触发构建。 8.保存,选择“立即构建” 9.构建成功 10.控制台日志 部署服务器和自动化测试都由python实现,感兴趣的可以看我另外一篇文章。 from:https://www.cnblogs.com/shenh/p/8946404.html
View Details操作环境:Windows 一、环境准备 1 安装JDK 本文采用jdk-8u111-windows-x64.exe; 2 配置tomcat 本文采用tomcat8,无需安装,配置JAVA_HOME及JRE_HOME环境变量即可; 3 安装maven 本文采用maven3.3.9,无需安装; 4 安装Jenkins 下载地址https://jenkins.io/download/,仅下载war包,如下图: 将下载好的jenkins.war放进tomcat/webapps目录下。 二、相关配置 1 登入http://localhost:8080/jenkins,进入Jenkins初始化页面,第一次启动时间可能有点长,耐心等待。进入成功后会看到如下画面,按提示路径打开密码文件,输入密码: 解锁后又是一长段时间等待,此后可能出现如下图所示界面: 表示无法下载Jenkins插件,可能是因为防火墙导致,而Jenkins插件的安装非常重要,建议翻墙。如无法翻墙,则选择Skip Plugin Installations跳过插件安装。进入以下页面,设置登陆用户: 2 设置成功后即进入Jenkins主界面: 点击左上侧系统管理,进入Jenkins基本系统设置(主要是以下三块): 3 先进入“管理插件”模块安装必需的插件,以下是建议安装列表: 将本文附件中的插件放入Jenkins插件存放目录即可,如本文插件存放目录为:C:\Users\Administrator\.jenkins\plugins(可点击系统管理–>系统设置,在最上方查看,如下图); 4 配置系统设置 添加编码全局属性: 增加系统管理员邮件地址: 其他的可用默认配置,保存后退出。 5 添加全局配置Global ToolConfiguration 配置JDK,不采用自动安装: 配置maven,不采用自动安装: 以上即为需要设置的系统配置。 三、系统部署 系统设置完成后开始添加任务,任务类型选择自由风格: 创建完成后可在主页看到如下画面: 在”All” tab下能看到新建的任务,点击该任务,进入该任务的配置页面: 设置项目备注及构建规则: 配置项目轮询的源码位置(@HEAD表示构建最新的代码)并配置代码访问密码: 配置构建触发器,如下图配置为每天晚上9:30开始构建(Cron表达式): 增加Invoke top-level Maven targets构建步骤,插件目标为编译、发现编译Bug、部署,另外还可以配置构建时忽略测试用例: 增加构建后操作步骤:Publish FindBugs analysis results,用于查看FindBugs插件的代码分析报告,该模块可采用默认配置: 增加构建后操作步骤:Deploy war/ear to a container,用于将构建后生成的war包部署至tomcat服务器,下图中Contextpath用于配置项目访问路径,如填/RMS_Server则表示项目的根访问目录为:http://localhost:8080/RMS_Server,Deploy on failure用于配置当前构建失败时是否仍然部署至tomcat,默认不选: 以上即为本项目的所有配置,完成后应用(或保存)并退出。 配置完成后即可开始构建,左侧可查看bugs分析信息及构建历史: 点击某个构建记录,如上图中的#31,即可查看构建日志、SVN代码提交日志及bugs分析结果: 四、编码问题 FindBugs分析报告中查看某些代码文件时可能出现中文乱码情况,如下图: 这是tomcat的编码问题导致的,可在系统管理中查看tomcat的相关编码情况: 主要关注的是file.encoding属性及sun.jnu.encoding属性,二者需要设置为UTF-8以兼容中文: 这可通过在tomcat配置文件/bin/catalina.bat文件中添加set “JAVA_OPTS=-Dfile.encoding=UTF-8-Dsun.jnu.encoding=UTF-8”命令实现,如下图: 配置完成后重启tomcat,可看到编码已经更改: from:https://blog.csdn.net/hc_ttxs/article/details/79384535
View Details一:本文在上一篇文章的基础之上继续进行操作,上一篇实现了从git获取代码并进行代码测试,本文将在上一篇的基础之上实现将代码部署至测试环境。 1.1:新建一个项目叫web-demo-deploy用于代码发布,上一个项目web-demo可用于代码测试,当测试阶段出现问题的时候也不会立即进行发布,只有当测试通过之后才执行发布的项目即可: 1.2:如何将代码发布到web服务器: 1.2.1:可以通过执行命令或脚本的方式进行代码发布,在各web服务器创建一个www用户,用于启动web服务并进行代码发布:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# useradd www # echo "123456" | passwd --stdin www # su - www $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/www/.ssh/id_rsa): Created directory '/home/www/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/www/.ssh/id_rsa. Your public key has been saved in /home/www/.ssh/id_rsa.pub. The key fingerprint is: bc:51:20:7d:cc:bb:de:e8:e4:11:d3:f7:1b:ec:0c:0d www@node1.chinasoft.com The key's randomart image is: +--[ RSA 2048]----+ | ...o | | ...+ | | ... | | . ... | | S o..E. | | o.o .+. | | ..oo . +.| | oo.. + o| | .o + | +-----------------+ [www@node1 ~]$ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIvExDg2tXu3+XZVdjxuur/orC0C9G1vGFKd5c67mOkiJE+OI1eyDl4yoqsabJbp7aHJEDomfO7MjoJSQEQdhebgpCvG7/ron5IoF7Ql3RllhObDHmRmjhSuHbZqJCpM2qqIejkdwM4qpnkFcJUxOZLgdKfiVfNIaAjkY3BUbyKrt64GZ4pykoZXqTLX7fDHAOqzUJqy3IuCLhk0judRdlUWayWnrXOrBGXfuKiBuXiFIxhKbDvDr93ZldqcGXXCmscTLIlQ+yFAEeb11K+/z0uEQU6l9sKD4i8v5503KiFSVWSSfL40ZBFWcP20nK3prRH5CFD2piWbLPQBYVhzpL www@node1.chinasoft.com |
1.2.2:在git服务器将www用户的公钥添加至部署key,将root的公钥添加至ssh key,以让www用户有获取代码权限,让root用户有提交代码的权限: ssh keys和deploy keys区别: github账户的SSH keys,相当于这个账号的最高级key,只要是这个账号有的权限(任何项目),都能进行操作。 仓库的Deploy keys,顾名思义就是这个仓库的专有key,用这个key,只能操作这个项目,其他项目都没有权限。 说白了就相当于你有一所大别墅,SSH key能开别墅中的任何一个房间。而Deploy key只能开进别墅中的一个单间。 1.2.4:确认www用户有拉取代码权限: 1.3:关于shell脚本执行权限: #稍后会通过jenkins执行一个脚本,从而完成代码的发布,但是默认执行的用户是jenkins,需要赋予jenkins一定的权限,另外发布的脚本可能在本机也可能不在本机,本次设想不在本机保存脚本,则设置如下: 1.3.1:解决脚本运行问题: #将脚本放在www用户家目录/home/www,git代码也放在家目录,因此需要jenkins服务器远程到代码发布服务器执行远程命令,需要做免登陆认证,将jenkins服务器root和www用户的公钥放在代码部署服务器的www用户家目录.ssh/authorized_keys文件中,使jenkins服务器能够不输入密码就可以调用部署服务器的脚本: jenkins服务器:192.168.3.199 deploy部署服务器:192.168.3.12
1 2 3 4 5 6 |
$ chmod 600 authorized_keys $ cat authorized_keys [www@192.168.3.12 ~]$ cat .ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIvExDg2tXu3+XZVdjxuur/orC0C9G1vGFKd5c67mOkiJE+OI1eyDl4yoqsabJbp7aHJEDomfO7MjoJSQEQdhebgpCvG7/ron5IoF7Ql3RllhObDHmRmjhSuHbZqJCpM2qqIejkdwM4qpnkFcJUxOZLgdKfiVfNIaAjkY3BUbyKrt64GZ4pykoZXqTLX7fDHAOqzUJqy3IuCLhk0judRdlUWayWnrXOrBGXfuKiBuXiFIxhKbDvDr93ZldqcGXXCmscTLIlQ+yFAEeb11K+/z0uEQU6l9sKD4i8v5503KiFSVWSSfL40ZBFWcP20nK3prRH5CFD2piWbLPQBYVhzpL www@node1.chinasoft.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsYf1pLYFBUhThXz5pqPMl9TVJxzKEkB/6vImEcDnBqDhrWZe+OqIWp+GTbkHNcXDejD1pBvvQScPIuxlz/r7OEBRTpTjmZOAaLCRMljhx2iMsgTdyjSqZFXMAXRI+F/ZPKKypDW2ZLMLjyqB6ZHK+9/SIMVGwzw/Ey3kqAQovI7UQMoL/59xjah+9zNGboTpZI613LX5vrgCghWUS5NHxU/DNUWjaxFuYJqr7ELKVrG/vZJcbtwmGpRDcCq03Kl2Mz0lHhkGZVDHWqhIPcyRjKrDh0/WqaTlPuIYZ3bZu33aQSxXV5GMGv6VqfIkYVU0uFewL4znPKFPa1z4mAJpR root@node1.chinasoft.com |
1.3.2:确认可以免密码远程登陆: 使用root和www用户测试一下是否可以免秘钥登陆,以便让部署服务器将用户的key添加到know_keys,否则报错Host key verification failed
1 2 |
ssh www@192.168.3.12 ssh www@192.168.3.13 |
1.3.3:解决jenkins没有权限的问题,在jenkins服务器192.168.3.199上操作:
1 2 3 |
# vim /etc/sudoers #Defaults requiretty #注释掉,不需要tty jenkins ALL=(ALL) NOPASSWD: /usr/bin/ssh |
1.3.3:配置jenkins项目执行shell脚本: 1.3.3.1:脚本内容(需要放在部署服务器192.168.3.12的/home/www目录下):
1 2 3 4 5 6 7 8 |
www@192.168.3.12 $ vim dep.sh #!/bin/bash cd /home/www/web-demo_deploy/ #进入到本地代码库 git pull #从git服务器更新代码 scp -r ./* www@192.168.3.12:/webroot/web_www #将代码部署至web服务器 scp -r ./* www@192.168.3.13:/webroot/web_www www@192.168.3.12 $ chmod +x dep.sh |
1.3.3.2:在jenkins调用脚本: #在项目的构建步骤调用,项目-配置-构建-增加构建步骤-Execute shell 访问web页面测试: 在git仓库创建代码并更新至git服务器:
1 2 3 4 5 6 7 8 9 10 11 12 |
[www@master web-demo_deploy]$ vim index.html # 添加www.chinasoft.com [www@master web-demo_deploy]$ git add index.html [www@master web-demo_deploy]$ git commit -m 'edit index.html add www.chinasoft.com' [master 51f8f11] edit index.html add www.chinasoft.com 1 file changed, 1 insertion(+), 1 deletion(-) [www@master web-demo_deploy]$ git push origin master Counting objects: 5, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 313 bytes | 0 bytes/s, done. Total 3 (delta 2), reused 0 (delta 0) To git@192.168.3.198:web/web-demo_deploy.git ac41e81..51f8f11 master -> master |
再次在jenkins执行项目构建 可以看到刚刚更新的代码获取成功 1.4:让代码测试项目管理代码发布项目,当代码测试的项目执行成功之后自动调用代码发布的项目完成代码部署: 1.4.1:安装插件,jenkins的插件默认安装路径
1 |
# ll /var/lib/jenkins/plugins/ |
tomcat版本的安装路径:
1 |
/usr/local/tomcat/webapps/jenkins/WEB-INF/detached-plugins/ |
如果插件在线安装不成功可以下载插件到此目录然后把属主属组改成jenkins再重启jenkins服务即可完成安装: #系统管理-管理插件-可选插件,搜索Parameterized: 1.4.2:配置项目demo的构建后操作,demo构建完成后自动构建demp-deploy项目: #jenkins-->web-demo-->配置-->构建后操作: 1.4.3:配置如下: 1.5:测试,执行代码测试项目成功之后是否会自动执行代码部署项目: 控制台输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
Started by user admin Building in workspace /home/jenkins/.jenkins/workspace/web-demo > git rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url git@192.168.3.198:web/web-demo.git # timeout=10 Fetching upstream changes from git@192.168.3.198:web/web-demo.git > git --version # timeout=10 using GIT_SSH to set credentials gitlab_web-demo > git fetch --tags --progress git@192.168.3.198:web/web-demo.git +refs/heads/*:refs/remotes/origin/* > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10 Checking out Revision b8f3be4385efdf64606158c23f9f1992bb2da1d3 (refs/remotes/origin/master) Commit message: "add www.chinasoft.com" > git config core.sparsecheckout # timeout=10 > git checkout -f b8f3be4385efdf64606158c23f9f1992bb2da1d3 > git rev-list b8f3be4385efdf64606158c23f9f1992bb2da1d3 # timeout=10 [web-demo] $ /usr/local/sonar-scanner/bin/sonar-scanner -e -Dsonar.host.url=http://192.168.3.199:9000/ -Dsonar.language=php -Dsonar.projectName=web-demo -Dsonar.projectVersion=1.0 -Dsonar.sourceEncoding=UTF-8 -Dsonar.projectKey=web-demo -Dsonar.sources=./ -Dsonar.projectBaseDir=/home/jenkins/.jenkins/workspace/web-demo INFO: Scanner configuration file: /usr/local/sonar-scanner/conf/sonar-scanner.properties INFO: Project root configuration file: NONE INFO: SonarQube Scanner 2.6.1 INFO: Java 1.8.0_111 Oracle Corporation (64-bit) INFO: Linux 3.10.0-514.el7.x86_64 amd64 INFO: Error stacktraces are turned on. INFO: User cache: /home/jenkins/.sonar/cache INFO: Load global repositories INFO: Load global repositories (done) | time=172ms WARN: Property 'sonar.jdbc.url' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database. WARN: Property 'sonar.jdbc.username' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database. WARN: Property 'sonar.jdbc.password' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database. INFO: User cache: /home/jenkins/.sonar/cache INFO: Load plugins index INFO: Load plugins index (done) | time=3ms INFO: SonarQube server 5.6.6 INFO: Default locale: "en_US", source code encoding: "UTF-8" INFO: Process project properties INFO: Load project repositories INFO: Load project repositories (done) | time=97ms INFO: Load quality profiles INFO: Load quality profiles (done) | time=34ms INFO: Load active rules INFO: Load active rules (done) | time=380ms WARN: SCM provider autodetection failed. No SCM provider claims to support this project. Please use sonar.scm.provider to define SCM of your project. INFO: Publish mode INFO: ------------- Scan web-demo INFO: Language is forced to php INFO: Load server rules INFO: Load server rules (done) | time=71ms INFO: Base dir: /home/jenkins/.jenkins/workspace/web-demo INFO: Working dir: /home/jenkins/.jenkins/workspace/web-demo/.sonar INFO: Source paths: . INFO: Source encoding: UTF-8, default locale: en_US INFO: Index files INFO: 0 files indexed INFO: Quality profile for php: Sonar way INFO: Sensor Lines Sensor INFO: Sensor Lines Sensor (done) | time=0ms INFO: Sensor SCM Sensor INFO: No SCM system was detected. You can use the 'sonar.scm.provider' property to explicitly specify it. INFO: Sensor SCM Sensor (done) | time=0ms INFO: Sensor Analyzer for "php.ini" files INFO: Sensor Analyzer for "php.ini" files (done) | time=3ms INFO: Sensor SonarJavaXmlFileSensor INFO: Sensor SonarJavaXmlFileSensor (done) | time=0ms INFO: Sensor Zero Coverage Sensor INFO: Sensor Zero Coverage Sensor (done) | time=0ms INFO: Sensor Code Colorizer Sensor INFO: Sensor Code Colorizer Sensor (done) | time=0ms INFO: Sensor CPD Block Indexer INFO: DefaultCpdBlockIndexer is used for php INFO: Sensor CPD Block Indexer (done) | time=0ms INFO: Calculating CPD for 0 files INFO: CPD calculation finished INFO: Analysis report generated in 47ms, dir size=8 KB INFO: Analysis reports compressed in 7ms, zip size=3 KB INFO: Analysis report uploaded in 47ms INFO: ANALYSIS SUCCESSFUL, you can browse http://192.168.3.199:9000/dashboard/index/web-demo INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report INFO: More about the report processing at http://192.168.3.199:9000/api/ce/task?id=AV0YJcbrykzBCcoFv4Mt INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS INFO: ------------------------------------------------------------------------ INFO: Total time: 43.045s INFO: Final Memory: 42M/137M INFO: ------------------------------------------------------------------------ Warning: you have no plugins providing access control for builds, so falling back to legacy behavior of permitting any downstream builds to be triggered Triggering a new build of web-demo_deploy Finished: SUCCESS |
1.6:pipeline插件: 1.6.1:#安装插件,系统管理-管理插件-可安装插件: 1.6.2:创建视图: 1.6.3:自定义名称: 1.6.4:配置pipeline信息,点击OK之后,弹出如下视图 点击保存之后显示的最终界面: from:https://www.cnblogs.com/reblue520/p/7131568.html?utm_source=itdadao&utm_medium=referral
View DetailsNet C#中枚举的声明格式如下所示:
1 |
[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;] |
FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。
1 2 3 4 5 |
enum MyFlags { Flag1, Flag2, Flag3, Flag4}; MyFlags myFlag = MyFlags.Flag2 | MyFlags.Flag3; Console.WriteLine(myFlag);//Flag4 |
因为对于整数来说,| 操作就是将其转化为二进制再进行或运算。Flags.Flag2 | Flags.Flag3做的工作实际上是 0001 | 0010 = 0011 = 3再转换成(MyFlags)3就是Flag4了 如果枚举声明如下:
1 2 3 4 5 6 7 |
[FlagsAttribute] enum MyFlags{ Flag1 = 0, //000 Flag2 = 1, //001 Flag3 = 2, //010 Flag4 = 4 //100 }; |
则上述结果为Flag2,Flag3,这样做的意义在于我们可以实现“或”的关系。 就上例而言,myFlag可以更直观的表现为011,因此当我们想要检验它满足哪个枚举值时我们可以使用&操作:
1 2 3 4 5 6 7 8 9 |
if((myFlag & MyFlags.Flag2) == MyFlags.Flag2) { Console.WriteLine("true"); } if((myFlag & MyFlags.Flag3) == MyFlags.Flag3) { Console.WriteLine("true"); } |
011&001 = 001,011&010 = 010,因此这两个if都会成立,这就是这种枚举的意义吧。另外我们应当注意默认初始化的myFlag的值为0,与其作&运算不会有任何结果。 from:https://blog.csdn.net/zhulongxi/article/details/52371853
View Details如果对一个值可以包含多个,那么可以使用枚举,加上Flags 本文告诉大家如何写一个 Flags。 在写前,需要知道一些基础知识,取反、或、与,如果不知道的话,请去看看基础。 当然,这些太复杂了,我也不会在这里解释。 假如有类型
1 2 3 4 5 6 7 8 |
[Flags] <span class="hljs-keyword">public</span> <span class="hljs-keyword">enum</span> Show { A = <span class="hljs-number">0x00000001</span>, B = <span class="hljs-number">0x00000010</span>, C = <span class="hljs-number">0x00000100</span>, D = <span class="hljs-number">0x00001000</span>, } |
合并多个值 合并多个,使用 |
1 |
<span class="hljs-operator"><span class="hljs-keyword">Show</span> <span class="hljs-keyword">show</span>=<span class="hljs-keyword">Show</span>.A | <span class="hljs-keyword">Show</span>.B</span> |
判断是否存在某个值 一个简单方法是用 HasFlag,但是一个方法是用 &
1 2 3 4 |
<span class="hljs-operator"><span class="hljs-keyword">Show</span> <span class="hljs-keyword">show</span>=<span class="hljs-keyword">Show</span>.A | <span class="hljs-keyword">Show</span>.B;</span> <span class="hljs-operator"><span class="hljs-keyword">show</span>.HasFlag(<span class="hljs-keyword">Show</span>.A);</span> //其他 bool 包含=(<span class="hljs-operator"><span class="hljs-keyword">show</span> & <span class="hljs-keyword">Show</span>.A)!=<span class="hljs-number">0</span>;</span> |
去掉一个值
1 2 |
<span class="hljs-operator"><span class="hljs-keyword">Show</span> <span class="hljs-keyword">show</span>=<span class="hljs-keyword">Show</span>.A | <span class="hljs-keyword">Show</span>.B;</span> <span class="hljs-operator"><span class="hljs-keyword">show</span>=<span class="hljs-keyword">show</span> & (~<span class="hljs-keyword">Show</span>.A);</span> |
取反一个值
1 2 3 4 5 6 7 8 9 10 |
<span class="hljs-operator"><span class="hljs-keyword">Show</span> <span class="hljs-keyword">show</span>=<span class="hljs-keyword">Show</span>.A | <span class="hljs-keyword">Show</span>.B;</span> bool 包含=(<span class="hljs-operator"><span class="hljs-keyword">show</span> & <span class="hljs-keyword">Show</span>.A)!=<span class="hljs-number">0</span>;</span> if(包含) { <span class="hljs-operator"><span class="hljs-keyword">show</span>=<span class="hljs-keyword">show</span> & (~<span class="hljs-keyword">Show</span>.A);</span> } else { <span class="hljs-operator"><span class="hljs-keyword">show</span>=<span class="hljs-keyword">show</span> | <span class="hljs-keyword">Show</span>.A;</span> } |
参见:http://www.cnblogs.com/jhxk/articles/1738831.html
View Details
1 2 3 4 5 6 7 |
jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译、打包、分发部署。jenkins可以很好的支持各种语言(比如:java, c#, <a class="replace_word" title="PHP知识库" href="http://lib.csdn.net/base/php" target="_blank">PHP</a>等)的项目构建,也完全兼容ant、maven、gradle等多种第三方构建工具,同时跟svn、git能无缝集成,也支持直接与知名源代码托管网站,比如github、bitbucket直接集成 jenkins服务器:192.168.239.134 测试服务器: 192.168.239.136 1.配置免密钥通信 实现自动化部署首先要解决的是免密码传输,配置jenkins至测试服务器之间免密钥ssh登录 |
测试免密钥ssh登录 在测试服务器上编写一个测试脚本,检测是否可以执行成功,正式环境可以写一个自动化部署的脚本
1 |
2.jenkins新建部署代码项目 |
在构建这里选择执行shell命令 点击立即构建 控制台输出日志:成功 这样就实现了使用jenkins代码的自动化部署 实际情况中我们通常使用版本控制系统管理代码,svn 或者 git 二、gitlab利用webhook实现push代码后jenkins自动构建 jenkins服务器:192.168.239.134 gitlab服务器: 192.168.239.136 PS:如果gitlab与jenkins在同一台服务器,需要更改其中一个的端口,默认都是8080 之前部署了gitlab的代码托管平台和jenkins代码发布平台,通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布。这种方式每次在发版的时候,需要人工去执行jenkins上的构建动作,有时显得过于繁琐。于是就想到了Gitlab的Webhook功能,通过Webhook的相关设置,可以实现代码Push后,自动去触发jenkins上的构建动作,这样就不需要人工干预去执行发版操作了 提前将jenkins本机的key添加到gitlab账户上 1.jenkins安装gitlab hook plugin插件 在auto_deploy项目工程里设置代码的git下载路径并关联构建的分支 查看jenkins生成回调地址,在任务构建触发器下获取回调URL,下面的URL那一行只有gitlab hook plugina插件下载成功后才能显示 设置代码发布的推送脚本 注意:这里使用192.168.239.136的test用户是与jenkins服务器已经配置了ssh免密钥登录
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash SOURCE_DIR=/root/.jenkins/workspace/${JOB_NAME}/ DEST_DIR=/var/www/html/ REMOTE_IP=192.168.239.136 /usr/bin/rsync -e "ssh -p 22" -avpgolr --delete-before --exclude=.git $SOURCE_DIR test@$REMOTE_IP:$DEST_DIR 通过上面的git将代码下载到jenkins本机jobs里对应任务的workspace下,jenkins部署路径是/root/.jenkins/workspace/,脚本中${JOB_NAME}是jenkins的内置变量 也可以指定下载目录,加--exclude忽略哪些文件不需要进行rsync传输 #!/bin/bash SOURCE_DIR=/data/git_tmpdata 再通过rsync将下载的代码分发到远程目标机器上 |
在192.168.239.136上创建/var/www/html/目录并授权test用户 mkdir /var/www/html/ -p && chmod -R test.test /var/www/html/ 在gitlab上添加webhooks(注意这里是管理员用户才能添加) Add Webhook添加完成后,在下方点击 test进行测试 如果返回Hook successfully executed.表示配置成功。 这样,下次push代码后,就会自动触发jenkins上相关的构建工程进行自动发布了!无需人工干预 在gitlab上push一个文件hello.py,然后测试下是否自动发布了 在jenkins上查看输出信息 在目标机器192.168.239.136的/var/www/html/目录下发现hello.py文件已经发布过来了 from:https://www.cnblogs.com/shansongxian/p/6605623.html
View Details比尔盖茨曾说过: “任何技术在一个业务中使用的第一条规则就是,将自动化应用到一个高效的操作上将会放大高效。第二条就是自动化应用到一个低效操作上,则放大了低效。” 过去几年的DevOps潮流似乎是那份声明强有力的经验性证据——而且数据好像也十分支持。一份企业管理联盟的调查报告指出,企业持续交付频率增长了10%,或者更多的是2.5倍,更可能经历两位数(≥10%)的收入。 可以肯定的说,你有很多必要的原因来做自动化。最大限度的提高效率和缩短反馈回路对于创建和维护一个竞争优势是至关重要的。为了帮助你启动,这是我们列出的21个你需要知道的自动化部署工具。 1 Jenkins 一个市场上持续交付(CD)和持续集成(CI)领先的工具,Jenkins是一个具有高扩展性和大型用户社区的自动化服务器。Jenkins在2011年从Oracle的Hudson-CI分叉 ,在开发人员社区的成员和Oracle间有一些大众意见表达分歧的时期。 2 ElectricFlow ElectricFlow 是一个发布自动化工具,提供免费的社区版本,你可以在VirtualBox上运行。 ElecticFlow支持大量插件和基于Groovy的 DSL,CLI,APIs。 3 Microsoft Visual Studio 微软DevOps产品的基础之一是 Visual Studio。 Visual Studio允许用户定义版本定义,自动化运行,跟踪版本等等。 4 Octopus Deploy Octopus Deploy创建的目的是为了.NET应用的自动化部署。你可以在一台服务器安装或在Azure里做个实例。 5 IBM UrbanCode 2013年公司被IBM收购,UrbanCode 自动化部署到本地或云环境。 6 AWS CodeDeploy Amazon的自动化部署工具CodeDeploy,有着令人印象深刻的特定客户名单、平台和语言无关。 7 DeployBot DeployBot 链接任何Git存储库,并且允许手动或自动部署到多种环境。DeployBot提供大量集成,包括通过Slack部署的能力。 8 Shippable Shippable 规定了它们自己的“DevOps支柱”和它们自己的CI平台,运行依靠称为minions的基于Docker的容器。 9 TeamCity TeamCity 是一个来自Jet Brains的CI服务器。TeamCity 有智能的配置功能和拥有官方Docker镜像服务器和代理。 10 Bamboo Bamboo Server 是CI,由来自在Atlassian的人们提供,他们是Jira和Confluence的制造者。Bamboo公布“integrations that matter”并提供一个“small teams”包,捐赠给 Room to Read慈善事业。 11 Codar Codar 是一个HP的持续部署解决方案。部署使用Jenkins触发。 12 CircleCI CircleCI 是一个CI解决方案,强调灵活性、可靠性和速度。CircleCI提供从资源到创建到部署的解决方案,并且支持大量的语言和应用。 13 Gradle Gradle 是一个被一些业内最有名的例如LinkedIn, Netflix, 和Adobe所使用的创建工具。Gradle使用Groovy创建脚本,按惯例构建框架,并认为构建工具同时作为Apache的Ant的通用工具。 14 Automic Automic 试图应用DevOps原理给一些后端应用,允许他们从已经在过去几年里许多前端、基于web的应用相同的实践上受益。 15 Distelli Distelli 专门在任何地方部署Kubernetes集群,除了可以在任何云或物理服务器上使用。根据TechCrunch这篇文章,Distelli 在2015年12月获得了280万美元的资金,是由前AWS员工Rahul Singh创立的。 16 XL Deploy XL Deploy 是一个来自XebiaLabs的应用发布自动化工具,支持大量插件和环境,使用无代理架构。 17 Codeship Codeship是服务器托管CI解决方案,通过原生Docker支持定制。 18 GoCD 一个CD服务器,强调可视化工作流,GoCD 是一个开源项目,由ThoughtWorks公司赞助。 19 Capistrano Capistrano 是一个开源部署工具,使用Ruby编程。Capistrano 文档具有脚本语言和“理智的,富有表现力的API。” 20 Travis CI Travis […]
View Details技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 OSChina:开源技术社区,开源方面做的不错哦 cnblogs,51cto,csdn:常见的技术社区,各有专长 stackoverflow:IT技术问答网站 GitHub:全球最大的源代码管理平台,很多知名开源项目都在上面,如Linux内核, OpenStack等免费的it电子书:http://it-ebooks.info/ DevStore:开发者服务商店 不错的书籍 人件 人月神话 代码大全2 计算机程序设计艺术 程序员的自我修养 程序员修炼之道 高效能程序员的修炼(成为一名杰出的程序员其实跟写代码没有太大关系) 深入理解计算机系统 软件随想录 算法导论(麻省理工学院出版社) 离线数学及其应用 设计模式 编程之美 黑客与画家 编程珠玑 C++ Prime Effective C++ TCP/IP详解 Unix 编程艺术 《精神分析引论》弗洛伊德 搞定:无压力工作的艺术 平台工具(都是开源的好东东哦) Redmine/Trac:项目管理平台 Jenkins/Jira(非开源):持续集成系统(Apache Continuum,这个是Apache下的CI系统,还没来得及研究) Sonar:代码质量管理平台 git,svn:源代码版本控制系统 GitLib/Gitorious:构建自己的GitHub服务器 gitbook:https://www.gitbook.io/写书的好东西,当然用来写文档也很不错的 Travis-ci:开源项目持续集成必备,和GitHub相结合,https://travis-ci.org/ 开源测试工具、社区(Selenium、OpenQA.org) Puppet:一个自动管理引擎,可以适用于Linux、Unix以及Windows平台。所谓配置管理系统,就是管理机器里面诸如文件、用户、进程、软件包这些资源。无论是管理1台,还是上万台机器Puppet都能轻松搞定。 Nagios:系统状态监控报警,还有个Icinga(完全兼容nagios所有的插件,工作原理,配置文件以及方法,几乎一模一样。配置简单,功能强大) Ganglia:分布式监控系统 fleet:分布式init系统 爬虫相关(好玩的工具) Phantomjs berserkJS(基于Phantomjs的改进版本) SlimerJS CasperJS selenium Web 服务器性能/压力测试工具/负载均衡器 http_load: 程序非常小,解压后也不到100K webbench: 是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力 ab: ab是apache自带的一款功能强大的测试工具 Siege: 一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。 squid(前端缓存),nginx(负载),nodejs(没错它也可以,自己写点代码就能实现高性能的负载均衡器):常用的负载均衡器 Piwik:开源网站访问量统计系统 ClickHeat:开源的网站点击情况热力图 HAProxy:高性能TCP /HTTP负载均衡器 ElasticSearch:搜索引擎基于Lucene Page Speed SDK和YSLOW HAR Viewer: HAR分析工具 protractor:E2E(end to end)自动化测试工具 Web 前端相关 GRUNT: js task […]
View Details