利用阿里云接口动态设置DDNS

因为公司没有购买公网IP,每次路由器重启后IP 就会变动,但是公司有很多服务器需要外网的回调进行开发调试!本来是使用的花生壳的动态域名解析,但是花生壳不争气啊,免费的动态服务,动不动就挂掉,不厌其烦!
还好阿里云的域名提供了接口更新DNS映射,并且阿里云的DNS修改后生效非常的快!
本着重来不干重复造轮子的事情,通过收索找到了一个可以动态通过接口修改IP的python源码  ,github地址https://github.com/terencechuen/terence_proj/tree/master/aliyun_ddns
我的centos服务器使用的是python2的环境,使用的下面这个版本的python代码
将此代码下载到linux 服务器,然后编辑源代码
# -*- coding: UTF-8 -*-
import json
import os
import re
import sys
from datetime import datetime
import requests
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \
DescribeDomainRecordInfoRequest
from aliyunsdkcore import client
access_key_id = “”
access_Key_secret = “”
# 请填写你的账号ID
account_id = “”
# 如果填写yes,则运行程序后仅显示域名信息,并不会更新记录,用于获取解析记录ID。
# 如果填写no,则运行程序后不显示域名信息,仅更新记录。
i_dont_know_record_id = ‘no’
# 请填写你的一级域名
rc_domain = ‘baidu.com’
# 请填写你的解析记录
rc_rr = ‘vpn’
# 请填写你的记录类型,DDNS请填写A,表示A记录
rc_type = ‘A’
# 请填写解析记录ID
rc_record_id = ‘3825227609856000’
# 请填写解析有效生存时间TTL,单位:秒
rc_ttl = ‘600’
# 请填写返还内容格式,json,xml
rc_format = ‘json’
def my_ip_method_1():
get_ip_method = os.popen(‘curl -s ip.cn’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_pattern = re.compile(r’\d+\.\d+\.\d+\.\d+’)
get_ip_value = get_ip_pattern.findall(get_ip_responses)[0]
return get_ip_value
def my_ip_method_2():
get_ip_method = os.popen(‘curl -s http://ip-api.com/json’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_responses = eval(str(get_ip_responses))
get_ip_value = get_ip_responses[‘query’]
return get_ip_value
def my_ip_method_3():
get_ip_method = requests.get(‘http://ifconfig.co/json’).content
get_ip_value = eval(get_ip_method)
get_ip_value = get_ip_value[‘ip’]
return get_ip_value
def check_records(dns_domain):
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_DomainName(dns_domain)
request.set_accept_format(rc_format)
result = clt.do_action_with_exception(request)
result = result.decode()
result_dict = json.JSONDecoder().decode(result)
result_list = result_dict[‘DomainRecords’][‘Record’]
for j in result_list:
print(‘Subdomain:’ + j[‘RR’].encode() + ‘ ‘ + ‘| RecordId:’ + j[‘RecordId’].encode())
return
def old_ip():
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest()
request.set_RecordId(rc_record_id)
request.set_accept_format(rc_format)
result = clt.do_action_with_exception(request).decode()
result = json.JSONDecoder().decode(result)
result = result[‘Value’]
return result
def update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl, dns_format):
clt = client.AcsClient(access_key_id, access_Key_secret, ‘cn-hangzhou’)
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_RR(dns_rr)
request.set_Type(dns_type)
request.set_Value(dns_value)
request.set_RecordId(dns_record_id)
request.set_TTL(dns_ttl)
request.set_accept_format(dns_format)
result = clt.do_action_with_exception(request)
return result
def write_to_file():
time_now = datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)
current_script_path = sys.path[1]
print current_script_path
log_file = ‘/root/ddns’ + ‘/’ + ‘aliyun_ddns_log.txt’
write = open(log_file, ‘a’)
write.write(time_now + ‘ ‘ + str(rc_value) + ‘\n’)
write.close()
return
if i_dont_know_record_id == ‘yes’:
check_records(rc_domain)
elif i_dont_know_record_id == ‘no’:
rc_value = my_ip_method_1()
print rc_value
rc_value_old = old_ip()
if rc_value_old == rc_value:
print(‘The specified value of parameter Value is the same as old’)
else:
print(update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format))
write_to_file()
 
执行改脚本
[root@localhost ddns]# python AliyunDDNS_NonSDK.py
[#180328-15:19] DNS Record was updated from [1797x1q502.imwork.net] to [171.217.104.245].
 
 
 

Jenkins在Windows上构建项目

一、为Jenkins添加Windows节点


 



这里需要填写远程工作目录,启动方法一项一定要选择“Launch agent via Java Web Start“一项,其它的保持默认。启动项:“Launch agent via Java Web Start“可能会不可选,如果不可选则需要在“Configure Global Security”中进行配置

配置好后,在左侧的导航栏中点开刚才配置的节点会出现如下图所示的内容

此时Windows的节点已经添加完成,只需要在Slave主机上按上图所示命令行开启Java程序即可。
二、为Jenkins添加编译项目



这里可以设置定时构建,如图所示为每天早上的6点钟开始执行构建。

 
然后点击“增加构建步骤”,选择“Execute Windows batch commmand”指令,再在如下图所示的命令框中添加所需要的批处理命令。

jenkins内部参数传递

场景一: Job构建步骤间的变量传递
Jenkins提供了数十种构建方式,我们以最常用的『Execute shell』为例。有时为了使Job中的复杂的构建流程更加清晰我们配置多个构建步骤像下面这样。图中包含两个构建步骤,步骤2需要根据步骤1中的返回值来判断是否执行操作:
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team
执行时jenkins将两个构建步骤生成两个shell文件,然后分别调用。

do_build_step_1

[Jenkins] $ /bin/bash -xe /tmp/hudson1270042613896791809.sh
do_build_step_2

[Jenkins] $ /bin/bash -xe /tmp/hudson5918908417824291692.sh
理论上两个shell之间是无法通信的,step1执行完之后变量$dostep2就会被回收,要注意试图在step1中通过export或者其他脚本方式注入环境变量都是无效的。
解决方案:读写文件
要实现它们之间的变量传递只能通过读写文件的方式。我们有一个真实应用场景是这样的,配置由git push触发编译任务,但是并不是每一次git的提交都需要触发编译,比如说只有前端代码的提交其实并不影响编译的结果,我们只好在step1中加入判断来却确定step2是否真的有必要被执行。
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team
场景二: Job之间的变量传递
现在有两个Project『run_compile』和『run_deploy』,代码编译成功后开始执行环境部署。不需要传递参数的情况下可以选择“Build other projects“的方式。
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team
需要传递参数则需要选择”Trigger parameterized build on other projects”的方式。

[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team

Jenkins Parameterized Trigger plugin可以实现Job间参数传递但是有局限性,我们只能选择传递当前build的参数或者环境变量。 (例:$GIT_COMMIT是git plugin提供的一个变量,存着当前build触发时最新的git code.) 如果要传递一个自定义的变量怎么办呢? 构建步骤中的自定义变量在执行结束后都会被回收,我们不可能在”predefined parameters”中取到。
依旧以编译任务为例,前端代码的提交不需要触发编译,没有编译也就不需要执行接下来的『run_ut』单元测试。(泛指后台代码的UT, JS UT这种稀有存在暂不考虑)
如何将编译的状态告诉下游的单元测试呢?
聪明的你想起了场景一的解决办法。对,我们也可以通过读写文件的方式来解决这个问题嘛!
不过这里我不推荐大家采用这种方式,理由有两点:
一,『run_compile』和『run_ut』有可能被部署在不同slave上,如果考虑更加智能的CI配置方式会在构建时动态的选择空闲的slave去执行,这种文件读写的方式就有了很大的局限性;
二,很难确保文件传递的准确性,如果『run_compile』写入文件失败,『run_ut』中读到的就是一个旧值一个不准确的值。
解决方案一:通过properties file的方式传递参数。
首先将变量以”xx=xx”的样式写入到配置文件『propfile.txt』中。
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team
然后在”Trigger parameterized build on other projects”中选择”Parameters from preperties file”,在propfile里写入多个变量就可以传递多个值。
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team

建议勾选”Don’t trigger if any files are missing”和删除旧文件配合使用。

最后在『run_ut』中可以直接获取这个变量来使用了。
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team
解决方案二: 通过EnvInject Plugin插件
EnvInject Plugin可以支持修改、注入和删除环境变量。
我们在构建中增加步骤”Inject environment variables”, 将写在配置文件中的变量${IFUT},注入到环境变量里。
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team
这样在”Trigger parameterized build on other projects”就可以直接选择”predefined parameters”方式直接传递变量了。同样的在Job『run_deploy』里就可以直接访问变量${IFUT}了。
[Jenkins]Job中如何传递自定义变量 - 网易杭州QA - 网易杭州 QA Team

本次要分享的内容就这么多。

最后有一个槽点:
为什么jenkins不支持根据条件判断来决定是否触发下一个Project呢?
实际上我最希望的是当ifut=false的时候就直接不触发『run_ut』,『run_ut』不被触发也就省去了不少无用功。

Jenkins内置环境变量

一、查看Jenkins有哪些环境变量
1、新建任意一个job
2、增加构建步骤:Execute shell 或 Execute Windows batch command
3、点击输入框下方的“可用环境变量”

4、可以看到有如下变量供使用:

变量名 解释
BUILD_NUMBER The current build number, such as “153”
BUILD_ID The current build ID, identical to BUILD_NUMBER for builds created in 1.597+, but a YYYY-MM-DD_hh-mm-ss timestamp for older builds
BUILD_DISPLAY_NAME The display name of the current build, which is something like “#153” by default.
JOB_NAME Name of the project of this build, such as “foo” or “foo/bar”. (To strip off folder paths from a Bourne shell script, try: ${JOB_NAME##*/})
BUILD_TAG String of “jenkins-${JOB_NAME}-${BUILD_NUMBER}”. Convenient to put into a resource file, a jar file, etc for easier identification.
EXECUTOR_NUMBER The unique number that identifies the current executor (among executors of the same machine) that’s carrying out this build. This is the number you see in the “build executor status”, except that the number starts from 0, not 1.
NODE_NAME Name of the slave if the build is on a slave, or “master” if run on master
NODE_LABELS Whitespace-separated list of labels that the node is assigned.
WORKSPACE The absolute path of the directory assigned to the build as a workspace.
JENKINS_HOME The absolute path of the directory assigned on the master node for Jenkins to store data.
JENKINS_URL Full URL of Jenkins, like http://server:port/jenkins/ (note: only available if Jenkins URL set in system configuration)
BUILD_URL Full URL of this build, like http://server:port/jenkins/job/foo/15/ (Jenkins URL must be set)
SVN_REVISION Subversion revision number that’s currently checked out to the workspace, such as “12345”
SVN_URL Subversion URL that’s currently checked out to the workspace.
JOB_URL Full URL of this job, like http://server:port/jenkins/job/foo/ (Jenkins URL must be set)

 
二、使用Jenkins的内置变量
1、在Execute shell 或 Execute Windows batch command文本框中使用,使用方法:%变量名%,如下图

2、结合Ant,在build.xml文件中使用:
1、添加如下第4行代码:<property environment=”env”/>
2、使用方法:${env.WORKSPACE}

 1 <?xml version="1.0" encoding="UTF-8"?>
 2
 3 <project name="ant-test" default="run" basedir=".">
 4     <property environment="env"/>
 5
 6     <target name="clean">
 7         <mkdir dir="${env.WORKSPACE}/results/${env.BUILD_ID}" />
 8     </target>
 9
10 </project>

linux 上安装jenkins

基本配置:

1、Linux安装配置jdk环境

1.1、上传到 Linux 服务器;例如:

上传至: cd /usr/local

1.2、解压:

rpm -ivh jdk-8u111-linux-x64.rpm

1.3、环境变量配置

cd /etc

在etc下,找到 profile文件,增加如下如下配置:

#set java environment

JAVA_HOME=/usr/java/jdk1.8.0_111

CLASSPATH=.:$JAVA_HOME/lib.tools.jar

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME CLASSPATH PATH

1.4 、配置生效

source /etc/profile

2、Linux安装配置maven环境

2.1、上传maven到 /usr/local 下

2.2、解压:

tar -zxvf apache-maven-3.3.9-bin.tar.gz

2.3、配置环境变量

进入etc目录下找到profile文件,增加如下环境变量配置:

#set maven environment

MAVEN_HOME=/usr/local/apache-maven-3.3.9

export MAVEN_HOME

export PATH=${PATH}:${MAVEN_HOME}/bin

2.4 、配置生效

source /etc/profile

2.5、查看配置是否成功

mvn -v

2.6、如果抛出权限不够,例如

-bash: /usr/local/apache-maven-3.3.9/bin/mvn: Permission denied

2.7、给maven授权

chmod a+x /usr/local/apache-maven-3.3.9/bin/mvn

3、Linux安装tomcat

3.1、上传至 /usr/local 目录下

3.2、解压

tar -zxvf apache-tomcat-7.0.75.tar.gz

3.3、修改tomcat端口号

找到 tomcat–>config–>server.xml

打开server.xml后修改【8005、8080、8009】其中8080为tomcat的端口号

第22行:8005

第71行:8080

第93行:8009

3.4、增加tomcat用户【用于jenkins部署发布用】

找到tomcat–>config–>tomcat-users.xml

打开后在<tomcat-users></tomcat-users>之间增加如下用户信息:

<role rolename=”admin-gui”></role>

<role rolename=”admin-script”></role>

<role rolename=”manager-gui”></role>

<role rolename=”manager-script”></role>

<role rolename=”manager-jmx”></role>

<role rolename=”manager-status”></role>

<user username=”admin” password=”admin” roles=”manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui”/>

4、Linux配置并启动 jenkins

4.1、上传jenkins.war到tomcat–>webapps下

4.2、进入tomcat–>bin目录下,使用Linux命令启动tomcat

./startup.sh

4.3、根据tomcat所在服务器ip地址和tomcat路径来访问jenkins项目

例如:http://IP:8087/jenkins

4.4、首次进入jenkins如要输入密码,密码位置:/root/.jenkins/secrets/initialAdminPassword

4.5、进入选择插件安装界面,选择第一个(Install suggested plugins)

 

4.6、插件安装完成之后,需要创建第一个用户,建议统一使用test或者admin

 

4.7、创建用户之后,就可以使用jenkins了

 

4.8、点击start using jenkins 进入jenkins

 

4.9、配置jenkins需要的maven、jdk路径

    详情见截图:《1、全局环境配置.png》

 

4.10、配置安装插件

jenkins plugin

需要安装的插件:

发布插件 Deploy to container Plugin 必须

•Maven插件 Maven Integration plugin必须

•git插件 Git plugin 这个根据实际情况,我用的是svn

•svn插件 Subversion Plug-in 这个jenkins自带已经安装过了,推荐安装时有显示

非必须安装插件:

•发送邮件插件 Email Extension Plugin

5、项目配置:【详情见截图:2、jenkins项目配置.png】

   

5.1、配置svn项目地址和用户名密码

repossitory url为svn地址,下面有一个add按钮,填写svn用户名密码后保存

然后下拉选择,刚才配置的那个用户

5.2、配置清理并选择maven

root pom 中填写:pom.xml

goals and options中填写:clean install

5.3、配置maven清理

点击“add post-build step”选择“invoke top-level maven targets”

maven version选择maven(该maven是全局环境变量时配置的)

goals 中填写:clean package

5.4、配置部署容器

点击“增加构建后操作步骤”选择 “deploy war/ear to a container”

由于maven项目的war包是在target下,故下target/项目名.war

content path为访问路径

5.5、配置tomcat

点击“and container”添加容器,选择tomcat

由于我的是tomcat7故选择tomcat7

manager user name:填写配置tomcat-user对应的用户名

manager password:填写配置tomcat-user对应的密码

tomcat url :填写配置tomcat-user这个tomcat对应的服务器地址和该tomcat的端口号

例如:http://ip:tomcat端口号