分类: IT小常识

  • jenkins2.220下的dingtalk2.0.0

    这一版dingtalk插件发生了重大升级,以至于升级之后我一直以为不兼容,无法工作了,考虑降级测试,后来一直点到dingtalk的源代码地址,才发现是配置确实变了。怎么就不能在里面提示一下呢?

    dingtalk插件的地址:https://plugins.jenkins.io/dingding-notifications/

    github的地址:https://github.com/jenkinsci/dingding-notifications-plugin

    注意源代码那里的使用说明:

    1.在 系统管理 > 系统设置 > 钉钉配置 中添加机器人 全局配置 -> 测试
    经测试,钉钉机器人的安全策略配置的选项属于与 关系,即如果勾选了多个策略,则需要同时满足。 所以,插件的配置最好与钉钉机器人上保持一致。

    2.在项目配置页面中勾选机器人 项目配置 测试

    其中需要设置name,在具体的job任务中可以看见这个名字,就可以勾选了。

    id空着,保存的时候由插件自己生成。

    webhook就是钉钉中机器人的地址。

    下面就是安全设置,这个不清楚为什么还有需要,暂时按照钉钉里机器人的配置一样填的。

    然后点test成功,钉钉群里收到消息。

  • 用jenkins获取git change log推送给钉钉机器人

    背景:为了将代码提交的记录推送到钉钉群,我们可以使用钉钉自定义机器人这个功能,关于钉钉机器人这里不解释,请查阅官方文档。本来用aliyun code管理代码时可以使用webhook快捷设置钉钉机器人,但迁移到百度效率云的icode之后,暂时失去了webhook这个功能。

    以下介绍解决办法:(以下内容来自https://twiceyuan.com/2017/02/21/jenkins-changelog/

    Jenkins 每次构建都会根据 git 的提交记录生成一个 web 页面来显示自上次构建之后的提交记录列表。在配置 CI 工作流时,很多情况需要获取这个提交记录的 String 值,但是 Jenkins 并没有提供这个功能。

    Jenkins 官方反馈中有人也提出了这一需求:https://issues.jenkins-ci.org/browse/JENKINS-12032 。下面有人给出了一个插件来解决,插件地址:https://github.com/daniel-beck/changelog-environment-plugin ,不过作者没有编译上传到 jenkins 的插件中心,也没有文档说明怎么使用,这里简单介绍一下。

    首先项目拉到本地,在项目根目录执行 mvn verify 就可以编译生成我们需要的 hpi 插件文件了(编译需要很多依赖,第一次可能会比较漫长)。之后在 Jenkins 中管理插件的高级(Advanced)中,选择上传 hpi 文件,就可以安装成功了。你也可以直接下载我编译好的

    点击下载

    安装成功以后,在项目配置的 Build Environment 环节,会多出一个选项:Add Changelog Information to Environment。下面有三个编辑框,分别是:Entry Format、File Item Format 和 Date Format。第一个就是填写提交日志输出格式的地方,采用的是 Java String.format 占位符的形式。其中可以使用四个参数,分别是:

    1. 提交的作者
    2. 提交的 ID
    3. 提交信息
    4. 提交时间(通过 Date Format 控制格式)

    例如,我在 Entry Format 输入 %3$s (at %4$s via %1$s)\n,然后有一条在 2017-02-10 的提交记录,提交信息为「fix bug」,提交者为 twiceYuan,那么输出到环境变量的字符串就是 “fix bug (at 2017-02-10 via twiceYuan)\n” (后面的 \n 是为了多层转义,视使用情况请自行调整),同样时间格式编辑框填写的是:yyyy-MM-dd。

    通过设置之后,在构建时就可以通过 shell 中来获得 SCM_CHANGELOG 变量来取到更新日志了。比如自动上传更新信息到内测平台。

    (内容引用完毕)

    shell中的命令如下:

    curl ‘https://oapi.dingtalk.com/robot/send?access_token=87980355c9069b2d0eba095480dcead5’ \
    -H ‘Content-Type: application/json’ \
    -d “{‘msgtype’: ‘text’, ‘text’: {‘content’: \”${SCM_CHANGELOG}\”}}”

    请留意以上命令中的引号可能被我的博客编辑器给换掉,请对照图片检查。

  • 微版云是如何用vue-electron构建mac客户端的

    如何初始化项目暂且不说,请看vue-electron的官方文档。

    先给大家看一下package.json的部分配置:

    “main”: “dist/electron/electron.js”,
      “build”: {
        “appId”: “ink.weiban.portal”,
        “productName”: “WeiBan”,
        “copyright”: “Copyright © 2019 北京商连信息科技有限公司”,
        “directories”: {
          “output”: “./outapp”,
          “app”: “./dist”
        },
        “win”: {
          “target”: [
            “nsis”
          ],
          “icon”: “./static/ico/favicon256.ico”,
          “artifactName”: “${productName}-Setup.${ext}”,
          “publisherName”: “WeiBan”,
          “signingHashAlgorithms”: [
            “sha256”
          ],
          “signDlls”: true,
          “rfc3161TimeStampServer”: “http://timestamp.digicert.com”,
          “certificateFile”: “./static/codeSign/windows/shanglian.pfx”,
          “certificatePassword”: “shanglian”
        },
        “linux”: {
          “target”: [
            “AppImage”
          ],
          “artifactName”: “${productName}.${ext}”
        },
        “mac”: {
          “target”: [
            “dmg”
          ],
          “icon”: “./static/ico/favicon.icns”,
          “artifactName”: “${productName}.${ext}”
        },
        “nsis”: {
          “createDesktopShortcut”: “always”
        },
        “publish”: {
          “provider”: “s3”,
          “bucket”: “electron-app”,
          “endpoint”: “https://electron-app.s3.cn-north-1.amazonaws.com.cn”
        }
      },
      “scripts”: {
        “dev”: “webpack-dev-server –inline –progress –config build/webpack.dev.conf.js”,
        “start”: “npm run dev”,
        “unit”: “jest –config test/unit/jest.conf.js –coverage”,
        “e2e”: “node test/e2e/runner.js”,
        “test”: “npm run unit && npm run e2e”,
        “lint”: “eslint –ext .js,.vue src test/unit test/e2e/specs”,
        “build”: “node build/build.js”,
        “build-electron-dev”: “node build/build-electron-dev.js”,
        “build-electron-prod”: “node build/build-electron-prod.js”,
        “dir”: “electron-builder –dir”,
        “win32”: “electron-builder –win –ia32”,
        “win64”: “electron-builder –win –x64”,
        “mac”: “electron-builder –mac”,
        “linux”: “electron-builder –linux”
      },

    构建mac的客户端之前首先要将vue构建好,即运行:

    npm run build-electron-prod

    然后运行:

    sudo yarn mac

    之所以要加sudo是yarn用到一些系统目录,不加会报错。(关于如何安装yarn请看官网)

    yarn run v1.17.3
    $ electron-builder –mac
    • electron-builder version=21.1.1 os=18.7.0
    • loaded configuration file=package.json (“build” field)
    • writing effective config file=outapp/builder-effective-config.yaml
    • packaging platform=darwin arch=x64 electron=5.0.6 appOutDir=outapp/mac
    • signing file=outapp/mac/WeiBan.app identityName=Developer ID Application: Beijing Shanglian Information Technology Co., Ltd. (R65P3V6H9V) identityHash=BA45718278F5E4268071035C88A48F38A2271B1C provisioningProfile=none
    • building target=DMG arch=x64 file=outapp/WeiBan.dmg
    • building block map blockMapFile=outapp/WeiBan.dmg.blockmap
    ✨ Done in 22.15s.

    这个时候已经可以看到Weiban.dmg文件已经构建成功。但是还不能直接发布,mac是不能运行的。

    接下来要做的最重要的一件事就是通过Notarize Your Preexisting Software。链接这里讲的很清楚,但有几个关键步骤着重强调一下。

    XCode用最新版,这个不用犹豫,直接更新并安装。

    然后设置开发者证书,里面有各种授权和证书,这里不再赘述,请找熟悉的开发者当面请教,比较关键的是两个:(1)生成Developer ID Application证书,并部署到当前的mac中。(2)注册mac客户端,Identifiers中添加一个macOS类型的。

    接下来就可以进入官方引导中的上传这一步了,就是把打包好的dmg上传给苹果。

    官方给的命令(点击该地址可以获取准确的命令,复制以下内容有可能会造成字符偏差)是:

    xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip

    我们要修改其中的一些内容,比如改成:

    xcrun altool –notarize-app –primary-bundle-id “ink.weiban.mac.word” –username “fymeng@51shanglian.com” –password “@keychain:AC_PASSWORD” –file DFS/DFS-portal/outapp/WeiBan.dmg

    其中,ink.weiban.mac.word就是在开发者账户中设置的Identifiers的Bundle ID,fymeng@51shanglian.com就是AC_USERNAME,而密码我保留了@keychain:AC_PASSWORD这个赋值,意思就是让命令去我的本机的钥匙串中调用AC_PASSWORD中存储的密码。为了实现这个效果,需要提前将密码存到钥匙串中,命令是:

    security add-generic-password -a "fymeng@51shanglian.com" -w <密码我也不会告诉你的> -s "AC_PASSWORD"

    当然,fymeng@51shanglian.com这个帐号需要有权限,在这里检查或者添加https://itunesconnect.apple.com/access/users ,最小权限应该是开发人员,要包括上传构建版本这个权限。

    另外值得注意的是如果fymeng@51shanglian.com这个帐号开启了二次验证,命令行是不能直接用的,需要到苹果官网新建一个设备密码,上面保存到钥匙串的应该是这个设备密码,如果没有启用二次验证,则可以直接用登录密码。这个命令行会报错。

    还有一个,命令行报错说某帐号已经关联了其他任务,那就新建一个专用帐号吧,反正不要钱。

  • 如何以正确的姿势激活百度效率云

    百度效率云的具体介绍就不说了,之前是冲着icafe来的,用过一段时间,因为数据无法导出,也不方便把目前用的mantis替换掉,所以一度弃用。

    现在产品发布了,面临更严重的用户需求收集和处理问题,在产品比较弱的时候,如果不能更好地把握这些需求的先后和强弱,很容易导致产品开发崩溃。icafe从story到task的过渡处理的还算不错,现在又延伸出一个效率云系列产品,按理说算是不错的敏捷开发平台了。

    尽管百度说效率云是按用户收费,目前免费测试,让我有一些担忧,不过用一用也无妨,吸收一些可取之处,也为自己的协作产品找到一些灵感。

    不过在初始化账户的过程中,遇到了很多困惑,以至于求助于客服依然没有解决,对接的客户经理对效率云基于没有了解,似乎是我提起她才知道。

    好了,废话不多说了,下面列一下建议的步骤。假设你之前没有任何百度系的帐号的话,有的话也尽量忽略,百度系的帐号可不是那么容易注销的。

    (1)创建公司/团队帐号。

    https://login.bce.baidu.com/reg.html?tpl=bceplat&from=portal

    建议使用以上链接直接创建百度云的帐号,百度云和百度智能云貌似是一个东西。为了方便起见,用户名建议使用公司全名,不要用自己偏好的东西,因为这个帐号无法变更主帐号,也就是基本上无法移交,只能变更绑定的手机号和邮箱。再说一遍,建议用企业全名作为用户名。

    (2)登录以后在百度云一大堆产品里面找到效率云,创建的时候有个团队名称,建议也用公司全名,下面分配一个空间地址,用公司缩写字母之类比较好,一旦创建,不能修改,也要慎重,而且是全局唯一,不能跟别人重。

    (3)进入效率云以后创建一个新的项目,第一个问题就是邀请团队了。找到效率云的项目设置(在左下角),找到“通用设置-权限管理”,邀请用户,这时填写的是被邀请人的邮箱,之所以这样是因为原来icafe单独部署的时候可以不依赖于百度帐号体系,就是用邮箱登录即可。假设你邀请的邮箱是fymeng@51shanglian.com,那么这个邮箱会收到一封邮件。

    (4)被邀请人进入fymeng@51shanglian.com,点击邮件中的链接,提示初始化自己的密码,按照要求填写即可,然后自动登录。

    (5)被邀请人激活的是一个子帐号,与用fymeng@51shanglian.com这个邮箱注册百度云帐号无关。那么当前子帐号注销了以后如何登录呢,需要请管理员照一下子帐号登录地址,管理员帐号下打开帐号控制区的多用户访问控制,会发现用户管理中的子帐号中已经有fymeng了。然后子帐号列表上方就是子帐号登录的地址,比如http://a3630175ee3744039c854eabf1d33456.login.bce.baidu.com,这里肯定不方便记忆,所以百度很贴心的给了自定义的功能,所以就可以设置为http://shanglian.login.bce.baidu.com,当然这个地址依然还是很难记的,那就需要用自己的域名解析了,比如显性URL转发。

    (6)最后补充一点,子帐号登录的时候默认是用邮箱前面那个名字比如fymeng。这个可以在子帐号管理看见到底是什么。

  • 如何使用s3cmd批量修改aws s3上的文件Content-type

    首先,使用aws官方的批量处理是可以的,至少官方是这么说的,不过做文件清单然后执行,可能适合比较大量的文件。

    现在用s3cmd处理可能是比较直观的方案。mac上安装s3cmd比较简单。只需要brew install s3cmd即可。安装比较慢的话设置一下brew的国内镜像源,方法:https://www.cnblogs.com/crayfish/p/6003862.html

    (1)s3cmd –version看看版本对不对,最好是2.0以上。

    (2)s3cmd –configure启动配置引导,按提示依次输入key,没有的话去aws生成一个。

    (3) s3cmd –mime-type=image/jpeg –recursive  –exclude=* –include=*.jpg modify s3://your-bucket 这就是批量的命令了。看起来还是很简单的。设置参数需要注意顺序,尤其是一定要先exclude再include,否则起不到筛选文件类型的效果,recursive保证你可以遍历bucket下的所有文件,而不是只能修改某个object的元数据。–include=*.jpg这里留意大小写,如果你的文件里有大写后缀名,需要–include=*.JPG也来一遍。

  • Laravel 框架 MySQL 运行报错: PDOStatement::execute (): MySQL server has gone away?

    项目什么都没动,突然发现无法连远程的数据库了,只能连本地的,折腾了半天,连本地的都连不上了,简直像遇到了奇异事件。

    用java程序连了一下,默认连不上,需要把usessl设为false,但是php对应的sslmode设为disable并不起作用。

    尝试修改wait_timeout和connect_timeout也都无效,只是让等待的时间更长了。

    直到在老同事刘明的提醒下,去查看laravel的日志,发现了这么一句:Unexpected server respose while doing caching_sha2 auth

    于是,按这个问题去搜索,找到了https://www.cnblogs.com/qichao123/p/9719470.html

    进到mysql,通过SELECT user,host,plugin FROM mysql.user;

    确认我用的当前用户没问题,是mysql_native_password,于是继续配置my.cnf中的mysqld,添加:

    default_authentication_plugin=mysql_native_password

    回来测试成功。

  • 部署自己的ngrok1.7服务

    非常感谢https://hteen.cn/docker/docker-ngrok.html

    我的服务器是ubuntu,首先登录服务器,依次运行以下命令:

    docker pull hteen/ngrok
    mkdir /root/ngrok
    docker run --rm -it -e DOMAIN='tunnel.yourdomain.cn' -v /root/ngrok:/myfiles hteen/ngrok /bin/sh /build.sh
    docker run -idt --name ngrok-server -v /root/ngrok:/myfiles -p 8082:80 -p 4432:443 -p 4443:4443  -e DOMAIN='tunnel.yourdomain.cn' hteen/ngrok /bin/sh /server.sh

    运行结果显示一个token
    这样,在服务器的/root/ngrok目录下则有
    bin/ngrokd 服务端
    bin/ngrok linux客户端
    bin/darwin_amd64/ngrok osx客户端
    bin/windows_amd64/ngrok.exe windows客户端
    还要增加一个nginx的站点配置,转发请求


    server {
    listen 80;
    server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
    location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://serverlocalip:8082;
    }
    }
    server {
    listen 443;
    server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
    location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://serverlocalip:4432;
    }
    }

    在本地电脑执行命令,下载对应的客户端,我的是mac,所以:
    scp -i meixi.pem root@yourip:/root/ngrok/bin/darwin_amd64/ngrok ~/ngrok
    然后在本地创建ngrok.yml文件,并填入以下内容:


    server_addr: "tunnel.yourdomain.cn:4443"
    trust_host_root_certs:false
    tunnels:
    weixin:
    proto:
    http:8080
    subdomain:"wx"
    api:
    proto:
    http:80
    subdomain:"api"

    然后在本地执行
    ~/ngrok –config=ngrok.yml start weixin api
    就启动了。
  • 过了这么久才遇到github资源域名被污染的情况

    上周打开github突然发现样式无法加载,打开vpn才行,后来搜索才知道这个情况已经存在好多年了,不是封禁IP,而是DNS污染,这种情况适用自行定义hosts的方法。

    即,在hosts文件中定义如下关系。

    151.101.24.133 assets-cdn.github.com

  • 使用iview的upload组件上传阿里oss的参数设置

    下面是组件设置:

    <Upload action="http://public.files.dpexpo.cn"
    ref="upload"
    :show-upload-list="false"
    accept=".pdf"
    :format="['pdf']"
    :on-success="uploadSuccess"
    :data="uploadParams"
    :max-size="102400"
    :before-upload="handleBeforeUpload">
    <Buttontype="ghost"
    icon="ios-cloud-upload-outline">Upload pdf</Button>
    </Upload>
    以下是相关的js方法:

    handleBeforeUpload(file) {
    letthat=this;
    return new Promise(function(resolve, reject) {
    that.getUploadParams().then(function() {
    that.$Notice.warning({
    title:'文件准备上传',
    desc:'文件 '+file.name+' 准备上传。',
    duration:3
    });
    resolve();
    });
    });
    },
    getUploadParams() {
    varthat=this;
    return new Promise(function(resolve, reject) {
    that.$http// 在此方法中调用后台数据
    .get('/ossParams', {
    params: {
    dir:
    'slide/conference/'+
    that.$route.query.conference_id+
    '/'
    }
    })
    .then(function(response) {
    console.log(response);
    that.uploadParams=JSON.parse(response.data.data);
    console.log(that.uploadParams);
    resolve();
    })
    .catch(function(error) {
    console.log(error);
    });
    });
    },
    uploadSuccess(evnet, file) {
    console.log(file);
    this.$Notice.success({
    title:'文件上传成功',
    desc:'文件 '+file.name+' 上传成功。',
    duration:3
    });
    this.formValidate.slide_url=
    'http://public.files.dpexpo.cn/slide/conference/'+
    this.$route.query.conference_id+
    '/'+
    file.name;
    },

    以下是发放参数的api方法(laravel):

    public function ossParams(Request $request)
    {
    $id = 'LTA(your id)V1E';
    $key = '4M5nIHs(your key)IelsW';
    $host = 'http://public.files.dpexpo.cn';
    $now = time();
    $expire = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问
    $end = $now + $expire;
    $expiration = $this->gmt_iso8601($end);
    $dir = $request->dir ? $request->dir : 'user-dir/';
    //最大文件大小.用户可以自己设置
    $condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
    $conditions[] = $condition;
    //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
    $start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
    $conditions[] = $start;
    $arr = array('expiration' => $expiration, 'conditions' => $conditions);
    //echo json_encode($arr);
    //return;
    $policy = json_encode($arr);
    $base64_policy = base64_encode($policy);
    $string_to_sign = $base64_policy;
    $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));
    $response = array();
    //$response['host'] = $host;
    $response['key'] = $dir.'${filename}';
    $response['policy'] = $base64_policy;
    $response['OSSAccessKeyId'] = $id;
    $response['Signature'] = $signature;
    $response['expire'] = $end;
    //这个参数是设置用户上传指定的前缀
    //$response['dir'] = $dir;
    $token = json_encode($response);
    return$this->response->array(['data' => $token]);
    }

  • Visual Studio Code中使用Docker中的Xdebug

    开发环境说明

    IDE:Visual Studio Code

    DNMP:https://github.com/yeszao/dnmp

    项目:laravel

    开启xdebug

    修改dnmp/php/php72/Dockerfile,添加以下两行(插在带\的任一一行后面即可,查看dockerfile编写规范):

    && pecl install xdebug \
    && docker-php-ext-enable xdebug \
    修改dnmp/config/php.ini,在文件末尾添加以下内容:
    [xdebug]
    zend_extension=xdebug.so
    xdebug.remote_port=9000
    xdebug.remote_enable=1
    xdebug.remote_host=192.168.0.102
    xdebug.remote_autostart=1
    xdebug.remote_log="/var/log/dnmp/xdebug.log"

    其中192.168.0.102就是你的电脑的IP,也就是docker宿主机的IP,docker的端口都挂到宿主机IP上。xdebug默认是localhost,不改就访问不到了。也不要打开

    xdebug.remote_connect_back=1,这会使得remote_host配置失效。
    在vscode中安装PHP Debug插件,在调试选项卡中打开齿轮配置,即当前项目的.vscode/launch.json,对照以下内容配置:
    
    {
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Listen for XDebug",
    "type": "php",
    "request": "launch",
    "port": 9000,
    "pathMappings":{
    "/var/www/html": "${workspaceRoot}"
    }
    },
    {
    "name": "Launch currently open script",
    "type": "php",
    "request": "launch",
    "program": "${file}",
    "cwd": "${fileDirname}",
    "port": 9000
    }
    ]
    }
    其中,/var/www/html是你在dnmp/www中的site的位置,如果有子目录则填到子目录级别,这里的pathMappings是最新的写法。
    在dnmp目录启动:docker-compose up
    在vscode按F5启动调试,记得打上断点,祝你成功。
    如果已经生成过容器,则需要删除容器,删除镜像。重新生成dnmp-php命令如下:
    docker rm dnmp-php
    docker rmi dnmp_php
    docker-compose up