Skip to content

Feedback

Feedback #22160

Workflow file for this run

name: Build and test
on: [push, pull_request]
env:
COUCH_URL: http://admin:pass@localhost:5984/medic-test
BUILDS_SERVER: ${{ secrets.AUTH_MARKET_URL && '_couch/builds_testing' || '_couch/builds_external' }}
STAGING_SERVER: ${{ secrets.AUTH_MARKET_URL && '_couch/builds_4' || '_couch/builds_external' }}
MARKET_URL_READ: 'https://staging.dev.medicmobile.org'
MARKET_URL: ${{ secrets.AUTH_MARKET_URL || 'https://staging.dev.medicmobile.org' }}
INTERNAL_CONTRIBUTOR: ${{ secrets.AUTH_MARKET_URL && 'true' }}
DOCKERHUB_USERNAME: 'dockermedic'
ECR_REPO: '720541322708.dkr.ecr.eu-west-2.amazonaws.com/medic'
ECR_PUBLIC_REPO: 'public.ecr.aws/medic'
COUCHDB_LOG_LEVEL: 'debug'
TAG: ${{ (github.ref_type == 'tag' && github.ref_name) || '' }}
BRANCH: ${{ github.head_ref || github.ref_name }}
BUILD_NUMBER: ${{ github.run_id }}
NODE_VERSION: '20.11'
jobs:
build:
name: Compile the app
runs-on: ubuntu-22.04
timeout-minutes: 60
steps:
- name: Install bats
run: |
sudo apt-get update
sudo apt-get install -y bats
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ env.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
if: ${{ env.INTERNAL_CONTRIBUTOR }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
aws-region: eu-west-2
if: ${{ env.INTERNAL_CONTRIBUTOR }}
- name: Login to Amazon ECR
id: login-ecr
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: 'true'
- uses: actions/checkout@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Create logs directory
run: mkdir tests/logs
- run: npm ci
- name: Compile
run: npm run ci-compile
- name: Setup QEMU
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: docker/setup-qemu-action@v3
- name: Setup Buildx
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: docker/setup-buildx-action@v3
- name: Publish for testing
run: npm run publish-for-testing
- name: Upload docker images as artifacts
uses: actions/upload-artifact@v4
with:
name: cht-images
path: images/
if: ${{ !env.INTERNAL_CONTRIBUTOR }}
- name: Search-Replace PR Body
if: ${{ env.INTERNAL_CONTRIBUTOR && github.event_name == 'pull_request' }}
uses: ./.github/actions/update-staging-url-placeholders
with:
token: ${{ secrets.GITHUB_TOKEN }}
config-tests:
needs: build
name: ${{ matrix.cmd }}
runs-on: ubuntu-22.04
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
cmd: ['test-config-default']
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: sudo apt-get install -y xsltproc
- run: npm ci
- name: Run Tests
run: npm run ${{ matrix.cmd }}
test-cht-form:
needs: build
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: sudo apt-get install -y xsltproc
- run: npm ci
- name: Build cht-form Web Component
run: npm run build-cht-form
- name: Run Tests
run: npm run integration-cht-form
tests-k3d:
needs: build
name: ${{ matrix.cmd }}
runs-on: ubuntu-22.04
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
cmd: ['ci-integration-all-k3d', 'ci-integration-sentinel-k3d']
steps:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ env.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
if: ${{ env.INTERNAL_CONTRIBUTOR }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
aws-region: eu-west-2
if: ${{ env.INTERNAL_CONTRIBUTOR }}
- name: Login to Amazon ECR
id: login-ecr
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: 'true'
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- uses: actions/checkout@v4
- name: Download docker images artifacts
uses: actions/download-artifact@v4
with:
name: cht-images
path: images/
if: ${{ !env.INTERNAL_CONTRIBUTOR }}
- name: Load docker images
run: ls -1 *.tar | xargs --no-run-if-empty -L 1 docker load -i
working-directory: images/
if: ${{ !env.INTERNAL_CONTRIBUTOR }}
- run: mkdir tests/logs
- run: python -m pip install git+https://github.com/medic/[email protected]#egg=pyxform-medic
- run: npm install -g cht-conf
- run: npm ci
- uses: nolar/setup-k3d-k3s@v1
- uses: azure/[email protected]
- uses: azure/setup-kubectl@v4
- name: Run tests
run: npm run ${{ matrix.cmd }}
- name: Archive Results
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.cmd }}
path: |
allure-results
allure-report
tests/logs
tests/results/
if: ${{ failure() }}
translations:
needs: build
name: Lint translations
runs-on: ubuntu-22.04
strategy:
fail-fast: false
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: npm ci
- run: npm run lint-translations
tests:
needs: build
name: ${{ matrix.cmd }}-${{ matrix.suite || '' }}${{ matrix.chrome-version == '90' && '-minimum-browser' || '' }}
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CHROME_VERSION: ${{ matrix.chrome-version }}
JOB_NAME: ${{ matrix.cmd }}-${{ matrix.suite || '' }}${{ matrix.chrome-version == '90' && '-minimum-browser' || '' }}
strategy:
fail-fast: false
matrix:
cmd: ['ci-integration-all', 'ci-integration-sentinel', 'ci-webdriver-default-mobile']
chrome-version: ['90', 'latest']
suite: [all]
include:
- cmd: ci-webdriver-default
suite: core
chrome-version: 90
- cmd: ci-webdriver-default
suite: core
chrome-version: latest
- cmd: ci-webdriver-default
suite: data
- cmd: ci-webdriver-default
suite: enketo
chrome-version: 90
- cmd: ci-webdriver-default
suite: enketo
chrome-version: latest
- cmd: ci-webdriver-default
suite: lowLevel
- cmd: ci-webdriver-default
suite: workflows
exclude: # temporary until all suites run on Chrome 90
- cmd: ci-integration-all
chrome-version: 90
- cmd: ci-integration-sentinel
chrome-version: 90
- cmd: ci-webdriver-default-mobile
chrome-version: 90
steps:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ env.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
if: ${{ env.INTERNAL_CONTRIBUTOR }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
aws-region: eu-west-2
if: ${{ env.INTERNAL_CONTRIBUTOR }}
- name: Login to Amazon ECR
id: login-ecr
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: 'true'
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- uses: actions/checkout@v4
- name: Download docker images artifacts
uses: actions/download-artifact@v4
with:
name: cht-images
path: images/
if: ${{ !env.INTERNAL_CONTRIBUTOR }}
- name: Load docker images
run: ls -1 *.tar | xargs --no-run-if-empty -L 1 docker load -i
working-directory: images/
if: ${{ !env.INTERNAL_CONTRIBUTOR }}
- name: Create logs directory
run: mkdir tests/logs
- name: Install pyxform
run: python -m pip install git+https://github.com/medic/[email protected]#egg=pyxform-medic
- name: Install cht-conf
run: npm install -g cht-conf
- run: npm ci
- name: Fetch allure history
uses: actions/checkout@v4
with:
repository: 'medic/build-history-data'
path: 'build-history-data'
persist-credentials: false
- name: Copy allure history
run: |
mkdir -p allure-results/history
cp -r build-history-data/cht-core/allure/${{ env.JOB_NAME }}/allure-report/history allure-results | true
- name: Install Chrome 90
if: ${{matrix.chrome-version=='90'}}
run: |
wget -O "google-chrome-stable_current_amd64.deb" https://www.slimjet.com/chrome/download-chrome.php?file=files/90.0.4430.72/google-chrome-stable_current_amd64.deb
sudo dpkg -i "google-chrome-stable_current_amd64.deb"
npm install chromedriver@^90.0.1
- name: Run tests ${{ matrix.cmd }}-${{ matrix.suite }} on Chrome ${{ matrix.chrome-version }}
run: npm run ${{ matrix.cmd }} -- --suite=${{ matrix.suite }}
- name: Fetch allure history
if: always()
uses: actions/checkout@v4
with:
repository: 'medic/build-history-data'
path: 'build-history-data-new'
persist-credentials: false
- name: Copy new allure history
if: always()
run: |
mkdir -p build-history-data-new/cht-core/allure/${{ env.JOB_NAME }}/history
cp -r allure-report/history build-history-data-new/cht-core/allure/${{ env.JOB_NAME }}/allure-report | true
- name: Upload allure report history
if: always() && github.ref == 'refs/heads/master' # whether pass or fail, but only on master
continue-on-error: true # don't fail the build if git push fails
uses: actions-js/push@master
with:
github_token: ${{ secrets.BUILD_HISTORY_DATA_PUSH_TOKEN }}
directory: 'build-history-data-new'
repository: 'medic/build-history-data'
force: true
- name: Fetch report repo
if: always()
uses: actions/checkout@v4
with:
repository: 'medic/build-history'
path: 'build-history'
persist-credentials: false
- name: Copy new report
if: always()
run: |
mkdir -p build-history/cht-core/allure/${{ env.JOB_NAME }}
cp -r allure-report build-history/cht-core/allure/${{ env.JOB_NAME }} | true
- name: Upload allure report
if: always() && github.ref == 'refs/heads/master' # whether pass or fail, but only on master
continue-on-error: true # don't fail the build if git push fails
uses: actions-js/push@master
with:
github_token: ${{ secrets.BUILD_HISTORY_DATA_PUSH_TOKEN }}
directory: 'build-history'
repository: 'medic/build-history'
force: true
- name: Archive Results
uses: actions/upload-artifact@v4
with:
name: ${{ env.JOB_NAME }}
path: |
allure-results
allure-report
tests/logs
tests/results/
if: ${{ failure() }}
publish:
needs: [tests, config-tests, test-cht-form, translations]
name: Publish branch build
runs-on: ubuntu-22.04
timeout-minutes: 60
if: ${{ github.event_name != 'pull_request' }}
steps:
- name: Install regctl
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: regclient/actions/regctl-installer@main
- name: Configure AWS credentials
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
aws-region: eu-west-2
- name: Login to Amazon ECR
if: ${{ env.INTERNAL_CONTRIBUTOR }}
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: 'true'
- name: Configure AWS credentials Public
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Login to Public Amazon ECR
if: ${{ env.INTERNAL_CONTRIBUTOR }}
id: login-ecr-public
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public
mask-password: 'true'
- uses: actions/checkout@v4
- name: Publish
if: ${{ env.INTERNAL_CONTRIBUTOR }}
run: |
npm ci
cd scripts/ci
node ./publish.js
node ./tag-docker-images.js
publish-generated-docs:
needs: [publish]
name: Publish generated docs
runs-on: ubuntu-22.04
timeout-minutes: 5
if: ${{ github.event_name != 'pull_request' }}
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: npm ci
- name: Generate TypeDoc
run: npm run --prefix shared-libs/cht-datasource gen-docs
- name: Main Branch Only - Deploy to GH pages
uses: peaceiris/actions-gh-pages@v4
if: github.ref == 'refs/heads/master'
with:
personal_token: ${{ secrets.DEPLOY_TO_GITHUB_PAGES }}
external_repository: medic/cht-datasource
publish_dir: ./shared-libs/cht-datasource/docs
user_name: medic-ci
user_email: medic-ci@github
publish_branch: main
upgrade:
needs: [publish]
name: Upgrade from ${{ matrix.version }}
runs-on: ubuntu-22.04
timeout-minutes: 60
if: ${{ github.event_name != 'pull_request' }}
strategy:
fail-fast: false
matrix:
version: [ '4.2.4', 'latest' ]
steps:
- name: Configure AWS credentials Public
if: ${{ env.INTERNAL_CONTRIBUTOR }}
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Login to Public Amazon ECR
if: ${{ env.INTERNAL_CONTRIBUTOR }}
id: login-ecr-public
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public
mask-password: 'true'
- uses: actions/checkout@v4
- name: Set ENV
run: |
echo "BUILDS_SERVER=$STAGING_SERVER" >> $GITHUB_ENV
echo "BASE_VERSION=${{ matrix.version }}" >> $GITHUB_ENV
- run: npm ci
- name: Create logs directory
run: mkdir tests/logs
- name: Upgrade
if: ${{ env.INTERNAL_CONTRIBUTOR }}
run: npm run upgrade-wdio
- name: Archive Results
uses: actions/upload-artifact@v4
with:
name: upgrade-${{ matrix.version }}
path: |
allure-results
allure-report
tests/logs
tests/results/
if: ${{ failure() }}