Argo Workflows vs Jenkins: Building Cloud‑Native CI/CD Pipelines on ACK One Serverless
Argo Workflows, a cloud‑native Kubernetes job orchestrator, offers superior autoscaling, concurrency, cost efficiency, and seamless integration with the Argo ecosystem compared to Jenkins, and the article provides a detailed tutorial on deploying a Go‑based CI pipeline on ACK One Serverless Argo with BuildKit, NAS caching, and parameterized workflow templates.
Argo Workflows is an open‑source, cloud‑native workflow engine for orchestrating jobs on Kubernetes, enabling automation of complex pipelines such as scheduled tasks, machine learning, ETL, model training, data streams, and CI/CD.
Kubernetes Jobs lack step dependencies, templates, visual UI, and workflow‑level error handling, making them unsuitable for batch processing, scientific computing, and continuous integration scenarios.
As a CNCF graduated project, Argo Workflows is widely used, especially for continuous integration (CI).
Jenkins, the most common CI/CD solution, is free and plugin‑rich but suffers from being non‑Kubernetes‑native, performance bottlenecks as pipelines grow, limited auto‑scaling, high idle‑resource costs, and maintenance challenges due to plugin version incompatibilities and security issues.
Compared with Jenkins, Argo Workflows provides many advantages: it is Kubernetes‑native, inherits Kubernetes container management benefits (automatic recovery, elastic scaling, RBAC with SSO), offers autoscaling and high concurrency for large‑scale pipelines, minimizes cost through spot ECI usage, and integrates seamlessly with the Argo ecosystem (Argo CD, Argo Rollout, Argo Event).
Comparison Table
Argo Workflows
Jenkins
Kubernetes‑native, inherits container fault‑recovery, elastic scaling, RBAC + SSO.
Non‑Kubernetes‑native.
Autoscaling, high concurrency for large pipelines.
Performance degrades with many pipelines; poor auto‑scaling.
Cost‑effective: auto‑scale, spot ECI support.
Idle compute waste.
Growing community, tight integration with Argo CD, Rollout, Event.
Mature community, abundant plugins but high maintenance overhead.
The article then introduces ACK One Serverless Argo , a fully managed Argo Workflows service that leverages Alibaba Cloud ECI for automatic scaling, spot instances, and cost reduction.
CI Pipeline Overview
The pipeline uses BuildKit for image building and caching, NAS for Go module caching, and consists of three main steps: Git clone & checkout, optional Go test (accelerated by NAS), and Build & push image with optional commit‑ID tag.
The pre‑installed ClusterWorkflowTemplate named ci-go-v1 is provided. Its YAML definition is shown below:
apiVersion: argoproj.io/v1alpha1</code><code>kind: ClusterWorkflowTemplate</code><code>metadata:</code><code> name: ci-go-v1</code><code>spec:</code><code> entrypoint: main</code><code> volumes:</code><code> - name: run-test</code><code> emptyDir: {}</code><code> - name: workdir</code><code> persistentVolumeClaim:</code><code> claimName: pvc-nas</code><code> - name: docker-config</code><code> secret:</code><code> secretName: docker-config</code><code> arguments:</code><code> parameters:</code><code> - name: repo_url</code><code> value: ""</code><code> - name: repo_name</code><code> value: ""</code><code> - name: target_branch</code><code> value: "main"</code><code> - name: container_image</code><code> value: ""</code><code> - name: container_tag</code><code> value: "v1.0.0"</code><code> - name: dockerfile</code><code> value: "./Dockerfile"</code><code> - name: enable_suffix_commitid</code><code> value: "true"</code><code> - name: enable_test</code><code> value: "true"</code><code> templates:</code><code> - name: main</code><code> dag:</code><code> tasks:</code><code> - name: git-checkout-pr</code><code> inline:</code><code> container:</code><code> image: alpine:latest</code><code> command:</code><code> - sh</code><code> - -c</code><code> - |</code><code> set -eu</code><code> apk --update add git</code><code> cd /workdir</code><code> echo "Start to Clone "{{workflow.parameters.repo_url}}</code><code> git -C "{{workflow.parameters.repo_name}}" pull || git clone {{workflow.parameters.repo_url}}</code><code> cd {{workflow.parameters.repo_name}}</code><code> echo "Start to Checkout target branch" {{workflow.parameters.target_branch}}</code><code> git checkout {{workflow.parameters.target_branch}}</code><code> echo "Get commit id"</code><code> git rev-parse --short origin/{{workflow.parameters.target_branch}} > /workdir/{{workflow.parameters.repo_name}}-commitid.txt</code><code> commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)</code><code> echo "Commit id is got: "$commitId</code><code> echo "Git Clone and Checkout Complete."</code><code> volumeMounts:</code><code> - name: "workdir"</code><code> mountPath: /workdir</code><code> resources:</code><code> requests:</code><code> memory: 1Gi</code><code> cpu: 1</code><code> activeDeadlineSeconds: 1200</code><code> - name: run-test</code><code> when: "{{workflow.parameters.enable_test}} == true"</code><code> inline:</code><code> container:</code><code> image: golang:1.22-alpine</code><code> command:</code><code> - sh</code><code> - -c</code><code> - |</code><code> set -eu</code><code> if [ ! -d "/workdir/pkg/mod" ]; then</code><code> mkdir -p /workdir/pkg/mod</code><code> echo "GOMODCACHE Directory /pkg/mod is created"</code><code> fi</code><code> export GOMODCACHE=/workdir/pkg/mod</code><code> cp -R /workdir/{{workflow.parameters.repo_name}} /test/{{workflow.parameters.repo_name}}</code><code> echo "Start Go Test..."</code><code> cd /test/{{workflow.parameters.repo_name}}</code><code> go test -v ./...</code><code> echo "Go Test Complete."</code><code> volumeMounts:</code><code> - name: "workdir"</code><code> mountPath: /workdir</code><code> - name: run-test</code><code> mountPath: /test</code><code> resources:</code><code> requests:</code><code> memory: 4Gi</code><code> cpu: 2</code><code> activeDeadlineSeconds: 1200</code><code> depends: git-checkout-pr</code><code> - name: build-push-image</code><code> inline:</code><code> container:</code><code> image: moby/buildkit:v0.13.0-rootless</code><code> command:</code><code> - sh</code><code> - -c</code><code> - |</code><code> set -eu</code><code> tag={{workflow.parameters.container_tag}}</code><code> if [ {{workflow.parameters.enable_suffix_commitid}} == "true" ]</code><code> then</code><code> commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)</code><code> tag={{workflow.parameters.container_tag}}-$commitId</code><code> fi</code><code> echo "Image Tag is: "$tag</code><code> echo "Start to Build And Push Container Image"</code><code> cd /workdir/{{workflow.parameters.repo_name}}</code><code> buildctl-daemonless.sh build \</code><code> --frontend \</code><code> dockerfile.v0 \</code><code> --local context=. \</code><code> --local dockerfile=. \</code><code> --opt filename={{workflow.parameters.dockerfile}} \</code><code> build-arg:GOPROXY=http://goproxy.cn,direct \</code><code> --output type=image,"name={{workflow.parameters.container_image}}:${tag},{{workflow.parameters.container_image}}:latest",push=true,registry.insecure=true \</code><code> --export-cache mode=max,type=registry,ref={{workflow.parameters.container_image}}:buildcache \</code><code> --import-cache type=registry,ref={{workflow.parameters.container_image}}:buildcache</code><code> echo "Build And Push Container Image {{workflow.parameters.container_image}}:${tag} and {{workflow.parameters.container_image}}:latest Complete."</code><code> env:</code><code> - name: BUILDKITD_FLAGS</code><code> value: --oci-worker-no-process-sandbox</code><code> - name: DOCKER_CONFIG</code><code> value: /.docker</code><code> volumeMounts:</code><code> - name: workdir</code><code> mountPath: /workdir</code><code> - name: docker-config</code><code> mountPath: /.docker</code><code> securityContext:</code><code> seccompProfile:</code><code> type: Unconfined</code><code> runAsUser: 1000</code><code> runAsGroup: 1000</code><code> resources:</code><code> requests:</code><code> memory: 4Gi</code><code> cpu: 2</code><code> activeDeadlineSeconds: 1200</code><code> depends: run-testThe article then outlines the steps to run the pipeline via the ACK One console: log in, enable the Argo workflow console, navigate to Cluster Workflow Templates , select ci-go-v1, fill in parameters, and submit.
A parameter table lists the required inputs such as repo_url, repo_name, target_branch, container_image, container_tag, dockerfile, enable_suffix_commitid, and enable_test.
After execution, the workflow status can be inspected in the Argo UI.
Conclusion
ACK One Serverless Argo, as a fully managed service, enables large‑scale, fast, and cost‑effective CI pipelines and can be combined with ACK One GitOps (Argo CD) and Argo Event for a complete automated CI/CD solution.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
