持续优化是我工作和生活的唯一算法,其一体现就是 DevOps 。
今天讲下我跟 DevOps 相爱相杀的历史。
2016 ~ 2018:static Jenkins
在16年的时候,我就在想怎么提高工作的效率,让应用发布跟得上迭代。
那个时候我也不知道这叫 DevOps 。反正有啥就用啥。最后我选择了 Jenkins 。Jenkins 是一个基于插件的纯瀑布流的CI模型。也就是说,配置是最为繁重的那部分。

每一个项目,都需要重复配置(虽然后来我建了一个模板项目,但我发现不能解决根本问题)。每一个项目里面的配置,都包含N个插件。以里面一个Java项目来说。
整个CI的流程,分为
webhook –> Jenkins build –> docker push
Jenkins build 又可细分为
git pull/clone –> gradle/maven build –> docker build

这里面每一个步骤,甚至是数据的流动(比如根据tag和branch判定是否需要触发构建)都需要用到插件。

以这个项目为例,最终我们使用的插件有:
- docker
- Environment Injector Plugin
- Gitea(源仓库是gitea)
- gradle(构建工具用的是gradle)
- Mask Passwords(用于掩盖docker login密码)
- Generic Webhook Trigger Plugin(就是上图那个 Optional filter 符合输入要求的branch才会触发下一步构建)
除了项目配置,还得做一些全局配置。。。
最终我们会发现, Jenkins变成了一架超级航空母舰,谁也不知道里面放了啥。留下的只是
provider_version=
docker image ls $image1 |grep -Eo '([0-9]{0,2}\.){2}[0-9]+'| head -1
这一行最有用的 tag 提取脚本,哈哈哈。。。
结论
小型构建系统( <30 个构建任务)的最优解
相关工作回顾
2018 ~ 至今:swarm + Concourse

如果说Jenkins 是一个基于插件的纯瀑布流的航空母舰,那么 Concourse 就是极简主义忍者。
Concourse 的最大优点在于可重用的模板配置,其次,活跃的社区也是不错的一个点(说明最起码用的人不少)。而且,他们的 releases 有时候也写的很皮,带点表情包什么的。
缺点在于 breaking change 不少,如果用 docker运行,就会变成 docker in docker。
4.x 版本的时候,出现了无数次 docker hung,load15 过高等状况,当时只能重启。非常滴蛋疼。这个问题,在升级到5.x之后略有缓解。

BTW , Concourse 本身是一套分布式系统,未来计划在 Kubernetes 中运行,但目前还只是一个草案

结论
2020年3月末发布了6.x版本,值得一试。
相关工作回顾
2020:tektoncd

其实,我还折腾过 JenkinsX ,但那时候,JenkinsX 的文档太少,导致工作一直不顺利。JenkinsX 有点像 Jenkins Blue Ocean,还加入点 serverless 。 但他并没有放弃 static Jenkins 那套玩意。最后变得有点不伦不类。
2020/03/11,JenkinsX 宣布自(我)(倒)闭。
函数型 serverless 框架 knative 也宣布放弃自家CI的开发,指向 tektoncd。
在2019年3月的时候,我就已经作为云玩家参与体验了 tektoncd 。那时候,模型的定义还是非常简单。
不过现在上看,当时觉得欠缺的构建缓存现在已经加上去了。不过,2019年我提出的
通过CRD重新定义CI/CD是一大亮点,但目前构建任务只能通过手动创建YAML文件,构建任务一多的时候,集群内就会大量堆积该CI相关的CRD,感觉比较蠢.
这个问题没能很好解决。目前的思路是通过 Cronjob 实现定期清除。
结论
潜力不小,值得一试。
相关工作回顾
- 国内服务器安装JenkinsX
- Jenkins-X构建Java应用
- tektoncd云玩家初体验
- Please support build cache in PipelineResources
- Can’t rerun existing completed taskruns or delete completed taskruns automatically
- Introduce runHistoryLimit
参考链接
2018.06 ~ 至今:Kubernetes
关于 Kubernetes 我已经发表过无数话题。18年的时候,在稍微了解了一下 Kubernetes 的发布工作流之后(那个时候我对 docker 都不太熟练),我当天立刻决定,就算只有我一个人,我也要在公司内部推广这套系统。
事实证明,我是对的。我们后来又整了一套完整的 DevOps 的体系,Kubernetes 是其中最后,并且最重要的一环。我们从“无运维时代”,直接走向了“无需运维时代”(甩锅给阿里云售后🤣🤣🤣)。
但事实证明,我也是错的。传统应用变成流动的pod之后,要解决
- volume
- 网络诊断
- 资源监控与配额
- 云厂商组件bug
- docker自身bug
- 系统内核(比如IPtable,cgroup,namespace)自身bug
等等一系列问题。随便挑一个都是大问题。。。
结论
没有银弹。但我相信 Kubernetes 是未来10年应用部署的首选模型。
相关工作回顾
参考链接
2020:阿里巴巴(广告位招租中 ~ )
这方面的我关注的比较少(分辨是公关文还是技术分享比较浪费时间,所以干脆不看算了)。
阿里巴巴的公司体量比较大,他们遇到的问题和提出的解决方案(比如中台,修改JVM)很多更像是屠龙技,对于小型公司其实没有多大卵用。
不过值得借鉴的地方也有不少。
比如这个 golang 的 Dockerfile,还有云效那套 DevOps 文化。
golang Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM golang:1.14 AS build-env
ADD . /src/github.com/AliyunContainerService/kube-eventer
ENV GOPATH /:/src/github.com/AliyunContainerService/kube-eventer/vendor
ENV GO111MODULE on
WORKDIR /src/github.com/AliyunContainerService/kube-eventer
RUN apt-get update -y && apt-get install gcc ca-certificates
RUN make
FROM alpine:3.10
COPY --from=build-env /src/github.com/AliyunContainerService/kube-eventer/kube-eventer /
COPY --from=build-env /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENV TZ "Asia/Shanghai"
RUN apk add --no-cache tzdata
COPY deploy/entrypoint.sh /
ENTRYPOINT ["/kube-eventer"]
云效 DevOps 文化

研发模式全自动化
随着“容器化”的浪潮来临,我们研发平台再一次升级,将线上容器定义、运维监控责任全部交给了开发者,应用运维岗位不复存在。
流量回放测试
第二个是流量回放测试技术。这项技术的创新给测试团队带来了很大影响,通过线上流量复制到线下,低成本的解决了测试回归的问题,将传统通过编写用例进行测试,简化为编排数据进行测试。第二层是Mock技术的应用,将一个分布式系统问题,转化为单机问题,可以在几秒钟完成上千个用例运行。有了这两个基础技术后,在上层可以发展测试平台,通过算法的手段去识别有效流量,去自动化处理数据,去识别异常流量背后的缺陷。通过这三层面的变革,可以说让阿里巴巴测试效率有了质的变化。
全链路压测
第三个是全链路压测技术(对应阿里云上的产品叫PTS)。双11大家之所以能放心剁手,一年比一年顺滑,核心就是这项技术在每次大促前帮助开发者发现风险。发现以后就需要快速的响应,通过DevOps工具去解决线上问题。每次压测都是一次练兵,有点类似于军事演习,快速发现问题,快速解决,不断锤炼团队DevOps能力,也可以这样说阿里巴巴的DevOps能力正是一次一次“双11”给练出来的。
大胆尝试,把握底线

结论
合适自己的才是最好。
参考链接
其他可选方案
总结
DevOps 核心思路只有一个:不断提高应用开发,部署,监控,升级/迭代效率。
Continuous optimization is the only algorithm in my work and life, and one manifestation is DevOps.
Today I’ll talk about my love-hate history with DevOps.
2016 ~ 2018: Static Jenkins
In 2016, I was thinking about how to improve work efficiency and make application releases keep up with iterations.
At that time, I didn’t know this was called DevOps. I just used whatever was available. Finally, I chose Jenkins. Jenkins is a pure waterfall-flow CI model based on plugins. That is to say, configuration is the most burdensome part.

Every project needed repeated configuration (although I later created a template project, I found it couldn’t solve the fundamental problem). Every project’s configuration contained N plugins. Take a Java project inside as an example.
The entire CI process is divided into:
webhook –> Jenkins build –> docker push
Jenkins build can be further subdivided into:
git pull/clone –> gradle/maven build –> docker build

Every step here, even data flow (like determining whether to trigger a build based on tag and branch), requires plugins.

Taking this project as an example, the plugins we ultimately used were:
- docker
- Environment Injector Plugin
- Gitea (source repository is gitea)
- gradle (build tool is gradle)
- Mask Passwords (for masking docker login passwords)
- Generic Webhook Trigger Plugin (the Optional filter in the image above—only branches that meet input requirements will trigger the next build step)
Besides project configuration, we also had to do some global configuration…
In the end, we’ll find that Jenkins became a super aircraft carrier, and no one knows what’s inside. What remains is just:
provider_version=
docker image ls $image1 |grep -Eo '([0-9]{0,2}\.){2}[0-9]+'| head -1
This most useful tag extraction script, hahaha…
Conclusion
Optimal solution for small build systems (<30 build tasks)
Related Work Review
- Building .NET CI Environment with Jenkins from Scratch
- Gogs+Jenkins Building Java Projects, Finally Dockerized
- Using Jenkins on Kubernetes
2018 ~ Present: Swarm + Concourse

If Jenkins is a pure waterfall-flow aircraft carrier based on plugins, then Concourse is a minimalist ninja.
Concourse’s biggest advantage is reusable template configuration. Second, an active community is also a good point (showing at least many people use it). Moreover, their releases are sometimes written quite playfully, with some emojis and stuff.
The downside is there are many breaking changes. If running with docker, it becomes docker in docker.
In version 4.x, there were countless instances of docker hung, load15 too high, etc. At that time, we could only restart. Very annoying. This problem was slightly alleviated after upgrading to 5.x.

BTW, Concourse itself is a distributed system, with plans to run in Kubernetes in the future, but currently it’s just a draft

Conclusion
Version 6.x was released at the end of March 2020, worth a try.
Related Work Review
2020: tektoncd

Actually, I also messed around with JenkinsX, but at that time, JenkinsX documentation was too scarce, causing work to be constantly unsuccessful. JenkinsX is a bit like Jenkins Blue Ocean, with some serverless added. But it didn’t abandon the static Jenkins stuff. Finally, it became a bit neither fish nor fowl.
On 2020/03/11, JenkinsX announced self-(my)(collapse).
The functional serverless framework knative also announced abandoning its own CI development, pointing to tektoncd.
In March 2019, I had already participated as a cloud player to experience tektoncd. At that time, the model definition was still very simple.
But looking at it now, the build cache that I thought was missing has now been added. However, what I proposed in 2019:
Redefining CI/CD through CRD is a major highlight, but currently build tasks can only be created manually through YAML files. When there are many build tasks, CI-related CRDs will accumulate heavily in the cluster, which feels quite stupid.
This problem wasn’t solved well. The current approach is to implement periodic cleanup through Cronjob.
Conclusion
Great potential, worth a try.
Related Work Review
- Installing JenkinsX on Domestic Servers
- Jenkins-X Building Java Applications
- tektoncd Cloud Player First Experience
- Please support build cache in PipelineResources
- Can’t rerun existing completed taskruns or delete completed taskruns automatically
- Introduce runHistoryLimit
References
2018.06 ~ Present: Kubernetes
I’ve published countless topics about Kubernetes. In 2018, after slightly understanding Kubernetes’ release workflow (at that time I wasn’t even very familiar with docker), I immediately decided that day that even if I was the only one, I would promote this system within the company.
Facts proved I was right. We later built a complete DevOps system, and Kubernetes was the last and most important link. We went directly from the “no operations era” to the “no need for operations era” (passing the buck to Alibaba Cloud after-sales 🤣🤣🤣).
But facts also proved I was wrong. After traditional applications became flowing pods, we needed to solve:
- volume
- Network diagnosis
- Resource monitoring and quotas
- Cloud vendor component bugs
- Docker’s own bugs
- System kernel (like IPtable, cgroup, namespace) bugs
And a series of other problems. Any one of them is a big problem…
Conclusion
No silver bullet. But I believe Kubernetes is the preferred model for application deployment in the next 10 years.
Related Work Review
References
2020: Alibaba (Advertising Space for Rent ~)
I pay less attention to this aspect (distinguishing between PR articles and technical sharing is a waste of time, so I just don’t look).
Alibaba’s company scale is relatively large. The problems they encounter and solutions they propose (like middle platform, modifying JVM) are more like dragon-slaying skills, not very useful for small companies.
But there are also many places worth learning from.
Like this golang Dockerfile, and that DevOps culture from Cloud Efficiency.
golang Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM golang:1.14 AS build-env
ADD . /src/github.com/AliyunContainerService/kube-eventer
ENV GOPATH /:/src/github.com/AliyunContainerService/kube-eventer/vendor
ENV GO111MODULE on
WORKDIR /src/github.com/AliyunContainerService/kube-eventer
RUN apt-get update -y && apt-get install gcc ca-certificates
RUN make
FROM alpine:3.10
COPY --from=build-env /src/github.com/AliyunContainerService/kube-eventer/kube-eventer /
COPY --from=build-env /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENV TZ "Asia/Shanghai"
RUN apk add --no-cache tzdata
COPY deploy/entrypoint.sh /
ENTRYPOINT ["/kube-eventer"]
Cloud Efficiency DevOps Culture

Fully Automated R&D Mode
With the wave of “containerization” coming, our R&D platform upgraded again, handing all online container definitions and operations monitoring responsibilities to developers. The application operations position no longer exists.
Traffic Replay Testing
The second is traffic replay testing technology. This technological innovation had a great impact on the testing team. By copying online traffic offline, it low-cost solved the problem of test regression, simplifying traditional test case writing to test data orchestration. The second layer is the application of Mock technology, transforming a distributed system problem into a single-machine problem, completing thousands of test case runs in seconds. With these two foundational technologies, a testing platform can be developed at the upper layer, using algorithmic means to identify effective traffic, automatically process data, and identify defects behind abnormal traffic. Through these three levels of transformation, it can be said that Alibaba’s testing efficiency has had a qualitative change.
Full-Link Pressure Testing
The third is full-link pressure testing technology (corresponding to the product on Alibaba Cloud called PTS). The reason everyone can confidently shop during Double 11, getting smoother year by year, is that this technology helps developers discover risks before each major promotion. After discovery, rapid response is needed, using DevOps tools to solve online problems. Each pressure test is a training exercise, somewhat similar to military exercises—quickly discovering problems, quickly solving them, continuously honing the team’s DevOps capabilities. It can also be said that Alibaba’s DevOps capabilities were trained through one “Double 11” after another.
Bold Attempts, Grasp the Bottom Line

Conclusion
What suits you is best.
References
Other Optional Solutions
How to Do the Ideal DevOps Process? Look at Slack’s Code Deployment Practice
Summary
DevOps has only one core idea: continuously improve application development, deployment, monitoring, upgrade/iteration efficiency.
継続的な最適化は、私の仕事と生活の唯一のアルゴリズムであり、その1つの現れがDevOpsです。
今日は、私とDevOpsの愛憎の歴史について話します。
2016〜2018:static Jenkins
16年のとき、私は仕事の効率をどう向上させ、アプリケーションのリリースを反復に追いつかせるかを考えていました。
その時、私はこれがDevOpsと呼ばれることを知りませんでした。とにかく何でも使いました。最後にJenkinsを選択しました。Jenkinsはプラグインベースの純粋なウォーターフォールCIモデルです。つまり、設定が最も負担の大きい部分です。

すべてのプロジェクトで、設定を繰り返す必要がありました(後でテンプレートプロジェクトを作成しましたが、根本的な問題を解決できないことがわかりました)。各プロジェクトの設定には、N個のプラグインが含まれています。内部のJavaプロジェクトを例に挙げます。
CIプロセス全体は次のように分けられます:
webhook –> Jenkins build –> docker push
Jenkins buildはさらに細分化できます:
git pull/clone –> gradle/maven build –> docker build

ここでのすべてのステップ、さらにはデータの流れ(たとえば、tagとbranchに基づいてビルドをトリガーする必要があるかどうかを判断する)には、プラグインが必要です。

このプロジェクトを例として、最終的に使用したプラグインは次のとおりです:
- docker
- Environment Injector Plugin
- Gitea(ソースリポジトリはgitea)
- gradle(ビルドツールはgradle)
- Mask Passwords(docker loginパスワードをマスクするため)
- Generic Webhook Trigger Plugin(上図のOptional filterで、入力要件を満たすbranchのみが次のビルドステップをトリガー)
プロジェクト設定に加えて、いくつかのグローバル設定も行う必要があります…
最終的に、Jenkinsはスーパー航空母艦になり、誰も中に何が入っているかわかりません。残っているのは:
provider_version=
docker image ls $image1 |grep -Eo '([0-9]{0,2}\.){2}[0-9]+'| head -1
この最も有用なtag抽出スクリプトだけです、ははは…
結論
小規模ビルドシステム(<30のビルドタスク)の最適解
関連作業のレビュー
2018〜現在:swarm + Concourse

Jenkinsがプラグインベースの純粋なウォーターフォール航空母艦であるなら、Concourseはミニマリスト忍者です。
Concourseの最大の利点は、再利用可能なテンプレート設定です。次に、活発なコミュニティも良い点です(少なくとも多くの人が使用していることを示しています)。また、リリースは時々非常に遊び心があり、いくつかの絵文字などが含まれています。
欠点は、breaking changeが多く、dockerで実行するとdocker in dockerになることです。
4.xバージョンでは、docker hung、load15過多などの状況が無数に発生し、その時は再起動するしかありませんでした。非常にイライラしました。この問題は、5.xにアップグレードした後、わずかに緩和されました。

BTW、Concourse自体は分散システムであり、将来的にはKubernetesで実行する計画がありますが、現在はまだ草案です。

結論
2020年3月末に6.xバージョンがリリースされました。試す価値があります。
関連作業のレビュー
2020:tektoncd

実際、JenkinsXも試しましたが、その時、JenkinsXのドキュメントが少なすぎて、作業がうまくいきませんでした。JenkinsXはJenkins Blue Oceanに少し似ており、serverlessも追加されています。しかし、static Jenkinsのものを放棄していませんでした。最後に、やや中途半端になりました。
2020/03/11、JenkinsXは自(我)(倒)閉を発表しました。
関数型serverlessフレームワークknativeも、独自のCI開発を放棄し、tektoncdを指すことを発表しました。
2019年3月、私はすでにクラウドプレイヤーとしてtektoncdを体験していました。その時、モデルの定義はまだ非常に簡単でした。
しかし、今見ると、当時不足していると思っていたビルドキャッシュはすでに追加されています。しかし、2019年に私が提案した:
CRDを通じてCI/CDを再定義することは大きなハイライトですが、現在ビルドタスクはYAMLファイルを手動で作成することによってのみ作成でき、ビルドタスクが多い場合、クラスター内にこのCI関連のCRDが大量に蓄積され、かなり愚かに感じます。
この問題はうまく解決できませんでした。現在のアプローチは、Cronjobを通じて定期的なクリーンアップを実装することです。
結論
大きな可能性があり、試す価値があります。
関連作業のレビュー
- 国内サーバーにJenkinsXをインストール
- Jenkins-XでJavaアプリケーションをビルド
- tektoncdクラウドプレイヤー初体験
- Please support build cache in PipelineResources
- Can’t rerun existing completed taskruns or delete completed taskruns automatically
- Introduce runHistoryLimit
参考リンク
2018.06〜現在:Kubernetes
Kubernetesについては、すでに無数のトピックを発表しています。18年のとき、Kubernetesのリリースワークフローを少し理解した後(その時、私はdockerにさえあまり慣れていませんでした)、その日すぐに、私一人でも会社内でこのシステムを推進すると決めました。
事実が証明したように、私は正しかったです。その後、完全なDevOpsシステムを構築し、Kubernetesはその最後で最も重要なリンクでした。私たちは「運用なしの時代」から直接「運用不要の時代」に移行しました(Alibaba Cloudのアフターサービスに責任を転嫁🤣🤣🤣)。
しかし、事実が証明したように、私も間違っていました。従来のアプリケーションが流動的なpodになった後、解決する必要があるのは:
- volume
- ネットワーク診断
- リソース監視とクォータ
- クラウドベンダーコンポーネントのバグ
- docker自体のバグ
- システムカーネル(IPtable、cgroup、namespaceなど)自体のバグ
など、一連の問題です。どれを選んでも大きな問題です…
結論
銀の弾丸はありません。しかし、Kubernetesが今後10年間のアプリケーションデプロイメントの優先モデルになると信じています。
関連作業のレビュー
参考リンク
2020:Alibaba(広告スペース募集中〜)
この側面については、私はあまり注意を払っていません(PR記事と技術共有を区別するのは時間の無駄なので、見ないことにしました)。
Alibabaの会社規模は比較的大きく、彼らが遭遇する問題と提案する解決策(中台、JVMの変更など)の多くは、小型企業には実際にはあまり役に立たない屠龍技に似ています。
しかし、参考になる点も多くあります。
たとえば、このgolangのDockerfile、そしてCloud EfficiencyのDevOps文化です。
golang Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM golang:1.14 AS build-env
ADD . /src/github.com/AliyunContainerService/kube-eventer
ENV GOPATH /:/src/github.com/AliyunContainerService/kube-eventer/vendor
ENV GO111MODULE on
WORKDIR /src/github.com/AliyunContainerService/kube-eventer
RUN apt-get update -y && apt-get install gcc ca-certificates
RUN make
FROM alpine:3.10
COPY --from=build-env /src/github.com/AliyunContainerService/kube-eventer/kube-eventer /
COPY --from=build-env /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENV TZ "Asia/Shanghai"
RUN apk add --no-cache tzdata
COPY deploy/entrypoint.sh /
ENTRYPOINT ["/kube-eventer"]
Cloud Efficiency DevOps文化

研究開発モードの完全自動化
「コンテナ化」の波が到来するにつれて、私たちの研究開発プラットフォームは再びアップグレードされ、オンラインコンテナ定義、運用監視の責任をすべて開発者に委ね、アプリケーション運用ポジションは存在しなくなりました。
トラフィックリプレイテスト
2つ目はトラフィックリプレイテスト技術です。この技術革新はテストチームに大きな影響を与えました。オンライントラフィックをオフラインにコピーすることで、テスト回帰の問題を低コストで解決し、従来のテストケース作成によるテストを、データを編成してテストすることに簡素化しました。第2層はMock技術の応用で、分散システムの問題を単一マシンの問題に変換し、数秒で数千のテストケースを実行できます。これら2つの基礎技術を取得した後、上層でテストプラットフォームを開発でき、アルゴリズムの手段を通じて有効なトラフィックを識別し、データを自動処理し、異常なトラフィックの背後にある欠陥を識別できます。これら3つのレベルの変革を通じて、Alibabaのテスト効率に質的な変化をもたらしたと言えます。
フルリンク圧力テスト
3つ目はフルリンク圧力テスト技術です(Alibaba Cloud上の製品はPTSと呼ばれます)。Double 11で皆が安心して買い物できる理由、年々スムーズになる理由は、この技術が各大型プロモーション前に開発者がリスクを発見するのを助けることです。発見後は迅速な対応が必要で、DevOpsツールを通じてオンライン問題を解決します。各圧力テストは訓練であり、軍事演習に少し似ています—迅速に問題を発見し、迅速に解決し、チームのDevOps能力を継続的に鍛錬します。AlibabaのDevOps能力は、1回1回の「Double 11」によって鍛えられたと言えます。
大胆に試し、底線を把握する

結論
自分に合ったものが最善です。
参考リンク
その他のオプション
理想的なDevOpプロセスはどうすればよいか?Slackのコードデプロイメント実践を見る
まとめ
DevOpsの核心的な考え方は1つだけです:アプリケーション開発、デプロイ、監視、アップグレード/反復の効率を継続的に向上させる。
Непрерывная оптимизация — единственный алгоритм в моей работе и жизни, и одно из его проявлений — это DevOps.
Сегодня я расскажу о моей истории любви-ненависти с DevOps.
2016 ~ 2018: Static Jenkins
В 2016 году я думал о том, как повысить эффективность работы и заставить выпуски приложений успевать за итерациями.
В то время я не знал, что это называется DevOps. Просто использовал то, что было доступно. В итоге я выбрал Jenkins. Jenkins — это чистая модель CI с водопадом на основе плагинов. То есть, конфигурация — самая обременительная часть.

Каждый проект требовал повторной конфигурации (хотя позже я создал шаблонный проект, но обнаружил, что он не может решить фундаментальную проблему). Конфигурация каждого проекта содержала N плагинов. Возьмём в качестве примера проект Java внутри.
Весь процесс CI делится на:
webhook –> Jenkins build –> docker push
Jenkins build можно далее подразделить на:
git pull/clone –> gradle/maven build –> docker build

Каждый шаг здесь, даже поток данных (например, определение необходимости запуска сборки на основе tag и branch), требует плагинов.

В качестве примера этого проекта, плагины, которые мы в конечном итоге использовали:
- docker
- Environment Injector Plugin
- Gitea (исходный репозиторий — gitea)
- gradle (инструмент сборки — gradle)
- Mask Passwords (для маскировки пароля docker login)
- Generic Webhook Trigger Plugin (это Optional filter на изображении выше — только ветки, соответствующие входным требованиям, запустят следующий шаг сборки)
Помимо конфигурации проекта, также нужно было делать некоторую глобальную конфигурацию…
В конечном итоге мы обнаружим, что Jenkins стал супер-авианосцем, и никто не знает, что внутри. Осталось только:
provider_version=
docker image ls $image1 |grep -Eo '([0-9]{0,2}\.){2}[0-9]+'| head -1
Этот самый полезный скрипт извлечения тега, хахаха…
Заключение
Оптимальное решение для небольших систем сборки (<30 задач сборки)
Обзор связанной работы
- Создание .NET CI-окружения с Jenkins с нуля
- Gogs+Jenkins Сборка Java-проектов, наконец Dockerized
- Использование Jenkins на Kubernetes
2018 ~ Настоящее время: Swarm + Concourse

Если Jenkins — это чистый водопадный авианосец на основе плагинов, то Concourse — это минималистский ниндзя.
Самое большое преимущество Concourse — это переиспользуемые шаблонные конфигурации. Во-вторых, активное сообщество — тоже хороший момент (показывает, что по крайней мере многие люди используют его). Более того, их релизы иногда написаны очень игриво, с некоторыми эмодзи и прочим.
Недостаток в том, что breaking changes много, и если запускать с docker, это становится docker in docker.
В версии 4.x было бесчисленное количество случаев docker hung, load15 слишком высокий и т.д. В то время можно было только перезапустить. Очень раздражало. Эта проблема была немного облегчена после обновления до 5.x.

Кстати, Concourse сам по себе — это распределённая система, с планами запуска в Kubernetes в будущем, но в настоящее время это всего лишь черновик

Заключение
Версия 6.x была выпущена в конце марта 2020 года, стоит попробовать.
Обзор связанной работы
2020: tektoncd

На самом деле, я также возился с JenkinsX, но в то время документация JenkinsX была слишком скудной, что приводило к постоянным неудачам в работе. JenkinsX немного похож на Jenkins Blue Ocean, с добавлением некоторого serverless. Но он не отказался от вещей static Jenkins. В итоге стал немного ни рыбой ни мясом.
11.03.2020, JenkinsX объявил о само(мо)(за)крытии.
Функциональный serverless-фреймворк knative также объявил об отказе от собственной разработки CI, указывая на tektoncd.
В марте 2019 года я уже участвовал как облачный игрок, чтобы испытать tektoncd. В то время определение модели было ещё очень простым.
Но теперь, глядя на это, кэш сборки, который я тогда считал недостающим, уже добавлен. Однако, то, что я предложил в 2019 году:
Переопределение CI/CD через CRD — это большой момент, но в настоящее время задачи сборки можно создавать только вручную через YAML-файлы. Когда задач сборки много, в кластере будет накапливаться много CRD, связанных с этим CI, что кажется довольно глупым.
Эта проблема не была хорошо решена. Текущий подход — реализовать периодическую очистку через Cronjob.
Заключение
Большой потенциал, стоит попробовать.
Обзор связанной работы
- Установка JenkinsX на внутренних серверах
- Jenkins-X Сборка Java-приложений
- tektoncd Первый опыт облачного игрока
- Please support build cache in PipelineResources
- Can’t rerun existing completed taskruns or delete completed taskruns automatically
- Introduce runHistoryLimit
Ссылки
2018.06 ~ Настоящее время: Kubernetes
Я опубликовал бесчисленные темы о Kubernetes. В 2018 году, после небольшого понимания рабочего процесса выпуска Kubernetes (в то время я даже не был очень знаком с docker), я сразу же в тот же день решил, что даже если я один, я буду продвигать эту систему внутри компании.
Факты доказали, что я был прав. Мы позже построили полную систему DevOps, и Kubernetes был последним и самым важным звеном в ней. Мы перешли прямо от “эры без операций” к “эре без необходимости в операциях” (переложив вину на послепродажное обслуживание Alibaba Cloud 🤣🤣🤣).
Но факты также доказали, что я был неправ. После того, как традиционные приложения стали текучими pods, нужно было решить:
- volume
- Диагностика сети
- Мониторинг ресурсов и квоты
- Ошибки компонентов облачных поставщиков
- Собственные ошибки docker
- Собственные ошибки системного ядра (например, IPtable, cgroup, namespace)
И ряд других проблем. Любая из них — большая проблема…
Заключение
Нет серебряной пули. Но я верю, что Kubernetes — это предпочтительная модель для развёртывания приложений на следующие 10 лет.
Обзор связанной работы
Ссылки
2020: Alibaba (Рекламное место сдаётся в аренду ~)
Я обращаю меньше внимания на этот аспект (различение PR-статей и технических обменов — пустая трата времени, поэтому просто не смотрю).
Масштаб компании Alibaba относительно велик. Проблемы, с которыми они сталкиваются, и решения, которые они предлагают (например, средняя платформа, изменение JVM), больше похожи на навыки убийства драконов, не очень полезные для небольших компаний.
Но есть также много мест, заслуживающих изучения.
Например, этот Dockerfile для golang, и та культура DevOps от Cloud Efficiency.
golang Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM golang:1.14 AS build-env
ADD . /src/github.com/AliyunContainerService/kube-eventer
ENV GOPATH /:/src/github.com/AliyunContainerService/kube-eventer/vendor
ENV GO111MODULE on
WORKDIR /src/github.com/AliyunContainerService/kube-eventer
RUN apt-get update -y && apt-get install gcc ca-certificates
RUN make
FROM alpine:3.10
COPY --from=build-env /src/github.com/AliyunContainerService/kube-eventer/kube-eventer /
COPY --from=build-env /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENV TZ "Asia/Shanghai"
RUN apk add --no-cache tzdata
COPY deploy/entrypoint.sh /
ENTRYPOINT ["/kube-eventer"]
Культура DevOps Cloud Efficiency

Полная автоматизация режима R&D
С приходом волны “контейнеризации” наша платформа R&D снова обновилась, передав все обязанности по определению онлайн-контейнеров и мониторингу операций разработчикам. Позиция операций приложений больше не существует.
Тестирование воспроизведения трафика
Второе — это технология тестирования воспроизведения трафика. Инновация этой технологии оказала большое влияние на команду тестирования. Путём копирования онлайн-трафика офлайн, она низкозатратно решила проблему регрессии тестирования, упростив традиционное тестирование через написание тестовых случаев до оркестрации данных для тестирования. Второй слой — это применение технологии Mock, преобразующей проблему распределённой системы в проблему одной машины, способную выполнить тысячи тестовых случаев за несколько секунд. С этими двумя базовыми технологиями на верхнем уровне можно разработать платформу тестирования, используя алгоритмические средства для идентификации эффективного трафика, автоматической обработки данных и идентификации дефектов за аномальным трафиком. Через эти три уровня трансформации можно сказать, что эффективность тестирования Alibaba претерпела качественные изменения.
Полное тестирование под нагрузкой всей цепочки
Третье — это технология полного тестирования под нагрузкой всей цепочки (соответствующий продукт на Alibaba Cloud называется PTS). Причина, по которой все могут уверенно делать покупки во время Double 11, становясь всё более плавными год за годом, заключается в том, что эта технология помогает разработчикам обнаруживать риски перед каждой крупной акцией. После обнаружения требуется быстрый ответ, используя инструменты DevOps для решения онлайн-проблем. Каждое тестирование под нагрузкой — это тренировка, несколько похожая на военные учения — быстрое обнаружение проблем, быстрое решение, постоянная отработка способностей команды DevOps. Можно также сказать, что способности DevOps Alibaba были отточены через одно “Double 11” за другим.
Смелые попытки, удержание дна

Заключение
То, что подходит вам, лучше всего.
Ссылки
Другие варианты
Как сделать идеальный процесс DevOp? Посмотрите на практику развёртывания кода Slack
Резюме
DevOps имеет только одну основную идею: непрерывно повышать эффективность разработки, развёртывания, мониторинга, обновления/итерации приложений.