曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

Jenkins多节点同步CocoaPods索引

CocoaPods的索引库更新一直以来是一件很痛苦的事情,为了提升效率在项目中引入了镜像索引库的方案,将项目用到的第三方库的podspec配置自动抽取到一个镜像索引库里面。这个方案确实降低了大家在同步索引库的耗时,但是在构建环境下存在较多的问题。

现在是要去多台 Macos 节点 需要定期同步 CocoaPods 的索引。同步索引库直接通过命令 ` pod repo update xxx ` 就能解决,如果要多个节点同步那么使用 Pipeline 的任务每个节点执行脚本就可以了,具体的代码如下:

node("built-in") {
    stage('Master Update') {
        sh label: '', script: '''
            export LANG="en_US.UTF-8"
            pod repo update mirror-spec
        '''
    }
}

node("slave1") {
    stage('Slave1 Update') {
        sh label: '', script: '''
            export LANG="en_US.UTF-8"
            pod repo update mirror-spec
        '''
    }
}

但是运行一段时间发现由于git账号的密码会定期修改,就会出现执行命令的过程中需要输入密码导致任务结束的问题。

发现 Jenkins 在 clone git 仓库的时候会自动注入配置的凭据,从日志发现用到了一个环境变量 GIT_ASKPASS , 摘录一段官方的介绍:

If the GIT_ASKPASS environment variable is set, the program specified by the variable is invoked. A suitable prompt is provided to the program on the command line, and the user’s input is read from its standard output.

大概的意思是如果发现环境变量 GIT_ASKPASS 就会从这个里面获取凭据信息,环境变量配置的是一个可执行的脚本,脚本的模板代码如下:

#!/bin/sh
case "$1" in
    Username*) echo $GIT_USERNAME ;;
    Password*) echo $GIT_PASSWORD ;;
esac

从代码直接可以看到只要在 echo 后面放对应的用户名密码就行了。这里需要说明的是脚本文件需要赋予可执行权限。

那么接下来的问题就来了,怎么获取配置的凭据数据?发现了一个插件 Credentials Binding Plugin , 官方提供了示例代码

node {
  withCredentials([usernamePassword(credentialsId: 'mylogin', usernameVariable: 'VAR_USERNAME', passwordVariable: 'VAR_PASSWORD')]) {
    sh '''
      echo $VAR_USERNAME
      echo $VAR_PASSWORD
    '''
  }
}

大概的做法是将凭据ID mylogin 配置的用户名密码读取出来分别放到环境变量 VAR_USERNAMEVAR_PASSWORD 里面,然后就可以自由发挥了。最终整合后的代码如下:

node("built-in") {
    stage('Master Update') {
        withCredentials([usernamePassword(credentialsId: 'credentialsId', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
            sh label: '', script: '''
                export LANG="en_US.UTF-8"
                rootPath="${WORKSPACE}"
                cd ${rootPath}
                # set git credentials
                ASKPASS=${rootPath}/askpass.sh
                cat > $ASKPASS <<'EOF'
#!/bin/sh
case "$1" in
    Username*) echo $GIT_USERNAME ;;
    Password*) echo $GIT_PASSWORD ;;
esac
EOF
                chmod +x $ASKPASS
                export GIT_ASKPASS=$ASKPASS
                # update repo
                pod repo update mirror-spec
                # clean resources
                rm -rf $ASKPASS
            '''
        }
    }
}

node("slave1") {
    stage('Slave1 Update') {
        withCredentials([usernamePassword(credentialsId: 'credentialsId', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
            sh label: '', script: '''
                export LANG="en_US.UTF-8"
                rootPath="${WORKSPACE}"
                cd ${rootPath}
                # set git credentials
                ASKPASS=${rootPath}/askpass.sh
                cat > $ASKPASS <<'EOF'
#!/bin/sh
case "$1" in
    Username*) echo $GIT_USERNAME ;;
    Password*) echo $GIT_PASSWORD ;;
esac
EOF
                chmod +x $ASKPASS
                export GIT_ASKPASS=$ASKPASS
                # update repo 
                pod repo update mirror-spec
                # clean resources
                rm -rf $ASKPASS
            '''
        }
    }
}

部署了一段时间了,暂时一切运转正常。

参考资料

最近的文章

iOS动态切换APP图标

有些时候需要App能在一些特殊的日子更换桌面图标,或者是出于一些个性化的需求需要能让用户自己选择自己喜欢的图标(比如VIP用户可以显示会员专属的图标)。如“微博和百度云盘的VIP个性化设置就提供了切换图标相关的功能。技术实现从 iOS 10.3 开始系统提供了动态切换图标相关的实现,要求提前将支持切换的可选图标提前预埋到APP并添加相关的配置,然后根据业务需要在合适的时机进行切换即可。配置相关以百度云盘的配置为例:<key>CFBundleIcons</key>&l...…

iOS继续阅读
更早的文章

搭建Flutter引擎源码调试环境

最近在排查问题的时候总会遇到一些和 Flutter 引擎相关的问题,需要直接能在Xcode里面挂在引擎的源码能进行断点Debug,这里记录一下搭建Flutter引擎源码调试环境过程:环境准备1、开发工具(1)下载depot_tools工具包depot_tools 是 chromium 使用的源码库管理工具,可以方便的管理源码以及对应依赖,通过gclinet可以获取所有的编译需要的源码和依赖git clone https://chromium.googlesource.com/chromiu...…

iOS继续阅读