1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
# https://aka.ms/yaml
jobs:
- job: test
displayName: 'Lint & Test'
pool:
vmImage: 'Ubuntu-16.04'
steps:
- script: docker build -t pythondiscord/snekbox-base:latest -f docker/base.Dockerfile .
displayName: 'Build Base Image'
- script: |
docker build -t pythondiscord/snekbox-venv:dev -f docker/venv.Dockerfile --build-arg DEV=1 .
displayName: 'Build Development Image'
- script: |
docker run \
-td \
--name snekbox_test \
--privileged \
--network host \
-h pdsnk-dev \
-e PYTHONDONTWRITEBYTECODE=1 \
-e PIPENV_PIPFILE="/snekbox/Pipfile" \
-e ENV="${PWD}/scripts/.profile" \
-v "${PWD}":"${PWD}" \
-w "${PWD}"\
--entrypoint /bin/ash \
pythondiscord/snekbox-venv:dev
displayName: 'Start Container'
- script: |
docker exec snekbox_test /bin/ash -c \
'pipenv run lint --format junit-xml --output-file test-lint.xml'
displayName: 'Run Linter'
- task: PublishTestResults@2
condition: succeededOrFailed()
displayName: 'Publish Lint Results'
inputs:
testResultsFiles: '**/test-lint.xml'
testRunTitle: 'Lint Results'
- script: |
docker exec snekbox_test /bin/ash -c \
'pipenv run coverage run -m xmlrunner'
displayName: 'Run Unit Tests'
- task: PublishTestResults@2
condition: succeededOrFailed()
displayName: 'Publish Test Results'
inputs:
testResultsFiles: '**/TEST-*.xml'
testRunTitle: 'Test Results'
- script: |
docker exec snekbox_test /bin/ash -c \
'pipenv run coverage xml && pipenv run coverage html'
displayName: 'Generate Coverage Report'
- task: PublishCodeCoverageResults@1
displayName: 'Publish Coverage Results'
condition: succeededOrFailed()
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '**/coverage.xml'
reportDirectory: '**/htmlcov'
- job: build
displayName: 'Build'
dependsOn: test
variables:
BASE_CHANGED: true
VENV_CHANGED: true
steps:
- task: Docker@1
displayName: 'Login: Docker Hub'
inputs:
containerregistrytype: 'Container Registry'
dockerRegistryEndpoint: 'DockerHub'
command: 'login'
- script: |
REQUEST_URL="https://dev.azure.com/python-discord/${SYSTEM_TEAMPROJECTID}/_apis/build/builds?queryOrder=finishTimeDescending&resultFilter=succeeded&\$top=1&repositoryType=${BUILD_REPOSITORY_PROVIDER}&repositoryId=${BUILD_REPOSITORY_NAME}&branchName=${BUILD_SOURCEBRANCH}&api-version=5.0"
echo "Retrieving previous build's commit using $REQUEST_URL"
RESPONSE="$(curl -sSL "${REQUEST_URL}")"
if [[ $BUILD_REASON = "PullRequest" ]]; then
PREV_COMMIT="$(echo "${RESPONSE}" | grep -Po '"pr\.sourceSha"\s*:\s*"\K.*?[^\\](?="\s*[,}])')"
if [[ -z $PREV_COMMIT ]]; then
echo "Could not retrieve the previous build's commit. Falling back to the head of the target branch."
PREV_COMMIT="origin/$SYSTEM_PULLREQUEST_TARGETBRANCH"
fi
else
PREV_COMMIT="$(echo "${RESPONSE}" | grep -Po '"sourceVersion"\s*:\s*"\K.*?[^\\](?="\s*[,}])')"
fi
if [[ -n $PREV_COMMIT ]]; then
echo "Using $PREV_COMMIT to compare diffs."
if [[ -z "$(git diff $PREV_COMMIT -- docker/base.Dockerfile)" ]]; then
echo "No changes detected in docker/base.Dockerfile. The base image will not be built."
echo "##vso[task.setvariable variable=BASE_CHANGED]false"
fi
if [[ -z "$(git diff $PREV_COMMIT -- docker/venv.Dockerfile Pipfile*)" ]]; then
echo "No changes detected in docker/venv.Dockerfile or the Pipfiles. The venv image will not be built."
echo "##vso[task.setvariable variable=VENV_CHANGED]false"
fi
else
echo "No previous commit was retrieved. Either the previous build is too old and was deleted or the branch was empty before this build. All images will be built."
fi
displayName: 'Check Changed Files'
- script: docker build -t pythondiscord/snekbox-base:latest -f docker/base.Dockerfile .
displayName: 'Build Base Image'
condition: and(succeeded(), eq(variables.BASE_CHANGED, 'true'))
- script: docker build -t pythondiscord/snekbox-venv:latest -f docker/venv.Dockerfile .
displayName: 'Build Virtual Environment Image'
condition: and(succeeded(), or(eq(variables.BASE_CHANGED, 'true'), eq(variables.VENV_CHANGED, 'true')))
- script: docker build -t pythondiscord/snekbox:latest -f docker/Dockerfile .
displayName: 'Build Final Image'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
- script: docker push pythondiscord/snekbox-base:latest
displayName: 'Push Base Image to Dockerhub'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables.BASE_CHANGED, 'true'))
- script: docker push pythondiscord/snekbox-venv:latest
displayName: 'Push Virtual Environment Image to Dockerhub'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), or(eq(variables.BASE_CHANGED, 'true'), eq(variables.VENV_CHANGED, 'true')))
- script: docker push pythondiscord/snekbox:latest
displayName: 'Push Final Image to Dockerhub'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
|