Skip to content

Commit 5f2325c

Browse files
authored
Initial implementation (#2)
1 parent 48ceb14 commit 5f2325c

File tree

13 files changed

+747
-2
lines changed

13 files changed

+747
-2
lines changed

README.md

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,53 @@
1-
# docker-azure-pipelines-agent
2-
Docker based agent for Azure Pipelines
1+
# Azure Pipelines Agent
2+
[Azure Pipelines Agent](https://github.com/emberstack/docker-azure-pipelines-agent) is self-hosted agent that you can run in a container with Docker.
3+
4+
[![Build Status](https://dev.azure.com/emberstack/OpenSource/_apis/build/status/docker-azure-pipelines-agent?branchName=master)](https://dev.azure.com/emberstack/OpenSource/_build/latest?definitionId=17&branchName=master)
5+
[![Release](https://img.shields.io/github/release/emberstack/docker-azure-pipelines-agent.svg?style=flat-square)](https://github.com/emberstack/docker-azure-pipelines-agent/releases/latest)
6+
[![GitHub Tag](https://img.shields.io/github/tag/emberstack/docker-azure-pipelines-agent.svg?style=flat-square)](https://github.com/emberstack/docker-azure-pipelines-agent/releases/latest)
7+
[![Docker Image](https://images.microbadger.com/badges/image/emberstack/azure-pipelines-agent.svg)](https://microbadger.com/images/emberstack/azure-pipelines-agent)
8+
[![Docker Version](https://images.microbadger.com/badges/version/emberstack/azure-pipelines-agent.svg)](https://microbadger.com/images/emberstack/azure-pipelines-agent)
9+
[![Docker Pulls](https://img.shields.io/docker/pulls/emberstack/azure-pipelines-agent.svg?style=flat-square)](https://hub.docker.com/r/emberstack/azure-pipelines-agent)
10+
[![Docker Stars](https://img.shields.io/docker/stars/emberstack/azure-pipelines-agent.svg?style=flat-square)](https://hub.docker.com/r/remberstack/azure-pipelines-agent)
11+
[![license](https://img.shields.io/github/license/emberstack/docker-azure-pipelines-agent.svg?style=flat-square)](LICENSE)
12+
13+
14+
> Supports `amd64`, `arm`
15+
16+
17+
## Deployment
18+
19+
The Azure Pipeliens agent can be deployed either manually or using Helm (recommended).
20+
21+
#### Deployment using Helm
22+
23+
Use Helm to install the latest released chart:
24+
```shellsession
25+
$ helm repo add emberstack https://emberstack.github.io/helm-charts
26+
$ helm repo update
27+
$ helm upgrade --install azure-pipelines-agent emberstack/azure-pipelines-agent
28+
```
29+
30+
You can customize the values of the helm deployment by using the following Values:
31+
32+
| Parameter | Description | Default |
33+
| ------------------------------------ | ----------------------------------------------------------- | ------------------------------------------------------- |
34+
| `nameOverride` | Overrides release name | `""` |
35+
| `fullnameOverride` | Overrides release fullname | `""` |
36+
| `image.repository` | Container image repository | `emberstack/azure-pipelines-agent` |
37+
| `image.tag` | Container image tag | `""` (same version as the chart) |
38+
| `image.pullPolicy` | Container image pull policy | `Always` if `image.tag` is `latest`, else `IfNotPresent`|
39+
| `pipelines.url` | The Azure base URL for your organization | `""` |
40+
| `pipelines.pat` | Personal Access Token (PAT) used by the agent to connect. | `""` |
41+
| `pipelines.pool` | Agent pool to which the Agent should register. | `""` |
42+
| `pipelines.agent.mountDocker` | Enable to mount the host `docker.sock` | `false` |
43+
| `pipelines.agent.workDir` | The work directory the agent should use | `_work` |
44+
| `serviceAccount.create` | Create ServiceAccount | `true` |
45+
| `serviceAccount.name` | ServiceAccount name | _release name_ |
46+
| `serviceAccount.clusterAdmin` | Sets the service account as a cluster admin | _release name_ |
47+
| `resources` | Resource limits | `{}` |
48+
| `nodeSelector` | Node labels for pod assignment | `{}` |
49+
| `tolerations` | Toleration labels for pod assignment | `[]` |
50+
| `affinity` | Node affinity for pod assignment | `{}` |
51+
52+
> Find us on [Helm Hub](https://hub.helm.sh/charts/emberstack)
53+

azure-pipelines.yaml

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
name: $(version).$(Rev:r)
2+
3+
variables:
4+
version: 1.0
5+
buildConfiguration: "Release"
6+
imageRepository: "emberstack/azure-pipelines-agent"
7+
DOCKER_CLI_EXPERIMENTAL: 'enabled'
8+
9+
trigger:
10+
branches:
11+
include:
12+
- "*"
13+
14+
stages:
15+
16+
- stage: build
17+
displayName: "Build"
18+
jobs:
19+
20+
- job: build_helm
21+
displayName: "Helm"
22+
pool:
23+
vmImage: "Ubuntu-16.04"
24+
steps:
25+
26+
- script: |
27+
mkdir -p artifacts/helm
28+
mkdir -p artifacts/kubectl
29+
workingDirectory: '$(Build.ArtifactStagingDirectory)'
30+
displayName: 'Create Artifacts directories'
31+
32+
- task: HelmInstaller@1
33+
inputs:
34+
helmVersionToInstall: 'latest'
35+
36+
# - script: 'helm lint'
37+
# workingDirectory: helm/azure-pipelines-agent
38+
# displayName: 'helm lint'
39+
40+
- script: |
41+
helm package --destination $(Build.ArtifactStagingDirectory)/artifacts/helm --version $(Build.BuildNumber) --app-version 1.0.3 helm/azure-pipelines-agent
42+
mkdir -p artifacts/kubectl
43+
displayName: 'Create Artifacts directories'
44+
45+
- publish: '$(Build.ArtifactStagingDirectory)/artifacts/helm'
46+
artifact: 'helm'
47+
48+
49+
50+
- job: build_docker_amd64
51+
displayName: "Docker amd64"
52+
pool:
53+
vmImage: "Ubuntu-16.04"
54+
steps:
55+
56+
- task: DockerInstaller@0
57+
displayName: 'Install docker'
58+
inputs:
59+
dockerVersion: '19.03.5'
60+
61+
- task: Docker@2
62+
displayName: 'Build amd64 image'
63+
inputs:
64+
containerRegistry: 'Emberstack Docker Hub'
65+
repository: $(imageRepository)
66+
Dockerfile: docker/Dockerfile
67+
command: build
68+
buildContext: docker
69+
tags: 'build-$(Build.BuildNumber)-amd64'
70+
71+
- task: Docker@2
72+
displayName: "Push image"
73+
inputs:
74+
containerRegistry: "Emberstack Docker Hub"
75+
repository: $(imageRepository)
76+
command: push
77+
tags: |
78+
build-$(Build.BuildNumber)-amd64
79+
80+
81+
82+
- job: build_docker_arm32
83+
displayName: "Docker arm32"
84+
pool:
85+
name: winromulus
86+
demands:
87+
- Agent.OSArchitecture -equals ARM
88+
steps:
89+
90+
- script: |
91+
apt-get update
92+
apt-get install \
93+
apt-transport-https \
94+
ca-certificates \
95+
curl \
96+
gnupg2 \
97+
software-properties-common
98+
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
99+
add-apt-repository \
100+
"deb [arch=amd64] https://download.docker.com/linux/debian \
101+
$(lsb_release -cs) \
102+
stable"
103+
apt-get update
104+
apt-get install docker-ce docker-ce-cli containerd.io
105+
displayName: 'Install docker'
106+
107+
- task: Docker@2
108+
displayName: 'Build arm32 image'
109+
inputs:
110+
containerRegistry: 'Emberstack Docker Hub'
111+
repository: $(imageRepository)
112+
Dockerfile: docker/Dockerfile
113+
command: build
114+
buildContext: docker
115+
tags: 'build-$(Build.BuildNumber)-arm32'
116+
117+
- task: Docker@2
118+
displayName: "Push image"
119+
inputs:
120+
containerRegistry: "Emberstack Docker Hub"
121+
repository: $(imageRepository)
122+
command: push
123+
tags: |
124+
build-$(Build.BuildNumber)-arm32
125+
126+
127+
128+
- job: build_docker_multiarch
129+
displayName: "Docker multiarch"
130+
pool:
131+
vmImage: "Ubuntu-16.04"
132+
dependsOn:
133+
- build_docker_amd64
134+
- build_docker_arm32
135+
steps:
136+
137+
- task: DockerInstaller@0
138+
displayName: 'Install docker'
139+
inputs:
140+
dockerVersion: '19.03.5'
141+
142+
- task: Docker@2
143+
displayName: "Docker Hub Login"
144+
inputs:
145+
containerRegistry: "Emberstack Docker Hub"
146+
command: login
147+
148+
- task: Docker@2
149+
displayName: "Docker Hub Login"
150+
inputs:
151+
containerRegistry: "Emberstack Docker Hub"
152+
command: login
153+
154+
- script: |
155+
docker manifest create $(imageRepository):build-$(Build.BuildNumber) $(imageRepository):build-$(Build.BuildNumber)-amd64 $(imageRepository):build-$(Build.BuildNumber)-arm32
156+
docker manifest inspect $(imageRepository):build-$(Build.BuildNumber)
157+
docker manifest push $(imageRepository):build-$(Build.BuildNumber)
158+
displayName: "Create and push multi-arch manifest"
159+
160+
161+
162+
163+
- stage: release
164+
displayName: "Release"
165+
dependsOn: 'build'
166+
condition: and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'Manual'), in(variables['Build.SourceBranchName'], 'master'))
167+
jobs:
168+
- job: release
169+
displayName: "Release Job"
170+
pool:
171+
vmImage: "Ubuntu-16.04"
172+
variables:
173+
- group: "OpenSource.GitHub"
174+
steps:
175+
176+
- checkout: none
177+
178+
- download: current
179+
artifact: 'helm'
180+
181+
- task: Docker@2
182+
displayName: "Docker Login"
183+
inputs:
184+
containerRegistry: "Emberstack Docker Hub"
185+
command: login
186+
187+
- task: HelmInstaller@1
188+
inputs:
189+
helmVersionToInstall: 'latest'
190+
191+
- script: |
192+
docker pull $(imageRepository):build-$(Build.BuildNumber)-amd64
193+
docker pull $(imageRepository):build-$(Build.BuildNumber)-arm32
194+
docker manifest create $(imageRepository):release-$(Build.BuildNumber) $(imageRepository):build-$(Build.BuildNumber)-amd64 $(imageRepository):build-$(Build.BuildNumber)-arm32
195+
docker manifest create $(imageRepository):latest $(imageRepository):build-$(Build.BuildNumber)-amd64 $(imageRepository):build-$(Build.BuildNumber)-arm32
196+
docker manifest push $(imageRepository):release-$(Build.BuildNumber)
197+
docker manifest push $(imageRepository):latest
198+
displayName: 'docker pull, tag and push'
199+
200+
- script: |
201+
git config --global user.email "$(emberstack-agent-email)"
202+
git config --global user.name "$(emberstack-agent-name)"
203+
git clone https://$(emberstack-agent-username):$(emberstack-agent-pat)@github.com/EmberStack/helm-charts.git
204+
205+
mkdir -p helm-charts/charts
206+
cp $(Pipeline.Workspace)/helm/azure-pipelines-agent-$(Build.BuildNumber).tgz helm-charts/charts
207+
208+
cd helm-charts
209+
rm index.yaml
210+
helm repo index ./
211+
git add .
212+
git status
213+
git commit -m "Added azure-pipelines-agent-$(Build.BuildNumber).tgz"
214+
git push
215+
displayName: 'Add chart to GitHub repository'
216+
217+
- task: GitHubRelease@1
218+
displayName: 'GitHub release (create)'
219+
inputs:
220+
gitHubConnection: GitHub
221+
repositoryName: 'EmberStack/docker-azure-pipelines-agent'
222+
tagSource: userSpecifiedTag
223+
tag: 'v$(Build.BuildNumber)'
224+
title: 'Release v$(Build.BuildNumber)'
225+
releaseNotesSource: inline
226+
releaseNotes: 'The release process is automated.'
227+

docker/Dockerfile

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
FROM ubuntu:16.04
2+
3+
# To make it easier for build and release pipelines to run apt-get,
4+
# configure apt to not require confirmation (assume the -y argument by default)
5+
ENV DEBIAN_FRONTEND=noninteractive
6+
RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyes
7+
8+
RUN apt-get update \
9+
&& apt-get install -y --no-install-recommends \
10+
ca-certificates \
11+
curl \
12+
jq \
13+
git \
14+
iputils-ping \
15+
libcurl3 \
16+
libicu55 \
17+
libunwind8 \
18+
netcat \
19+
zip \
20+
unzip
21+
22+
WORKDIR /azp
23+
24+
COPY ./start.sh .
25+
RUN chmod +x start.sh
26+
27+
CMD ["./start.sh"]

0 commit comments

Comments
 (0)