最近把 gitlab CI 环境重新搭建了一遍,记录下搭建过程遇到的问题以及解决办法:

首先说一下笔者的gitlab版本是目前最新版本:10.7.2,通过官方文档 安装运行在Ubuntu16.04.3 LTS 环境下。

gitlab-runner 的注册

因为是 iOS 项目,所以 gitlab-runner 需要选在 MacOS 平台,根据官方文档 一步步操作即可,其中 Enter your GitLab instance URL:Enter the token you obtained to register the Runner: 需要根据自己的项目里面的指示进行操作,如图 1、2 :

gitlab-runner

gitlab-runner 的安装

根据官方文档,一步步操作即可。

这样 gitlab runner 就搭建好了,但是我在这里遇到了一个问题,如图:

gitlab_warning

这里有一个灰色的叹号,这说明设置有问题,主要是因为我在执行 gitlab-runner register 时,曾经加过一次 sudo,通过sudo执行的是root权限,生成的配置文件路径是 /etc/gitlab-runner/config.toml ,用普通权限生成的配置文件路径是 ~/.gitlab-runner/config.toml ,这样导致普通权限配置文件里面没有相应的配置信息,我把前者的内容替换到后者,执行 gitlab-runner restart ,变成了绿点,如第一张图所示,问题解决。

OK,gitlab-runner 设置好了,下面就是编写 yml 配置文件,这里先不说配置文件的内容,先把问题抛出,在执行 pipeline 的时候,提示如下,真是一脸懵逼,这里不得不吐槽下 gitlab 的错误提示做的太不到位了:

1
2
3
4
5
6
7
8
9
Running with gitlab-runner 10.7.1 (b9bba623)
on Runner_iOS ad5ad9f4
Using Shell executor...
Running on bogon...
Cloning repository...
Cloning into '/Users/tianliwei/builds/ad5ad9f4/0/iOS/ninebot_4'...
Checking out c5b39b8a as master...
Skipping Git submodules setup
ERROR: Job failed: exit status 1

经过一番排查发现了答案 ,发现这是一个关于 rvm 的坑,我们都知道 rvm 是ruby版本管理的神器,功能很强,但是不得不说这也很容易埋坑,这里就是因为 rvm 重写了 cd 函数导致脚本在执行 cd 指令时出错,解决办法就是在 .bashrc.bash_profile 加一句 unset cd , OK 这个坑填上了。

xcode-build 在 Xcode9 之后的改动

然后就是脚本内容了,脚本用的我在一年前写的脚本,然后不出意料的出错了,主要是因为 Xcode9 的 xcodebuild 工具去掉了 -exportFormat 和 -exportProvisioningProfile 选项,用 -exportOptionsPlist exportOptions.plist 代替就好啦。至此填坑完成,下一篇说一下 .gitlab-ci.yml 的配置选项及实践,敬请期待。

译者注:先吐槽一下这个名字,Carthage 名字感觉好奇怪,查了一下,解释是 n.迦太基(非洲北部,今突尼斯的奴隶制城邦,腓尼基人所建,公元146年被罗马帝国所灭,见Punic Wars) 真是没搞明白怎么起这么个蹩脚的名字,你看 CocoaPods 多形象。

阅读全文 »

Reveal 是一款功能非常强大的 iOS/OSX 界面调试工具,它可以通过3D效果来显示当前运行的app的视图层级,一目了然。最新的版本是 1.5。尽管从 Xcode6 开始内部已经集成了 ViewDebugging 功能(通过 Xcode 的菜单栏 Debug -> View Debugging -> Capture View Hierarchy),但是其功能还相当有限。

阅读全文 »

###什么是 Block?
Block 是 C 语言的扩充功能,《Objective-C 高级编程 iOS 与 OSX 多线程和内存管理》一书中是这么描述的:

Block 是一种带有自动变量值的匿名函数

匿名就是没有名字,自动变量值其实就是局部变量。而 block 最大的特点就是可以截获函数以外的自动变量的值。而传统的函数只能通过传参或者使用全局变量或者静态变量才可以访问。

阅读全文 »

MVVM 全称 Model-View-ViewModel,是 MVC 框架的增强版,它能减少 View Controller 的复杂性并使得表示逻辑更易于测试。

传统 MVC 框架如图:

阅读全文 »

总结一下在ARC下的内存泄漏问题

ARC全称叫 ARC(Automatic Reference Counting)。在编译期间,编译器会判断对象的使用情况,并适当的加上retain和release,使得对象的内存被合理的管理。所以,从本质上说ARC和MRC在本质上是一样的,都是通过引用计数的内存管理方式。ARC 的出现大大节省了程序员手动管理内存的时间成本,But,世上没有完美的事物,我们也不要把任何事想的那么美好,在 ARC 环境下如果不注意的话也会引起内存泄漏。

阅读全文 »

从 13 年开始听 podcast,想来时间也不短了,刚开始的时候就是感觉挺新奇的,随意听听,慢慢的,找到一些比较不错的科技类和人文类博客节目,在这里罗列一下,推荐给大家。

阅读全文 »

写这篇博客是因为我前些天加入了 http://nshipster.cn 翻译小组,并参与了一篇英文博客的翻译工作。我之前也翻译过一些 iOS 相关的英文技术博客,比如 iOS核对清单–创建发布你的应用缓存在AFNetworking中是如何工作的? 因为这两个只是自己查资料的时候看到的,觉到内容不错就顺便翻译了,属于很随意的,而这次与之前不同的是它属于比较严谨、规范、有组织的翻译,所以在这里写写自己的感受。

阅读全文 »

并发所描述的概念就是同时运行多个任务。这些任务可能是以在单核 CPU 上分时(时间共享)的形式同时运行,也可能是在多核 CPU 上以真正的并行方式来运行。

并发编程的方式有: pthread 、 NSThread 、GCD 、NSOperationQueue,以及 NSRunLoop。实际上把 run loop 也列在其中是有点奇怪,因为它并不能实现真正的并行,不过因为它与并发编程有莫大的关系,因此值得我们进行一些深入了解。

阅读全文 »

问了几次研究 NSBlock 的人员:Key-Value Observing 在 Cocoa 框架里有着最不好用的 API 。它很难对付,啰嗦,令人迷惑。最糟糕的是,它的 API 掩盖了 framework 中很引人注目的特性。

阅读全文 »

关于代码的可复用性(或者说解耦),在视图层面来说,可以通过自定义视图进行封装,但是如果是利用storyboard来开发项目的话,其实推荐的方法还是利用viewcontroller来封装视图,然后在需要显示该视图的时候,通过 [self.view addSubview:wrapVC.view]来进行显示,但是这里边有些细节是需要注意的。

阅读全文 »

####前言

objc.io 就不多介绍了,国外iOS高质量博客网站。我这里说一下我为什么要写这个系列。首先我觉的这种技术类博客,能看懂不代表你已经完全理解,也不代表你能灵活运用到自己的项目中。有时候我们看完了文章感觉受益匪浅,然后就该干嘛干嘛去了,随着时间的推移(时间是一个很可怕的东西),一些很赞的思路或者技术点就慢慢变的模糊不清。我不清楚其他人会不会有这样的问题,我反正是经常遇到这种问题,所以我觉的自己很有必要把原博客的内容进行一下归纳整理,方便日后查阅。今天主要记录一下 更轻量的 View Controllers 里边的技术点。

阅读全文 »

这段时间自己打算做一个视频聊天的app,客户端(iOS),服务器(NodeJS+MongoDB)打算全自己上。后者对我来说零经验,不过老话说的好,生命在于折腾嘛。今天先来说一下在Mac下如何搭建MongoDB环境。

阅读全文 »

####问题引出
hexo作为一个非常优秀的静态博客框架,越来越受到程序员的青睐,包括我也早已投入了hexo的怀抱,hexo与传统的博客托管网站不同的一点是博客的源文件是保存在本地的,并通过hexo框架提供的hexo generatehexo deploy命令将markdown文件生成相应的html文件,并发布到github-pages上去。我们每次发布博客都要执行这样的流程,那就会遇到一个问题,比如家里跟公司的电脑我都要用来发布博客,怎么保持每台电脑上的文件的同步呢?

阅读全文 »

在过去七年时间里,我们的团队创建了无数iOS应用。在这个过程中我们不断改善我们的开发流程。把最佳实践应用到我们发布的新应用中。

我们已经准备好了两张核对清单。一个是关于如何开始一个iOS项目,一个是关于如何将应用提交到AppStore。

这些清单的流程使我们团队更高效,构建更好的解决方案,减少开发时间和提交到AppStore的风险。

我希望这些清单对你们同样有用。

阅读全文 »

####开篇

接触git时间也不短了,看了不少资料,但是在使用过程中还是经常遇到问题,究其原因,是因为对git的用法以及使用场景理解不够透彻,而且git知识点繁杂,时间一长,容易忘。于是决定静下心来,认认真真的对git的用法做一些归纳总结。

阅读全文 »

github大家都不陌生吧,它是目前最为流行的代码托管平台,好多著名的开源项目都在github上进行托管。但github只能免费托管公有项目,如果要托管私有项目就要缴纳不菲的费用。一般公司的项目都是private的,那有没有一种既可以免费托管,又可以保证代码安全的方案呢。答案当然是肯定的,一种方案是使用 bitbucket进行代码托管,bitbucket提供免费的无限制的私有仓库托管服务。另外一种方案就是今天重点介绍的gitlab

阅读全文 »

####什么是RunLoop
RunLoop字面上是运行循环的意思,本质是iOS系统的消息处理机制。

####为什么使用runloop

当需要和该线程进行交互的时候。主线程默认有一个runloop。当自己启动一个线程,如果只是用于处理单一的事件,该线程在执行完之后就退出了。所以当我们需要让该线程即监听某项事务事,就得让线程一直不退出,runloop就是这么一个循环,没有事件的时候,处于休眠状态,有事件到了,处理事件。

阅读全文 »

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment