trigger: - master resources: - repo: self variables: POSTGRES_DB: passbook POSTGRES_USER: passbook POSTGRES_PASSWORD: "EK-5jnKfjrGRm<77" stages: - stage: Lint jobs: - job: pylint pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev - task: CmdLine@2 inputs: script: pipenv run pylint passbook - job: black pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev - task: CmdLine@2 inputs: script: pipenv run black --check passbook - job: prospector pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev pipenv install --dev prospector --skip-lock - task: CmdLine@2 inputs: script: pipenv run prospector passbook - job: bandit pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev - task: CmdLine@2 inputs: script: pipenv run bandit -r passbook - job: pyright pool: vmImage: ubuntu-latest steps: - task: UseNode@1 inputs: version: '12.x' - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: CmdLine@2 inputs: script: npm install -g pyright - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev - task: CmdLine@2 inputs: script: pipenv run pyright - stage: Test jobs: - job: migrations pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: DockerCompose@0 displayName: Run services inputs: dockerComposeFile: 'scripts/ci.docker-compose.yml' action: 'Run services' buildImages: false - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev - task: CmdLine@2 inputs: script: pipenv run ./manage.py migrate - job: coverage_unittest pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: DockerCompose@0 displayName: Run services inputs: dockerComposeFile: 'scripts/ci.docker-compose.yml' action: 'Run services' buildImages: false - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev - task: CmdLine@2 displayName: Run full test suite inputs: script: | pipenv run coverage run ./manage.py test passbook mkdir output-unittest mv unittest.xml output-unittest/unittest.xml mv .coverage output-unittest/coverage - task: PublishPipelineArtifact@1 inputs: targetPath: 'output-unittest/' artifact: 'coverage-unittest' publishLocation: 'pipeline' - job: coverage_e2e pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: DockerCompose@0 displayName: Run services inputs: dockerComposeFile: 'scripts/ci.docker-compose.yml' action: 'Run services' buildImages: false - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev - task: DockerCompose@0 displayName: Run ChromeDriver inputs: dockerComposeFile: 'e2e/ci.docker-compose.yml' action: 'Run a specific service' serviceName: 'chrome' - task: CmdLine@2 displayName: Build static files for e2e inputs: script: | cd passbook/static/static yarn - task: CmdLine@2 displayName: Run full test suite inputs: script: pipenv run coverage run ./manage.py test e2e - task: CmdLine@2 displayName: Prepare unittests and coverage for upload inputs: script: | mkdir output-e2e mv unittest.xml output-e2e/unittest.xml mv .coverage output-e2e/coverage - task: PublishPipelineArtifact@1 condition: failed() displayName: Upload screenshots if selenium tests fail inputs: targetPath: 'selenium_screenshots/' artifact: 'selenium screenshots' publishLocation: 'pipeline' - task: PublishPipelineArtifact@1 inputs: targetPath: 'output-e2e/' artifact: 'coverage-e2e' publishLocation: 'pipeline' - stage: test_combine jobs: - job: test_coverage_combine pool: vmImage: 'ubuntu-latest' steps: - task: DownloadPipelineArtifact@2 inputs: buildType: 'current' artifactName: 'coverage-e2e' path: "coverage-e2e/" - task: DownloadPipelineArtifact@2 inputs: buildType: 'current' artifactName: 'coverage-unittest' path: "coverage-unittest/" - task: UsePythonVersion@0 inputs: versionSpec: '3.8' - task: CmdLine@2 inputs: script: | sudo pip install -U wheel pipenv pipenv install --dev find . pipenv run coverage combine coverage-e2e/coverage coverage-unittest/coverage pipenv run coverage xml pipenv run coverage html find . - task: PublishCodeCoverageResults@1 inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: 'coverage.xml' pathToSources: '$(System.DefaultWorkingDirectory)' - task: PublishTestResults@2 condition: succeededOrFailed() inputs: testResultsFormat: 'JUnit' testResultsFiles: | coverage-e2e/unittest.xml coverage-unittest/unittest.xml mergeTestResults: true - task: CmdLine@2 env: CODECOV_TOKEN: $(CODECOV_TOKEN) inputs: script: bash <(curl -s https://codecov.io/bash) - stage: Build jobs: - job: build_server pool: vmImage: 'ubuntu-latest' steps: - task: Docker@2 inputs: containerRegistry: 'dockerhub' repository: 'beryju/passbook' command: 'buildAndPush' Dockerfile: 'Dockerfile' tags: 'gh-$(Build.SourceBranchName)' - job: build_gatekeeper pool: vmImage: 'ubuntu-latest' steps: - task: Docker@2 inputs: containerRegistry: 'dockerhub' repository: 'beryju/passbook-gatekeeper' command: 'buildAndPush' Dockerfile: 'gatekeeper/Dockerfile' buildContext: 'gatekeeper/' tags: 'gh-$(Build.SourceBranchName)' - job: build_static pool: vmImage: 'ubuntu-latest' steps: - task: DockerCompose@0 displayName: Run services inputs: dockerComposeFile: 'scripts/ci.docker-compose.yml' action: 'Run services' buildImages: false - task: Docker@2 inputs: containerRegistry: 'dockerhub' repository: 'beryju/passbook-static' command: 'build' Dockerfile: 'static.Dockerfile' tags: 'gh-$(Build.SourceBranchName)' arguments: "--network=beryjupassbook_default" - task: Docker@2 inputs: containerRegistry: 'dockerhub' repository: 'beryju/passbook-static' command: 'push' tags: 'gh-$(Build.SourceBranchName)'