diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml index 1dda38e..33e795a 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/prod.yml @@ -1,21 +1,18 @@ -name: Build and Deploy in Production Server app_lapig_jobs +name: Build and Deploy in Server Lapig Jobs + on: push: branches: - main jobs: - build-and-deploy: + build: runs-on: ubuntu-latest - env: - REGISTRYSERVER: ${{secrets.REGISTRYPROD}} - SERVER_KNOWN: ${{secrets.SERVER_PROD_KNOWN}} - DOCKER_SERVER: ${{secrets.SERVER_PROD}} - SSH_SERVER: ${{secrets.SERVER_PROD_SSH}} - DOCKER_PATH: "prod" - - outputs: + + APPLICATION_NAME: ${{ steps.creat_env.outputs.APPLICATION_NAME }} + DOCKER_PATH: ${{ steps.creat_env.outputs.DOCKER_PATH }} + START_TIME: ${{ steps.creat_env.outputs.START_TIME }} LAST_COMMIT_HASH: ${{ steps.creat_env.outputs.LAST_COMMIT_HASH }} @@ -26,7 +23,7 @@ jobs: LAPIG_COMMIT_DATE: ${{ steps.creat_env.outputs.LAPIG_COMMIT_DATE }} CREATE_STATUS: ${{steps.deploy_container.outputs.CREATE_STATUS}} - DELETE_STATUS: ${{steps.deploy_container.outputs.DELETE_STATUS}} + DELETE_STATUS: ${{steps.delete_container.outputs.DELETE_STATUS}} START_STATUS: ${{steps.start_container.outputs.START_STATUS}} @@ -39,12 +36,14 @@ jobs: id: creat_env run: | echo "START_TIME=$(date -u +%s)" >> "$GITHUB_OUTPUT" - + echo "DOCKER_PATH=prod" >> $GITHUB_ENV + echo "DOCKER_PATH=prod" >> $GITHUB_OUTPUT repo_full_name=$GITHUB_REPOSITORY repo_name=${repo_full_name##*/} echo "Nome do repositório: $repo_name" echo "application_name=app_lapig_jobs" >> $GITHUB_ENV + echo "APPLICATION_NAME=app_lapig_jobs" >> $GITHUB_OUTPUT echo "LAST_COMMIT_HASH=$(git log --pretty=format:%h -n 1)" >> $GITHUB_ENV @@ -70,67 +69,71 @@ jobs: - name: Build Server and client run: | npm set progress=false - cd ${{ github.workspace }} - npm install - + cd ${{ github.workspace }}/src/server && npm install + cd ${{ github.workspace }}/src/client && npm install + npm install -g @angular/cli@12.2.16 + cd ${{ github.workspace }}/src/client && ng build --stats-json --source-map=false --no-progress - name: Build Docker run: | - docker build -t $REGISTRYSERVER/$application_name:${LAST_COMMIT_HASH} -t $REGISTRYSERVER/$application_name:latest -f docker/$DOCKER_PATH/Dockerfile . --no-cache - + docker build -t lapig/$application_name:${DOCKER_PATH}_${LAST_COMMIT_HASH} -t lapig/$application_name:${DOCKER_PATH}_latest -f docker/$DOCKER_PATH/Dockerfile . --no-cache - name: Login to Docker Registry - run: echo "${{ secrets.HARBOR_PASS }}" | docker login -u "${{ secrets.HARBOR_USER }}" --password-stdin "${{ secrets.URL_PRIVATE_REGISTRY }}" + run: echo "${{ secrets.DOCKERHUB_PASS }}" | docker login -u "lapig" --password-stdin - name: Push Image to Registry run: | - docker push $REGISTRYSERVER/$application_name:${LAST_COMMIT_HASH} - docker push $REGISTRYSERVER/$application_name:latest + docker push lapig/$application_name:${DOCKER_PATH}_${LAST_COMMIT_HASH} + docker push lapig/$application_name:${DOCKER_PATH}_latest - name: Remove image locally run: | - docker rmi $REGISTRYSERVER/$application_name:${LAST_COMMIT_HASH} - docker rmi $REGISTRYSERVER/$application_name:latest - - - - name: Add SSH key to known_hosts + docker rmi lapig/$application_name:${DOCKER_PATH}_${LAST_COMMIT_HASH} + docker rmi lapig/$application_name:${DOCKER_PATH}_latest + + deploy: + needs: build + runs-on: self-hosted + + steps: + - name: Load env run: | - mkdir -p ~/.ssh - ssh-keyscan -t rsa $SERVER_KNOWN >> ~/.ssh/known_hosts 2>/dev/null - chmod 644 ~/.ssh/known_hosts - echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa + echo "application_name=${{needs.build.outputs.APPLICATION_NAME}}" >> $GITHUB_ENV + echo "DOCKER_PATH=${{needs.build.outputs.DOCKER_PATH}}" >> $GITHUB_ENV - name: Pull Image on Server run: | - ssh $SSH_SERVER "docker pull $REGISTRYSERVER/$application_name:latest" + docker pull lapig/$application_name:${DOCKER_PATH}_latest - - - name: Deploy Container - id: deploy_container + - name: Delete Container + id: delete_container + continue-on-error: true run: | - delete_status=$(ssh $SSH_SERVER "curl -v -X DELETE -w "%{http_code}" http://$DOCKER_SERVER/containers/$application_name?force=true 2>/dev/null") - create_status=$(ssh $SSH_SERVER "curl -v -X POST -H 'Content-Type: application/json' -d @${{secrets.CONFIG_FILES}}$application_name.json -s -o /dev/null -w "%{http_code}" http://$DOCKER_SERVER/containers/create?name=$application_name 2>/dev/null") + delete_status=$(curl -v -X DELETE -w "%{http_code}" http://$DOCKER_HOST/containers/$application_name?force=true 2>/dev/null) case $delete_status in 204) delete_status_text="OK";; *) delete_status_text="ERROR";; esac + echo "del $delete_status" + echo "DELETE_STATUS=$delete_status_text" >> "$GITHUB_OUTPUT" + + + - name: Deploy Container + id: deploy_container + run: | + create_status=$(curl -v -X POST -H 'Content-Type: application/json' -d @/compose/$application_name.json -s -o /dev/null -w "%{http_code}" http://$DOCKER_HOST/containers/create?name=$application_name 2>/dev/null) case $create_status in 201) create_status_text="OK";; *) create_status_text="ERROR";; esac - - echo "del $delete_status" echo "creat $create_status" - echo "CREATE_STATUS=$create_status_text" >> "$GITHUB_OUTPUT" - echo "DELETE_STATUS=$delete_status_text" >> "$GITHUB_OUTPUT" - name: Start Container id: start_container run: | - start_status=$(ssh $SSH_SERVER "curl -v -X POST -s -o /dev/null -w "%{http_code}" http://$DOCKER_SERVER/containers/$application_name/start 2>/dev/null") + start_status=$(curl -v -X POST -s -o /dev/null -w "%{http_code}" http://$DOCKER_HOST/containers/$application_name/start 2>/dev/null) case $start_status in 204) start_status_text="OK";; *) start_status_text="ERROR";; @@ -142,28 +145,28 @@ jobs: post-deploy: runs-on: ubuntu-latest - needs: build-and-deploy - if: ${{ always() || needs.build-and-deploy.result == 'failure' }} + needs: deploy + if: ${{ always() || needs.build.result == 'failure' ||needs.deploy.result == 'failure' }} steps: - name: Load env run: | - echo "LAST_COMMIT_HASH=${{needs.build-and-deploy.outputs.LAST_COMMIT_HASH}}" >> $GITHUB_ENV + echo "LAST_COMMIT_HASH=${{needs.build.outputs.LAST_COMMIT_HASH}}" >> $GITHUB_ENV - echo "LAPIG_AUTHOR_NAME=${{needs.build-and-deploy.outputs.LAPIG_AUTHOR_NAME}}" >> $GITHUB_ENV - echo "LAPIG_AUTHOR_EMAIL=${{needs.build-and-deploy.outputs.LAPIG_AUTHOR_EMAIL}}" >> $GITHUB_ENV - echo "LAPIG_AUTHOR_DATE=${{needs.build-and-deploy.outputs.LAPIG_AUTHOR_DATE}}" >> $GITHUB_ENV - echo "LAPIG_PROJECT_NAME=${{needs.build-and-deploy.outputs.LAPIG_PROJECT_NAME}}" >> $GITHUB_ENV - echo "LAPIG_COMMIT_DATE=${{needs.build-and-deploy.outputs.LAPIG_COMMIT_DATE}}" >> $GITHUB_ENV - echo "CREATE_STATUS=${{needs.build-and-deploy.outputs.CREATE_STATUS}}" >> $GITHUB_ENV - echo "DELETE_STATUS=${{needs.build-and-deploy.outputs.DELETE_STATUS}}" >> $GITHUB_ENV - echo "START_STATUS=${{needs.build-and-deploy.outputs.START_STATUS}}" >> $GITHUB_ENV + echo "LAPIG_AUTHOR_NAME=${{needs.build.outputs.LAPIG_AUTHOR_NAME}}" >> $GITHUB_ENV + echo "LAPIG_AUTHOR_EMAIL=${{needs.build.outputs.LAPIG_AUTHOR_EMAIL}}" >> $GITHUB_ENV + echo "LAPIG_AUTHOR_DATE=${{needs.build.outputs.LAPIG_AUTHOR_DATE}}" >> $GITHUB_ENV + echo "LAPIG_PROJECT_NAME=${{needs.build.outputs.LAPIG_PROJECT_NAME}}" >> $GITHUB_ENV + echo "LAPIG_COMMIT_DATE=${{needs.build.outputs.LAPIG_COMMIT_DATE}}" >> $GITHUB_ENV + echo "CREATE_STATUS=${{needs.deploy.outputs.CREATE_STATUS}}" >> $GITHUB_ENV + echo "DELETE_STATUS=${{needs.deploy.outputs.DELETE_STATUS}}" >> $GITHUB_ENV + echo "START_STATUS=${{needs.deploy.outputs.START_STATUS}}" >> $GITHUB_ENV - name: Send message to Telegram run: | end_time=$(date -u +%s) echo "LAPIG_DURATION=$((end_time - $START_TIME))" >> $GITHUB_ENV curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_API_KEY }}/sendMessage" -d "chat_id=${{ secrets.CHAT_ID }}" -d "parse_mode=markdown" -d "text=*Project*: *${LAPIG_PROJECT_NAME}*\ - *Status:*${{ needs.build-and-deploy.result }}\ + *Status:*${{ needs.deploy.result }}\ *Branch*: ${LAPIG_BRANCH_NAME}\ *Author*: *${LAPIG_AUTHOR_NAME}*\ *Author_Email*: *${LAPIG_AUTHOR_EMAIL}*\ @@ -173,7 +176,7 @@ jobs: - name: creat message to Discord run: | - if [[ "${{ needs.build-and-deploy.result }}" == "success" && "$START_STATUS" == "OK" && "$DELETE_STATUS" == "OK" && "$CREATE_STATUS" == "OK" ]]; then + if [[ "${{ needs.deploy.result }}" == "success" && "$START_STATUS" == "OK" && "$DELETE_STATUS" == "OK" && "$CREATE_STATUS" == "OK" ]]; then echo "avatar_url=${{vars.LAPIG_SUCCESS}}" >> $GITHUB_ENV status_geral="Sucesso" else @@ -209,4 +212,4 @@ jobs: echo "{\"content\": \"$discordTitle\", \"embeds\": [ { \"title\": \"$discordTitle\", \"description\": \"$discordDesc\", \"footer\": { \"text\": \"$discordFooter\" }, \"thumbnail\": { \"url\":\"$avatar_url\"} }, $EMBEDS_STATUS] ], \"username\": \"GitHub Actions\", \"avatar_url\": \"$avatar_url\" }" curl -H "Content-Type: application/json" -X POST -d "{\"content\": \"$discordTitle\", \"embeds\": [ $EMBEDS_STATUS { \"title\": \"$discordTitle\", \"description\": \"$discordDesc\", \"footer\": { \"text\": \"$discordFooter\" }, \"thumbnail\": { \"url\":\"$avatar_url\"} }], \"username\": \"GitHub Actions\", \"avatar_url\": \"$avatar_url\" }" https://discord.com/api/webhooks/${{ secrets.DISCORD_KEY }} - + \ No newline at end of file diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 1daf9b6..85d3934 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.lapig.iesa.ufg.br/lapig-images-prod/app_lapig_jobs:base +FROM lapig/app_lapig_jobs:base # Clone app and npm install on server ENV URL_TO_APPLICATION_GITHUB="https://github.com/lapig-ufg/lapig-jobs.git"