1+ name : Build Search Index
2+
3+ on :
4+ schedule :
5+ # Run once a day
6+ - cron : ' 10 0 * * *'
7+ workflow_dispatch :
8+ inputs :
9+ noop :
10+ description : ' noop'
11+ required : false
12+ default : ' noop'
13+
14+ jobs :
15+ build :
16+ runs-on : ubuntu-latest
17+ outputs :
18+ run_update : ${{ steps.date_check.outputs.run_update }}
19+ steps :
20+ - uses : actions/checkout@v1
21+ - name : Setup node
22+ uses : actions/setup-node@v1
23+ with :
24+ node-version : 14
25+
26+ - name : Check commit date
27+ id : date_check
28+ run : |
29+ chmod +x ./search-server/commit-date-check.sh
30+ echo "$(./search-server/commit-date-check.sh)"
31+ echo "run_update=$(./search-server/commit-date-check.sh)" >> $GITHUB_ENV
32+
33+ - name : GH script check
34+ uses : actions/github-script@v2
35+ id : check
36+ with :
37+ script : |
38+ const { owner, repo } = context.repo
39+ const update = ${{ env.run_update == 'update' }}
40+ if (!update) {
41+ console.log('Cancelling ...');
42+ const run_id = "${{ github.run_id }}";
43+ await github.actions.cancelWorkflowRun({ owner, repo, run_id });
44+ return 'stop'
45+ } else {
46+ return 'build'
47+ }
48+ result-encoding : string
49+
50+ - name : Waiting for cancellation
51+ run : sleep 60
52+ if : steps.check.outputs.result == 'stop'
53+
54+ - name : Create search index
55+ run : |
56+ echo "TYPESENSE_API_KEY=${{ secrets.TYPESENSE_API_KEY }}" >> $GITHUB_ENV
57+ export TYPESENSE_API_KEY=${{ secrets.TYPESENSE_API_KEY }}
58+ mkdir -p ${GITHUB_WORKSPACE}/typesense-data
59+ cp ./search-server/typesense-server/Dockerfile ${GITHUB_WORKSPACE}/typesense-data/Dockerfile
60+ cp ./search-server/typesense-scraper/typesense-scraper-config.json typesense-scraper-config.json
61+ envsubst < "./search-server/typesense-scraper/typesense-scraper.env" > "typesense-scraper-updated.env"
62+ docker run -d -p 8108:8108 -v ${GITHUB_WORKSPACE}/typesense-data/data:/data typesense/typesense:0.21.0 --data-dir /data --api-key=${TYPESENSE_API_KEY} --enable-cors &
63+ sleep 5
64+ docker run -i --env-file typesense-scraper-updated.env -e "CONFIG=$(cat typesense-scraper-config.json | jq -r tostring)" typesense/docsearch-scraper
65+ curl 'http://172.17.0.2:8108/keys' -X POST -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" -H 'Content-Type: application/json' -d '{"value": "N4N8bF0XwyvzwCGwm3CKB0QcnwyWtygo","description": "Search only","actions": ["documents:search"],"collections":["*"]}'
66+
67+ - name : repository name fix
68+ run : echo "image_repository_name=docs-search" >> $GITHUB_ENV
69+
70+ - name : Configure AWS credentials
71+ uses : aws-actions/configure-aws-credentials@v1
72+ with :
73+ aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
74+ aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
75+ aws-region : ${{ secrets.AWS_REGION }}
76+
77+ - name : Login to Amazon ECR
78+ id : login_ecr
79+ uses : aws-actions/amazon-ecr-login@v1
80+
81+ - name : Build and push to ECR
82+ id : push_image_to_ecr
83+ uses : docker/build-push-action@v2.2.2
84+ with :
85+ file : ./typesense-data/Dockerfile
86+ context : ./typesense-data/
87+ push : true
88+ tags : ${{ steps.login_ecr.outputs.registry }}/${{ env.image_repository_name }}:latest
89+
90+ deploy_ecs :
91+ needs : build
92+ runs-on : ubuntu-20.04
93+ steps :
94+ - name : checkout
95+ uses : actions/checkout@v2
96+
97+ - name : Configure AWS credentials
98+ uses : aws-actions/configure-aws-credentials@v1
99+ with :
100+ aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
101+ aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
102+ aws-region : ${{ secrets.AWS_REGION }}
103+
104+ - name : Login to Amazon ECR
105+ id : login_ecr
106+ uses : aws-actions/amazon-ecr-login@v1
107+
108+ - name : Repository name fix and env values setup
109+ run : |
110+ echo "image_repository_name=docs-search" >> $GITHUB_ENV
111+ echo "domain=search.reference.servicestack.net" >> $GITHUB_ENV
112+ echo "letsencrypt_email=${{ secrets.LETSENCRYPT_EMAIL }}" >> $GITHUB_ENV
113+ echo "app_name=servicestack-docs-search" >> $GITHUB_ENV
114+ echo "cluster_name=default" >> $GITHUB_ENV
115+ echo "image_url=${{ steps.login_ecr.outputs.registry }}/docs-search:latest" >> $GITHUB_ENV
116+ echo "aws_region=${{ secrets.AWS_REGION }}" >> $GITHUB_ENV
117+ echo "typesense_api_key=${{ secrets.TYPESENSE_API_KEY }}" >> $GITHUB_ENV
118+
119+ - name : Populate task definition template
120+ uses : danielr1996/envsubst-action@1.0.0
121+ env :
122+ RELEASE_VERSION : latest
123+ APP_NAME : ${{ env.app_name }}
124+ IMAGE_URL : ${{ env.image_url }}
125+ HOST_DOMAIN : ${{ env.domain }}
126+ TYPESENSE_API_KEY : ${{ env.typesense_api_key }}
127+ LETSENCRYPT_EMAIL : ${{ env.letsencrypt_email }}
128+ AWS_REGION : ${{ env.aws_region }}
129+ CLUSTER_NAME : ${{ env.cluster_name }}
130+ with :
131+ input : search-server/typesense-server/typesense-task-def.json
132+ output : task-definition.json
133+
134+ - name : Create task definition if doesn't exist
135+ run : aws ecs describe-task-definition --task-definition ${{ env.app_name }} || aws ecs register-task-definition --cli-input-json file://task-definition.json
136+
137+ - name : Create ECS Service if not exists.
138+ run : aws ecs describe-services --cluster ${{ env.cluster_name }} --services ${{ env.app_name }} | jq '.services[0]' -e || aws ecs create-service --cluster ${{ env.cluster_name }} --service-name ${{ env.app_name }} --task-definition ${{ env.app_name }} --desired-count 1
139+
140+ - name : Deploy new revision of the task definition
141+ uses : aws-actions/amazon-ecs-deploy-task-definition@v1
142+ with :
143+ task-definition : task-definition.json
144+ service : ${{ env.app_name }}
145+ cluster : ${{ env.cluster_name }}
146+ force-new-deployment : true
0 commit comments